1

オブジェクトを作成してから、変数の1つを値に設定しようとしています。

クラスヘッダー:

class Book {
public:
Book();
Book(string newSelection);
string getSelection();
string setSelection(string newSelection);

private:
string selection;
}

クラスcpp

Book::Book() {}

Book::Book(string newSelection) {
selection = newSelection;
}


string Book::getSelection(){
return selection;
}

string Book::setSelection(string newSelection){
selection = newSelection;
}

運転者

Book* book1 = new Book();
book1->setSelection("The Book Title");
cout << "Book selected:    " << book1->getSelection() << endl;

セグメンテーション違反が発生しましたが、理由がわかりません。誰かが私の問題がどこにあるのか指摘できますか?

4

2 に答える 2

2

setSelection()関数は文字列を返すものとして宣言されていますが、実際には文字列は返されていません。少なくともこれについては、コンパイルの警告が表示されるはずです。

これをデバッガーで実行すると、デストラクタsetSelection()の呼び出しに続いて、返された文字列で呼び出されることが起こっていると思います。この文字列は実際には存在しないためabort()、ランタイム内で発生します。

原則として、「セッター」は何も返さない傾向があるため、次のように記述されます。

void setSelection(const string& newSelection);

..。

void Book::setSelection(const string& newSelection)
{
    selection = newSelection;
}

また、文字列は、より効率的な値ではなく、const参照によって渡されることに注意してください。ただし、これが問題の原因になることはありません。

もう1つの提案は、オブジェクト内の何も変更しないため、「getter」がconstとして宣言されていることを確認することです。

string getSelection() const;

..。

string Book::getSelection() const
{
    return selection;
}
于 2012-08-08T16:34:39.970 に答える
1

このsetSelectionメソッドは文字列を返すものとして定義されていますが、何も返していません。おそらく、returnステートメントを追加する(またはvoidに変更する)と、次のように修正されます。

string Book::setSelection(string newSelection){
  selection = newSelection;
  return selection;
}
于 2012-08-08T16:34:07.513 に答える