此类标记以下错误:'非静态const成员'const int成员:: membershipNo',不能使用默认赋值运算符'.奇怪的是这个代码在另一个项目中重复并完美运行.你能帮我把它搞定吗?
Member.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;
}
};
Run Code Online (Sandbox Code Playgroud)
Member.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;
}
Run Code Online (Sandbox Code Playgroud)
据推测,在您的代码中的某个位置,您将分配给a Member,类似这样的内容:
Member m1, m2;
m1 = m2;
Run Code Online (Sandbox Code Playgroud)
或者您在需要可分配类型的上下文中使用它.
由于您没有提供自己的赋值运算符重载Member,因此隐式定义的默认赋值运算符通常会启动.但是,由于您有const数据成员,编译器不会为您隐式定义一个.你需要自己提供.
这是有道理的,因为想象中的代码示例我只是给在,什么都要编译器做m1的membershipNo成员?如果其分配m2的membershipNo呢?它是如何能做到这一点,如果membershipNo是const?在这种情况下,编译器只是说"不,我不能这样做".
X如果X具有以下内容,则将类的默认复制/移动赋值运算符定义为已删除:
- 非
const类型(或其数组)的非静态数据成员- [...]
正如我所说,为了能够使用a进行赋值Member,您需要提供自己的赋值运算符:
Member& Member::operator=(const Member& other)
{
// Copy things from other to this
}
Run Code Online (Sandbox Code Playgroud)
然而,这里存在const成员的问题.如果您按照描述提供自己的复制赋值操作符,并且不复制membershipNo,那么您是否真的复制了另一个对象?从逻辑上讲,有意义的是,任何const状态的对象都不应该被分配.
然而,使用复制构造函数是完全正确的 - 您只需要确保membershipNo在成员初始化列表中初始化:
Member::Member(const Member& other)
: membershipNo(other.membershipNo)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
Member m1;
Member m2 = m1;
Run Code Online (Sandbox Code Playgroud)