7

此类标记以下错误:'非静态 const 成员'const int Member::membershipNo',不能使用默认赋值运算符'。奇怪的是这段代码在另一个项目中重复并且完美运行。你能帮我把它改正吗?

会员.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

大概,在你的代码中的某个地方你分配给 a Member,像这样:

Member m1, m2;
m1 = m2;

或者您在需要类型可分配的上下文中使用它。

由于您没有为 提供自己的赋值运算符重载Member,因此通常会使用隐式定义的默认赋值运算符。但是,由于您有一个const数据成员,编译器不会为您隐式定义一个。您需要自己提供。

这是有道理的,因为想象一下我刚刚给出的代码示例,编译器应该对m1membershipNo成员做什么?它应该分配给它吗m2?如果是membershipNo,它怎么能做到这一点?在这种情况下,编译器只会说“不,我做不到”。membershipNoconst

如果具有以下条件,则类的默认复制/移动赋值运算符X定义为已删除X

  • const非类类型(或其数组)的非静态数据成员
  • [...]

正如我所说,为了能够使用 a 进行赋值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

正在发生的事情是一些客户端代码试图使用将一个Member实例分配给另一个实例。由于您有一个常量数据成员,因此这是行不通的。仅当某些代码尝试进行分配时才会出现该错误,这就是为什么在另一个项目中看起来同一个类“有效”的原因。

就正确而言,选项是 A) 不执行赋值,或 B) 使数据成员非 const。

于 2013-02-22T18:40:27.430 回答