2017-09-08 4 views
2

これらのコードスニペットはかなり短いですが、constキーワードで何が欠けているのか分かりません。私は、関数定義の後のconstを入れたときに私の最初のスニペットでは、それだけで何かを返すことはconstキーワード失格と言う:const定義のオブジェクトを返すとconstキーワードが不適格になるのはなぜですか?

string & getText() const { 
    return txt; 
} 

jdoodle.cpp: In member function 'std::__cxx11::string& Document::getText() const': jdoodle.cpp:29:16: error: binding 'const string {aka const std::__cxx11::basic_string}' to reference of type 'std::__cxx11::string& {aka std::__cxx11::basic_string&}' discards qualifiers return txt; ^

そして第二に、私は単純に返す置きます。これを返す代わりに*これ。私はconstキーワードの違反で終わる。

File & operator = (const File & a) { 
    this->drive = a.drive; 
    this->folder = a.folder; 
    this->fileName = a.fileName; 
    this->txt = a.txt; 
    this->fullPath = a.fullPath; 
    return a; 
} 

jdoodle.cpp: In member function 'File& File::operator=(const File&)': jdoodle.cpp:117:16: error: binding 'const File' to reference of type 'File&' discards qualifiers return a; ^

と(私は今のような実際のミューテータに入れたときに、それが違反エラーがスローされます - 私はちょうどメンバ変数を入れたときとは違って)最後に、第三:

File & File::operator = (File & a) { 
    this->getDrive() = a.getDrive(); 
    this->getFolder() = a.getFolder(); 
    this->getFileName() = a.getFileName(); 
    this->getText() = a.getText(); 
    this->fileName = a.fileName; 
    return a; 
} 
+3

* const-correctness *と呼ばれています。 constから暗黙的に非constに行くことはできません。 – NathanOliver

答えて

1

代入演算子として作成する場合は、you probably want to return *this

これで、ゲッター関数の廃棄修飾子についてはまだエラーが出ています。

代理演算子でメンバーを直接使用するようにアドバイスしても、コードを修正する方法は次のとおりです。

あなたのゲッター関数は次のようになります。

string& getText() { 
    return txt; 
} 

あなたはconstのオブジェクトのための追加オーバーロードを提供する必要があります:

const string& getText() const { 
    return txt; 
} 

ここでの違いは、そのthis、およびすべてのメンバーでありますconst修飾された関数ではconstです。より多くのconstであるその文字列への参照を返したいので、const参照を返す必要があります。

constとnon-constバージョンを提供することで、ゲッターから返されたオブジェクトを変更することができます。追加のオーバーロードがあると、可変ではないゲッターが変更不可能なオブジェクトで動作します。

+0

私はそれをやろうとしましたが、それは間違いなく実行されました。しかし、変更のR/L値の互換性をテストするために、私は ドキュメントbを実行しました。 b.getText()= a.getText()。 const修飾子を破棄するのと同じエラーが発生しました。 –

+0

@ RaymondIacobacci実際には、getterで割り当てることは、ゲッターのポイントを壊します。アクセサーを提供することを怠った場合は、セッターも提供する必要があります。また、あなたは関数をoveloadedしていないようだ。ゲッターを使って代入したい場合は、constバージョン*と*非constバージョンを指定する必要があります。 –

+0

@RaymondIacobacci私の編集を参照してください。 –

関連する問題