我正在尝试利用抽象模板基类。
编译器在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/

10-09 13:36