1

これが問題です。この関数は、メンバー ベクトルの i 要素への参照を返すように記述したため、この要素を編集できます。コードは次のとおりです。

Letter& Literal::get (int i) const {

   return lit_m.at (i); //Vector of Letter objects
}

しかし、g++ では、その要素を const 以外の参照に割り当てることはできません。

g++ -o literal.o -c literal.cpp
literal.cpp: In member function ‘Letter& Literal::get(int) const’:
literal.cpp:34: error: invalid initialization of reference of type ‘Letter&’ from expression of type ‘const Letter’

どうすれば解決できますか?私の考えは、ベクトルの at() 関数のような関数を構築することです。そのため、オブジェクト自体を編集しないので const になりますが、返されたオブジェクトを編集できるようにする必要があります...可能ですか?

解決済み:関数をオーバーロードする必要があった :) ので、const バージョンと非 const バージョンを宣言します。const と非 const のオーバーロードが許可されていないのではないかと心配していましたが、その const が引数リストを変更し、それを可能にすることがわかりました。

4

3 に答える 3

5

問題はこのメンバー関数です:

Letter& get (int i) const

あなたはそれをconsと宣言しました、そしてそのため、

const T& at() const

vector クラスのメンバー関数が呼び出され、i 番目の項目への const 参照が返されるため、変更できません。

その要素を本当に変更する必要がある場合は、get() 関数を const として宣言せず、現在行っているように要素への参照を返します。

ところで、関数 const を宣言しましたが、非 const 参照を返しています。

于 2010-10-20T15:39:55.423 に答える
2

これがエラーを生成する非常に正当な理由があります。クラスのオブジェクトは、その状態を保持するために定数である必要があります。内部変数の1つへの参照を返すと、誰かがその内部変数の値を変更できるようになり、オブジェクトの状態が変更されて、定数関数ではなくなります。

可能性のあることは、LiteralクラスにLetterオブジェクトではなくLetterオブジェクトへのポインターのベクトルが含まれている場合、問題なくそれらのLetterオブジェクトの1つにポンターを正常に返すことができるということです。

Letter* Literal::get (int i) const {
   return lit_m.at (i); //Vector of pointers to Letter objects  
} 

おそらく、ポインターを扱うすべての人が読むべき記事(または、constキーワードを許可する任意の言語ですが、ポインターが含まれている場合は10倍以上)はここにあります。正直なところ、私はおそらくそれを自分でもう一度見直す必要があります。

于 2010-10-20T15:44:04.130 に答える
0

それは const 正しくありません。クラス (ベクトル) のメンバー変数を変更しているため、g++ はこれをエラーと見なしています。メソッドを const として宣言し、メンバー変数を返す場合、返される値がinspectionnotに使用されることが期待されmutationます。

于 2010-10-20T15:40:13.583 に答える