0

代入演算子をメンバー関数としてオーバーロードして、文字列を引数として取り、その値をA現在のオブジェクトであるに割り当てようとしています。以下のコメントにエラーを投稿しました。

誰かが私が間違っていることを教えてもらえますか?私はそれがパラメータ、そしておそらく定義内のコードと関係があると思います。

正しく宣言したかどうかはわかりませんが、次のように宣言しました。

WORD operator=(const string& other);

そして私はそれを次のように定義しました:

WORD WORD::operator=(const string& other) //<---not sure if I did the parameters Correctly
{
(*this) = other;
return (*this);
}

それが役立つ場合は、ファイル全体を次に示します。

#include <iostream>

using namespace std;

#pragma once

class alpha_numeric //node
{
   public:
char symbol; //data in node
alpha_numeric *next;//points to next node
};

class WORD
{
   public:
      WORD() : front(0) {length=0;}; //front of list initially set to Null
      WORD(const WORD& other);
      bool IsEmpty();
      int Length();
      void Insert(WORD bword, int position);
      WORD operator=(const string& other); 

   private:
      alpha_numeric *front; //points to the front node of a list
      int length;
};

WORD WORD::operator=(const string& other) //<---not sure if I did the parameters Correctly
{
      (*this) = other;
      return (*this);
}
4

2 に答える 2

1

エラーメッセージはリンカからのものです。同じ関数の複数の定義が見つかったことを示しています。これは、複数のソースファイルにインクルードされているヘッダーファイルで関数を定義したため、関数の定義が複数になってしまったためです。

于 2012-06-01T00:27:49.817 に答える
1

OK 2つのこと:

まず、コピーコンストラクターの定義が欠落しているため、コンパイルされていません。クラス内でこれを試してください(部分的な実装のみが示されています):

WORD(const WORD& other)
: length(other.length)
{
    // Construct me !
}

第二に、代入演算子は正しいですが、すべての制御パスで再帰的です。たとえば、それは無期限に自分自身を呼び出します。メソッド内でメンバーを割り当てたいと思うかもしれません(ここでも、部分的な実装のみが示されています)。

WORD WORD::operator=(const string& other)
{
    // Only copy the length, the rest is to be filled
    this.length = other.length;
    return (*this);
}

最後に、他の人が指摘しているように、実行可能ファイル内には同じシンボルの複数の定義があります。これを修正するには、ヘッダーが1回だけインクルードされていることを確認する必要があります(#pragmaは一度だけそれを処理する必要があります)が、すべての実装の詳細をヘッダーファイルからソースファイルに移動します。たとえば、WORD WORD :: operator =(const string&other)の定義をCPPファイルに移動します。

于 2012-06-01T00:19:25.727 に答える