C++ 抽象基础模板 Class 非 Void 方法
C++ Abstract Base Template Class Non-Void Method
我有一个包含成员函数的抽象基础模板 class,其中一些是 void,其他 returning 数据类型范围从原始数据类型到模板参数数据类型。我还是 C++ 的新手,我知道我不一定要在基础 class 中实现纯虚函数,除非我希望在派生的 class 中调用它们。这个想法适用于没有 return 值的成员函数。对于一个 returned 一个整数的函数,我 returned 一个 0。但是当我得到一个 returned 对模板参数 T 的引用的函数时,我不知道该怎么办。我尝试了以下两个 returns.
template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}
和
template <typename T>
T& AbstractBaseClass<T>::function(){
return T& tmp= T();
}
但这两个似乎都不起作用,我不能不定义这些函数,因为我得到了函数的未定义引用错误。我假设这个错误是因为函数是模板。实现非void纯虚函数的合适方式是什么?
template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}
template <typename T>
T& AbstractBaseClass<T>::function(){
//what must I do here when I don't have any member variable
}
这里是一个纯虚函数和实现它的派生 class 的示例(为清楚起见省略了一些成员函数):
template <class T>
class Base
{
public:
virtual T& get() = 0;
virtual ~Base() = 0;
};
template <class T>
Base<T>::~Base() {}
template <class T>
class Derived: public Base<T>
{
T t;
public:
T& get() override { return t; }
};
请注意 Base
中的 get()
没有实现,Derived
中的 get
的实现使用了 Base
中不可用的新数据成员.
另请注意,纯虚 析构函数 与其他纯虚函数不同, 必须 具有实现。但是,如果 class 中还有其他纯函数,通常不需要纯虚拟析构函数。此处显示是为了说明。
我有一个包含成员函数的抽象基础模板 class,其中一些是 void,其他 returning 数据类型范围从原始数据类型到模板参数数据类型。我还是 C++ 的新手,我知道我不一定要在基础 class 中实现纯虚函数,除非我希望在派生的 class 中调用它们。这个想法适用于没有 return 值的成员函数。对于一个 returned 一个整数的函数,我 returned 一个 0。但是当我得到一个 returned 对模板参数 T 的引用的函数时,我不知道该怎么办。我尝试了以下两个 returns.
template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}
和
template <typename T>
T& AbstractBaseClass<T>::function(){
return T& tmp= T();
}
但这两个似乎都不起作用,我不能不定义这些函数,因为我得到了函数的未定义引用错误。我假设这个错误是因为函数是模板。实现非void纯虚函数的合适方式是什么?
template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}
template <typename T>
T& AbstractBaseClass<T>::function(){
//what must I do here when I don't have any member variable
}
这里是一个纯虚函数和实现它的派生 class 的示例(为清楚起见省略了一些成员函数):
template <class T>
class Base
{
public:
virtual T& get() = 0;
virtual ~Base() = 0;
};
template <class T>
Base<T>::~Base() {}
template <class T>
class Derived: public Base<T>
{
T t;
public:
T& get() override { return t; }
};
请注意 Base
中的 get()
没有实现,Derived
中的 get
的实现使用了 Base
中不可用的新数据成员.
另请注意,纯虚 析构函数 与其他纯虚函数不同, 必须 具有实现。但是,如果 class 中还有其他纯函数,通常不需要纯虚拟析构函数。此处显示是为了说明。