gpt4 book ai didi

c++ - 如何将 "normal"C++ 类转换为模板?

转载 作者:行者123 更新时间:2023-11-28 07:45:06 24 4
gpt4 key购买 nike

我正在尝试将一个类从“普通”类转换为模板类,但我不理解正确的语法。下面是我开始的一个(大大简化的)示例。这是 Visual Studio 2010,C++,针对 x64 架构,Windows 7。

目标是将类 T 重写为模板以处理 TEntry 或新类 OtherTEntry,它在概念上类似于 TEntry,具有相同的成员函数,但具有不同的数据成员。

我很感激关于如何最好地做到这一点的建议。如果可能的话,我想将头文件和实现文件分开。我特别关注对局部变量 T * 的引用,以及如何正确使用 sizeof()。

在文件 T.h 中:

class T
{
T(void);
T(G *pGIn, const unsigned long s, char nIn);
~T(void);

// Member functions
public:
bool Expand(const unsigned long newS);
void Empty(void);

private:
G *pG;
char n;
unsigned long s;
int f;
TEntry *p;
};

在文件 TEntry.h 中:

class TEntry
{
// Constructors
public:
TEntry();
TEntry(int l);

// Member functions
public:
void Relocate(int delta);

private:

// Data members
int k;
TEntry *p;
};

在文件 T.cpp 中:

T::T()
{
p=NULL; s=0; pG=NULL;
Empty();
return;
}

T::T(G *pGIn, const unsigned long m, char nIn)
{
pG=pG; n=nIn;
return;
}

T::~T(void)
{
if(p!=NULL)
delete[] p;
return;
}

bool T::Expand(const unsigned long newS)
{
T *pBefore=p;
p=(T *)_realloc_dbg(p, newS*sizeof(T), _NORMAL_BLOCK,__FILE__,__LINE__);
s=newS;
return p!=NULL;
}

void T::Empty()
{
f=0;
return;
}

在文件 TEntry.cpp 中:

T::T()
{
}

T::T(int i)
{
k=i;
}

void T::Relocate(int delta)
{
k+=delta;
return;
}

最佳答案

最简单的方法是从 T 的一个完整的、可工作的、非模板版本开始,它是根据您稍后想要在模板中使用的类型之一编写的(显而易见的选择此处:TEntry)。

一旦你有了一个有效的实现,你就可以将它转换成一个模板。

  1. 为您的模板参数选择一个名称。类型参数的通常名称是 T,但该名称已在您的项目中使用,因此我将使用 U
  2. T 中出现的所有 TEntry 替换为模板参数的名称 (U)
  3. 将模板头添加到T的类定义中:

    template <class U>
    class T {
    //...
  4. 将模板头添加到在类定义之外定义的每个 T 成员:

    template <class U>
    «return type» T<U>::«member specification» //...
  5. 确保所有模板代码都在头文件中(直接或间接通过 #include 指令。模板不支持单独编译头文件和源代码。

关于c++ - 如何将 "normal"C++ 类转换为模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com