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&)"、参照元:
Vectorin main.o の vtable
"Element::Element()"、参照元:
Vector::Vector()in main.o
Vector::Vector( double const&、double const&、double const&) in main.o
"Element::minus(Element const&)"、参照元:
Vectorin main.o の vtable
"typeinfo for Element"、参照元:
Vectorin main.o
ld の typeinfo:シンボルが見つかりません
collect2: ld が 1 つの終了ステータスを返しました

これは、派生したテンプレート クラスが基本クラスと同じファイルに格納されておらず、それがコンパイラの問題を引き起こしているためでしょうか (ヘッダー ファイルで Vector クラス全体を定義しなければならなかったのと同様です)?

私は C++ にかなり慣れていないので、まだ vtables とは何か、どのように機能するのかを読んでいますが、まだこれを理解することはできません。

4

3 に答える 3

3

よく理解できれば、抽象的な「Element」を持ち、「Element」から「Vector」を導出したいということです。その場合は、"Element" コンストラクターを削除し、宣言の最後に "= 0" を追加して、"plus" と "minus" を純粋仮想として宣言する必要があります。ただし、デストラクタは問題ありません。

エラー メッセージは以上です。Element でコンストラクターといくつかのメソッドを宣言し、最終的にそれらを呼び出すと、リンカーはそれらを探します。

ただし、Vector クラスでは、抽象要素ではなく、Vector に「プラス」と「マイナス」を実装する必要があると感じています。この方法では、静的キャストは必要ありません。また、戻り値の型をスライスする大きなリスクを伴う苦痛の世界を回避できます。

于 2010-06-20T17:00:05.370 に答える
1

これは本当に とは何の関係もありませんVector。やのようなメソッドを宣言しますが、おそらく のどこかに定義する必要があります。それを行ってもまだこのエラーが発生する場合は、Element.o を実行可能ファイルにリンクしていないことをほぼ確実に意味するため、リンカはいつ何を入れればよいか (または他の何か)を認識していません。これらのメソッドを呼び出します。virtual Element& plus(const Element&)Element::Element()Element.hElement.ccVector

于 2010-06-20T16:58:57.093 に答える
1

コンパイラ/リンカーは、それがあなたに言うときそれを意味すると思いますUndefined symbols: "Element::plus(Element const&)". これらの記号 (要素のプラスとマイナス) は宣言されていますが、定義されていません。

于 2010-06-20T17:01:15.883 に答える