C++中自定义部分拷贝构造方案的优化建议问询
类设计中的部分拷贝构造方案探讨
编辑说明:本文介绍一个设计欠佳的类,这是个旧问题,如今我已经成长为更成熟的程序员...
假设有一个包含若干状态的类,其中某个方法仅使用部分状态,示例如下:
#include <thread> #include <chrono> class MyClass { public: MyClass(double _1, double _2, double _3) : data1(_1) , data2(_2) , data3(_3) {} void only_uses_data1() { for (int i = 0; i < data1; ++i) std::this_thread::sleep_for(std::chrono::seconds(1)); data1 = 0; // 修改状态 } auto time_the_method() const // 不可修改实例 { MyClass copy = *this; auto t1 = std::chrono::high_resolution_clock::now(); copy.only_uses_data1(); auto t2 = std::chrono::high_resolution_clock::now(); return t2 - t1; } private: double data1, data2, data3; };
请谅解这个粗糙的示例,time_the_method同样仅需使用data1,因此我当时想创建一个仅复制所需成员的实例,于是设计了如下方案:
// 在MyClass定义内 private: explicit MyClass(const MyClass& other, int) // 接收哑元int : data1(other.data1) // 复制必要数据 {} // 使用方式 MyClass copy(*this, 0);
我当时称其为“自定义拷贝构造函数”(这个名称曾引发一些争议),通过添加哑元参数改变构造函数签名。此外,哑元参数未来可替换为enum class,以便在编译时通过模板指定所需的部分拷贝构造逻辑。
这个想法源于前置/后置自增运算符的重载方式:
MyClass operator++(int); // 后置自增 MyClass& operator++(); // 前置自增
通过修改签名,编译器可区分调用的版本。
我也意识到该技术更适用于运算符重载而非构造函数重载,因此寻求对该方案的改进建议。
我明白出现此类需求可能意味着类设计欠佳、状态过多,需要重构,但探索次优方案也有助于理解最优方案的优势...
内容的提问来源于stack exchange,提问作者ugo_capeto
相关产品推荐
相关产品推荐

