You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:07:28