【发布时间】:2016-03-10 00:09:46
【问题描述】:
我正在尝试使用抽象模板基类。
编译器在 RowArray.cpp 中给出了成员 rowPntr 和 rowSize “未在此范围内声明”的错误。两者都是抽象类 AbsRow 的受保护成员。我猜这种设计是不可能的,因为它利用了在运行时动态绑定的虚函数,但同时使用了在编译时绑定的模板。也许将两者混合是问题?我想知道我的设计是否可行,为什么会出现这些编译器错误?我也确实忘记提及,在创建 RowArray 对象RowArray<int> obj(5); 时,我在 Visual Studio 和 Qt 创建器中收到链接错误 2019,它告诉我未定义对 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);
}
【问题讨论】:
-
this->rowPntr和this->rowSize有帮助吗? -
我曾想过,但没有费心去尝试,因为我说服自己这不是问题所在。我羞愧地摇头。
-
这是一个奇怪的现象,通常不需要,但有时会在模板类中发挥作用,请参阅重复的问题。
-
这是另一个duplicate