0

私は本の練習をしています。クラス (Golf という名前) があり、その関数の 1 つがコンストラクターにデータを渡して一時オブジェクトを作成し、その一時オブジェクトを呼び出し元のオブジェクト (*this) に割り当てる必要があります。コードは次のとおりです。

Golf::Golf(const std::string name, int hc)
{
    fullname = name;
    handicap = hc;
}

int Golf::setgolf()
{
    std::string name;
    std::cout << "Enter the name: ";
    std::getline(std::cin, name);
    std::cin.clear();
    std::cin.sync();
    if (name == "")
        return 0;
    else
    {
            int handicap;
            std::cout << "Enter the handicap: ";
            std::cin >> handicap;
            *this = Golf(fullname, handicap); //this line doesn't set the values
            return 1;
    }
}

しかし、うまくいきません。私はインターネット上で解決策を見つけていません。どうすればいいですか?

4

3 に答える 3

1

*this割り当ての実行可能な目的地になるためのいくつかの前提条件があります。

  1. メンバー関数を にすることはできませんconst
  2. 割り当てオペラト (適切に置き換えられ... operator=(Golf ...)...) は削除されません。
  3. 生成された割り当てまたは明示的に定義された割り当てのいずれかが正しいことを行います。

多くの場合、デフォルトの代入演算子は問題ありません。メンバーごとの代入を行います。たとえば、リソースを維持する必要がある場合 (つまり、コピー コンストラクタとデストラクタもある場合) には、独自のバージョンが必要になる場合があります。代入演算子のもう 1 つの理由は、代入を厳密に例外セーフにする必要があることですが、メンバー代入の 1 つが例外をスローする可能性があります (たとえば、それが astd::stringまたは aの場合) std::vector<T>

于 2013-09-11T12:54:29.377 に答える
1
*this = Golf(fullname, handicap);

これは、入力から読み取られたばかりの名前からではなくfullname、現在のオブジェクトのfullnameフィールドから一時的なものを初期化します。あなたはおそらく欲しい:

*this = Golf(name, handicap);

または、ローカル変数の名前を変更してメンバーを非表示にすることもできますが、そのようなことを認めない人もいます。

于 2013-09-11T13:28:31.093 に答える