编写Orbit类拷贝构造函数遇const限定符错误,求解决方案
这个编译错误的根源是const对象的成员函数调用权限问题,咱们一步步拆解清楚:
错误原因分析
你的拷贝构造函数里,toCopy是const Orbit&类型的常量引用——这意味着编译器会严格保证toCopy对象不会被修改。但你调用的getStart()成员函数并没有被声明为const,非const成员函数默认允许修改对象状态,所以编译器会拒绝让const对象调用它,避免潜在的修改风险,这就是错误提示里“discards qualifiers”的核心含义。
另外还要提个小笔误:你的getStart()函数里返回的是start,但类的私有成员是m_start,这个也得修正,不然即使解决了const问题,还会报未定义标识符的错误。
两种解决方案
方案1:修正getStart()的const正确性(推荐)
既然getStart()只是返回成员变量的引用,不会修改对象,那应该把它声明为const成员函数,这是C++里的最佳实践,能保证const对象也能正常调用它。修改类定义里的函数:
class Orbit { private: vector<int> m_start; public: // ... const vector<int>& getStart() const { return m_start; } // 加const修饰,修正返回变量名 };
这样拷贝构造函数里的调用就完全合法了,同时也让你的类接口更健壮、符合const正确性原则。
方案2:直接访问私有成员(不破坏封装)
拷贝构造函数是类的成员函数,有权限访问同类对象的私有成员,所以可以跳过getStart(),直接赋值:
Orbit::Orbit(const Orbit& toCopy) { m_start = toCopy.m_start; }
这种方式也能解决问题,但不如方案1理想——因为它没有修复getStart()的const缺陷,后续其他地方如果用const对象调用getStart()还是会触发同样的错误。
额外提一句:其实你甚至可以不用手动写拷贝构造函数。编译器会自动生成一个默认的拷贝构造函数,它会逐个拷贝类的成员变量(比如这里的m_start是vector,会自动完成深拷贝),完全能满足你的需求。除非你有自定义的拷贝逻辑,否则没必要手动实现。
内容的提问来源于stack exchange,提问作者Trotom

