3

我的基类:

//Element.h
class Element
{
public:
Element();
virtual ~Element(){}; // not sure if I need this

virtual Element& plus(const Element&);
virtual Element& minus(const Element&);
};

派生模板类:

//Vector.h
#include "Element.h"

template <class T>
class Vector: public Element {
T x, y, z;

public:
//constructors
Vector();
Vector(const T& x, const T& y = 0, const T& z =0);
Vector(const Vector& u);
...     
//operations
Element& plus(const Element&) const;
Element& minus(const Element&) const;
...
};
...

//summation
template <class T>
Element& Vector<T>::plus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);  
Vector<T>* ret = new Vector<T>((x + w.x), (y + w.y), (z + w.z));
return *ret;
}

//difference
template <class T>
Element& Vector<T>::minus(const Element& v) const
{
const Vector<T>& w = static_cast<const Vector<T>&>(v);
Vector<T>* ret = new Vector<T>((x - w.x), (y - w.y), (z - w.z));
return *ret;
}

我对这段代码有另一个问题(在另一篇文章中回答),但目前我正在努力解决这样一个事实,即如果我尝试运行它,我会得到

未定义符号:“Element::plus(Element const&)”,引用自:
vtable for Vectorin main.o
“Element::Element()”,引用自:
Vector::Vector()in main.o
Vector::Vector( double const&, double const&, double const&)in main.o
"Element::minus(Element const&)",引用自:
vtable for Vectorin main.o
"typeinfo for Element",引用自:
typeinfo for Vectorin main.o
ld:未找到符号
collect2:ld 返回 1 个退出状态

这是因为派生的模板类与基类不在同一个文件中,这会导致编译器问题(类似于我必须在头文件中定义整个 Vector 类)?

我对 C++ 还很陌生,仍在阅读什么是 vtable 以及它们是如何工作的,但我还不能完全弄清楚这一点。

4

3 回答 3

3

如果我理解得很好,您想要一个抽象的“元素”,并从“元素”派生“向量”。在这种情况下,您应该删除“Element”构造函数,并通过在声明末尾添加“= 0”将“plus”和“minus”声明为纯虚拟。不过,您的析构函数很好。

这就是错误消息的全部内容:当您在 Element 中声明构造函数和一些方法时,最终调用它们时,链接器会查找它们。

我有一种感觉,您希望您的 Vector 类在 Vector 上实现“加号”和“减号”,而不是在抽象元素上实现。这样,您就不需要静态演员表。您还可以避免一个痛苦的世界,因为您的回报类型存在巨大的风险。

于 2010-06-20T17:00:05.370 回答
1

这真的无关Vector。您声明virtual Element& plus(const Element&)Element::Element()in之类的方法Element.h,但您必须在某个地方定义它们,大概是 in Element.cc。如果你已经这样做了,但仍然出现这个错误,这几乎可以肯定意味着你没有将 Element.o 链接到你的可执行文件中,所以链接器根本不知道在什么时候Vector(或其他任何东西)放入什么调用这些方法。

于 2010-06-20T16:58:57.093 回答
1

我认为编译器/链接器在告诉您时意味着它Undefined symbols: "Element::plus(Element const&)"。这些符号(元素的加号和减号)已声明但尚未定义。

于 2010-06-20T17:01:15.883 回答