我正在尝试利用抽象模板基类。
编译器在RowArray.cpp中给出错误:成员rowPntr和rowSize未在此范围内声明。两者都是抽象类AbsRow的受保护成员。我猜想这种设计是不可能的,因为它利用了在运行时动态绑定的虚函数,但是同时使用了在编译时绑定的模板。也许将两者混在一起是问题吗?我想知道我的设计是否可行,为什么会出现这些编译器错误?我确实也没有忘记提及,当创建RowArray对象RowArray<int> obj(5);
时,我在Visual Studio中遇到链接错误2019,在Qt Creator中它告诉我对RowArray构造函数和析构函数的不确定性。
抽象类AbsRow.h
template <typename T>
class AbsRow
{
public:
virtual int getSize()const = 0;
virtual T getValue(int index)const = 0;
protected:
T *rowPntr;
int rowSize;
};
派生类RowArray.h
#include "absrow.h"
template <class T>
class RowArray : public AbsRow<T>
{
public:
RowArray(const int rows);
virtual ~RowArray();
virtual T getValue(int index) const override;
virtual int getSize() const override;
void setValue(int row, int value);
};
RowArray.cpp
#include "rowarray.h"
#include <cstdlib>
template <class T>
RowArray<T>::RowArray(const int rows)
{
rowSize = rows;
rowPntr = new int[rows];
for(int index = 0; index < rows; index++)
{
rowPntr[index] = (rand() % 90) + 10;
}
}
template <class T>
RowArray<T>::~RowArray()
{
delete [] rowPntr;
}
template <class T>
void RowArray<T>::setValue(int row, int value)
{
rowPntr[row] = value;
}
template <class T>
int RowArray<T>::getSize() const
{
return rowSize;
}
template <class T>
T RowArray<T>::getValue(int index) const
{
return rowPntr[index];
}
主要
#include "rowarray.h"
int main()
{
RowArray<int> row(7);
}
最佳答案
您基本上可以通过两种方式解决该问题……以RowArray.cpp的简化示例为例(我还修复了new
表达式中的问题)
template <class T>
RowArray<T>::RowArray(const int rows)
{
AbsRow<T>::rowSize = rows
// or
//this->rowSize = rows;
AbsRow<T>::rowPntr = new T[rows]; ///Corrected 'int' to 'T' because rowPntr is of type 'T*' in your AbsRow class
// or
//this->rowPntr = new T[rows];
for(int index = 0; index < rows; index++)
{
AbsRow<T>::rowPntr[index] = (rand() % 90) + 10;
// or
//this->rowPntr[index] = (rand() % 90) + 10;
}
}
关于c++ - C++抽象模板类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35905191/