7

このクラスは次のエラーにフラグを立てています: '非静的 const メンバー 'const int Member::membershipNo', can't use default assignment operator'. 奇妙なことに、このコードは別のプロジェクトで繰り返され、完全に機能します。正しく言うのを手伝ってもらえますか?

メンバー.h

class Member : public Person
    {
    public:
        Member();
        Member(int membershipNo);
        virtual ~Member();

        int getMembershipNo() const;

    private:
        const int membershipNo;

        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive& ar, const unsigned int version)
        {
            ar & boost::serialization::base_object<Person>(*this);
            ar & membershipNo;
        }

    };

メンバー.cpp

Member::Member() : membershipNo(0)
{
    Person();
}

Member::Member(int memberNo) : membershipNo(memberNo)
{
    Person();
}

Member::~Member()
{
    // TODO Auto-generated destructor stub
}

int Member::getMembershipNo() const
{
    return membershipNo;
}
4

2 に答える 2

9

おそらく、コードのどこかでMember、次のように a に割り当てています。

Member m1, m2;
m1 = m2;

または、型を割り当て可能にする必要があるコンテキストで使用しています。

に対して独自の代入演算子オーバーロードを提供しないため、Member通常、暗黙的に定義されたデフォルトの代入演算子が有効になります。ただし、constデータ メンバーがあるため、コンパイラは暗黙的に 1 つを定義しません。自分で用意する必要があります。

これは理にかなっています。先ほど示したコード サンプルで、コンパイラがm1membershipNoメンバーに対して何をすべきかを想像してみてください。を割り当てる必要がありm2ますmembershipNoか?である場合、どのようにそれを行うことができmembershipNoますconstか?この場合、コンパイラは「いいえ、できません」と言うだけです。

クラスのデフォルトのコピー/移動代入演算子Xは、次の場合に削除済みとして定義されXます。

  • const非クラス型 (またはその配列)の非静的データ メンバー
  • [...]

私が言ったように、で代入を行うにMemberは、独自の代入演算子を提供する必要があります:

Member& Member::operator=(const Member& other)
{
  // Copy things from other to this
}

constしかし、ここにメンバーを持つことの問題があります。説明されているように独自のコピー代入演算子を提供し、 をコピーしないmembershipNo場合、他のオブジェクトを本当にコピーしたことになりますか? const論理的には、状態を持たないオブジェクトに割り当てられるべきではないというのは理にかなっています。

membershipNoただし、コピー コンストラクターを使用してもまったく問題ありません。メンバーの初期化リストで初期化する必要があるだけです。

Member::Member(const Member& other)
  : membershipNo(other.membershipNo)
{
  // ...
}

そして、次のことができます。

Member m1;
Member m2 = m1;
于 2013-02-22T18:41:47.713 に答える
3

何が起こっているかというと、一部のクライアント コードが 1 つのMemberインスタンスを別のインスタンスに割り当てようとしているということです。定数データ メンバーがあるため、これは機能しません。エラーは、一部のコードが割り当てを試みた場合にのみ発生します。そのため、別のプロジェクトで同じクラスが「機能する」ように見える場合があります。

正しく言えば、オプションは、A) 割り当てを実行しないか、B) データ メンバーを非定数にするかです。

于 2013-02-22T18:40:27.430 に答える