0

C++アプリケーションで2つのクラスを使用しています。コードは次のとおりです。

class MyMessageBox
{
public:
    void sendMessage(Message *msg, User *recvr);
    Message receiveMessage();
    list<Message> dataMessageList;
};

class User
{
public:
    MyMessageBox *dataMsgBox;
};

msgは、Messageクラスの派生クラスオブジェクトへのポインタです。次のように関数sendMessageを実装しました。

void MyMessageBox::sendMessage(Message *msg, User *recvr)
{
    Message &msgRef = *msg;
    recvr->dataMsgBox->dataMessageList.push_back(msgRef);
}

このコードをコンパイルすると、次のエラーが発生します。「vtableforMessage」への未定義の参照。この問題を解決するために私を助けてください。

ありがとう、Rakesh。

4

5 に答える 5

4

そのmsgRefで何をしようとしているのかわかりませんが、間違っています。たまたま、あなたは元Javaプログラマーですか?

Messageがの導関数の基本クラスである場合Message、ポインタをリストに格納する必要があります。に変更list<Message>list<Message*>ます。コードを完全に削除して、にpush_back(msgRef)なるはずです。push_back(msg)msgRef

->また、スタイルの問題として、多くの演算子をチェーン化することはお勧めできません。Userこの場合Message、独自のリストにを追加してそれを呼び出すメソッドをonに実装することをお勧めします。

于 2010-01-26T11:48:54.313 に答える
1

まず、ポリモーフィック オブジェクトを標準 C++ コンテナーに格納する場合は、基本クラスのオブジェクトではなく、オブジェクトへのポインターを格納する必要があります。そうしないと、オブジェクトのスライスの問題が発生します。また、リソースのリークを防ぐために、ポインターをスマート ポインターでラップしてください。boost::shared_ptr<> をお勧めします。

Message のコードを示していないことを考えると、何が問題なのかを推測することしかできません。vtable を参照しているため、次の可能性があります。

  • Message のクラス メンバを として宣言していませんvirtual。デストラクタから始めるのは良い考えです
  • Message のコンパイル済みコードを含むオブジェクト ファイルにリンクするのを忘れました

ちなみに、追加の参照を作成するsendMessage()必要はなく、IMHO は読みやすさにはまったく役立ちません。push_back() への呼び出しで msg ポインターを逆参照するだけです。

于 2010-01-26T11:55:04.820 に答える
0

これは、メッセージクラスのコンストラクターを実装していないことを示唆する、少し不自然なエラーメッセージだと思います。ここここでSOを見てください...

オブジェクトのリストへのポインタを渡そうとしていることを考えると、コンパイラはおそらく、に変換Message*する方法がないと不平を言っていMessageます。Message*Kylotanが提案するようにリストをリストに変更してみてください。

コンパイルエラーですか、それともリンクエラーですか?

于 2010-01-26T11:48:07.223 に答える
0

サブクラス化されたメッセージを処理する場合は、メッセージ オブジェクトではなくメッセージ ポインターのリストを使用し、それらの有効期間を管理する必要があります。便宜上、私はそれを作ることをお勧めします

list< boost::shared_ptr<Message> > datamessageList

ブーストライブラリを使用します。(気分を害するわけではありませんが、C++ とポインターについてもう少し読む必要があります。コンパイルされたものが得られるまで、コードのさまざまな順列を試したようです...)

于 2010-01-26T11:51:04.113 に答える
0

より良い解決策を提案している人もいます: std::queue または std::deque をチェックして、メッセージをキューに入れます。これで、次のことができます。

std::queue<std::tr1::shared_ptr<Message> > dataMessageQueue;
于 2010-01-26T12:03:35.847 に答える