1

クラスmyStringを作成し、次のコードを実行しようとしています。

class myString{
    char* str;
    int len;

public:
    myString(char* str1 = " "){
        len = strlen(str1);
        str = new char[len+1];
        strcpy(str, str1);
    };

    int getLen() const {
        return len;
    };

    char* getString() const {
        return str;
    };

    ~myString(){
        delete[] str;
    };

    myString& operator=(myString& orig){
        cout << "hello";
        if (str == NULL){
            delete[] str;
        };
        str = new char[orig.getLen()];
        strcpy(str, orig.getString());
        cout << this << endl;
        return *this;
    };

    ...
};



int main(){


    myString s("bla");
    myString k("dingo");
        myString g = s;
        // s=k;  //When this line is commented I get a linking error
         ...
   };

私の質問:

  1. なぜ「こんにちは」が印刷されないのですか?
  2. s=kその行がリンカーエラーを引き起こすのはなぜですか?

これはエラーです:

リンク:c:\ users \ perry \ document \ visual studio 2010 \ Projects \ inheritance \ Debug \ inheritance.exeが見つからないか、最後の増分リンクでビルドされていません。フルリンクの実行1>main.obj:エラーLNK2019:未解決の外部シンボル "class std :: basic_ostream>&__ cdecl operator <<(class std :: basic_ostream

&、class myString *) "(?? 6 @ YAAAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@@ std @@ AAV01 @ PAVmyString @@@ Z)関数" public:class myString&__ thiscall myString :: operator =(class myString&) "(?? 4myString @@ QAEAAV0 @ AAV0 @@ Z)1> c:\ users \ perry \ document \ visual studio 2010 \ Projects \ inheritance \ Debug \ inheritance.exe:致命的なエラーLNK1120:1つの未解決の外観

ありがとう、李

4

5 に答える 5

3

以下では、コピー コンストラクターが必要です。代入演算子関数は使用しません。

myString g = s;

編集

リンカ エラーについては、私はお手伝いできません。その行が何を呼び出しているかを推測するのでoperator<<はなく、コードを提供していないため、これをあきらめます。通常の C++ コードでは、simplecout << this;によってリンカ エラーが発生することはありません。coutこのためにa を受け入れる演算子がありますvoid const*。より適切な一致を提供する演算子をどこかで宣言しましたが、それを定義していません。

于 2010-09-03T21:05:00.537 に答える
1

リンクエラーは、定義していないことです

operator<<(class std::basic_ostream< >  &,class myString *)

ラインのせい

cout << this << endl;
于 2010-09-03T21:16:22.127 に答える
0

そうあるべきだと思う

operator=(const myString &orig)
于 2010-09-03T21:05:56.753 に答える
0
myString g = s;

これは operator= を呼び出しませんが、コピー コンストラクターを呼び出します。コピー コンストラクターを定義していないため、デフォルトのコンストラクターが生成され、すべてのフィールドがコピーされます。しかし、あなたはポインターを保持しています。そのため、コピー コンストラクターが必要です。

リンクエラーについて:

cout << this << endl;

では、これで使っoperator<<てみます。this の型は でmyString*、この演算子は定義されていません。this ポインターの値を出力したい場合は、次のように変換できます。

cout << (void*) this << endl;



 if (str == NULL){
                delete[] str;
            };

あなたはif (str != NULL)ここに欲しい(タイプミス?)。

于 2010-09-03T21:06:30.140 に答える
0

まずmyString g = s;、 new の初期化ですmyString。これは、コピー コンストラクターで行われます (作成していないため、自動的に提供されます)。

cout << this << endl;システムに を印刷する方法を伝えていないため、リンクエラーは行が原因であり、thisどうやら方法を考え出すことができません。

C++ には 3 つのルールがあります。コピー コンストラクター、代入演算子、またはデストラクターを作成する場合は、おそらく 3 つすべてを作成する必要があります。(例外は、基本クラスの仮想デストラクタを作成することです。)通常、クラスはいくつかのリソースを管理し(strあなたの場合)、3つのケースすべてでそれを処理する必要があります。

また、使えるconstときに使います。非const変数をconst参照に渡すことはできますが、その逆はできません。

デストラクタは問題ありません。代入演算子には署名が必要myString & operator=(const &myString)であり、コピー コンストラクターには署名が必要myString::myString(const &myString)です。

于 2010-09-03T21:19:11.137 に答える