如何修复C++中无法使用的拷贝构造函数简化写法?
问题原因与解决方法
问题出在Direction的拷贝构造函数参数定义上:它接受的是非const引用(Direction&),但Movement类中的d是const成员变量,所以在Movement的拷贝构造函数里,_M.d属于const Direction类型,无法绑定到非const引用的参数上,导致d(_M.d)这行代码编译失败。
要让注释掉的版本生效,只需要修改Direction的拷贝构造函数,将参数改为const Direction&,这样就能接受const对象的拷贝请求:
struct Direction { const double x, y, z; Direction(double _X, double _Y, double _Z) : x(_X), y(_Y), z(_Z) {} Direction(const Direction& _D) : x(_D.x), y(_D.y), z(_D.z) {} // 修改为const引用 }; // 注意结构体末尾加;,C++语法要求 class Movement { private: const double v; const Direction d; public: Movement(double _V, double _X, double _Y, double _Z) : v(_V), d(_X, _Y, _Z) {} Movement(double _V, Direction _D) : v(_V), d(_D) {} // 现在这个版本可以正常运行了 Movement(Movement& _M) : v(_M.v), d(_M.d) {} }; // 类末尾同样加;
额外说明:如果你的项目使用C++11及以上标准,其实可以完全省略手动编写Direction的拷贝构造函数——编译器会自动生成一个默认的拷贝构造函数,它的参数就是const Direction&,完全能满足你的需求,手动编写反而容易出现这类参数不匹配的问题。
内容的提问来源于stack exchange,提问作者Irimitlad
相关产品推荐
相关产品推荐

