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

基类持有的unique_ptr重复初始化问题及优化方案咨询

优化方案与替代设计

一、继承体系内的优化(排除传入构造参数/新增基类构造的方案)

如果必须保留继承关系,且不能修改基类构造参数或新增基类构造函数,可以采用延迟初始化+虚函数初始化逻辑的方式:

class Object { public: Object(std::string someString, ...); .... };

class Base
{
public:
  Base(int a) : value(a) {} // object默认初始化为nullptr,避免基类提前创建实例
  virtual ~Base() = default;

  // 定义虚函数用于初始化object,基类提供默认实现
  virtual void initializeObject() {
    object = std::make_unique<Object>("Base", ... );
  }
  ...
protected:
  int value;
  std::unique_ptr<Object> object;
};

class Derived : public Base
{
public:
  Derived(int a) : Base(a) {
    initializeObject(); // 调用派生类的初始化逻辑
  }

  // 重写初始化逻辑,创建Derived所需的Object实例
  void initializeObject() override {
    object = std::make_unique<Object>("Derived", ... );
  }
};

// 可选:用工厂函数确保初始化逻辑被调用
template<typename T>
std::unique_ptr<T> createInstance(int a) {
  auto instance = std::make_unique<T>(a);
  instance->initializeObject();
  return instance;
}

void fun() {
  auto d = createInstance<Derived>(42);
}

这种方式避免了基类和派生类重复创建Object,通过延迟到派生类构造完成后再初始化object,确保只创建一次实例。

二、非继承的替代设计

1. 组合代替继承

将原Base类的核心功能抽离为独立组件,让原Base和Derived类通过组合该组件复用逻辑,各自负责创建对应的Object:

class Object { public: Object(std::string someString, ...); .... };

// 抽离核心逻辑为组件类
class CoreLogic {
public:
  CoreLogic(int a, std::unique_ptr<Object> obj) 
    : value(a), object(std::move(obj)) {}
  
  // 原Base类的成员函数示例
  void doSomething() {
    // 使用value和object的业务逻辑
  }
  ...
private:
  int value;
  std::unique_ptr<Object> object;
};

// 原Base类改为组合CoreLogic
class Base {
public:
  Base(int a) : core(a, std::make_unique<Object>("Base", ... )) {}
  
  // 转发CoreLogic的接口
  void doSomething() { core.doSomething(); }
  ...
private:
  CoreLogic core;
};

// 原Derived类同样组合CoreLogic,创建自己的Object实例
class Derived {
public:
  Derived(int a) : core(a, std::make_unique<Object>("Derived", ... )) {}
  
  // 复用CoreLogic的接口,也可添加派生类特有逻辑
  void doSomething() { core.doSomething(); }
  void doDerivedSpecificThing() { /* 派生类专属逻辑 */ }
  ...
private:
  CoreLogic core;
};

void fun() {
  Derived d(42);
}

2. 模板类+创建者模式

通过模板参数注入Object的创建逻辑,避免继承关系,同时复用通用逻辑:

class Object { public: Object(std::string someString, ...); .... };

// 通用处理类,依赖模板参数提供的创建逻辑
template<typename ObjectCreator>
class GenericHandler {
public:
  GenericHandler(int a) : value(a), object(ObjectCreator::create()) {}
  
  // 通用成员函数示例
  void process() {
    // 使用value和object的业务逻辑
  }
  ...
protected:
  int value;
  std::unique_ptr<Object> object;
};

// 定义Base对应的Object创建者
struct BaseObjectCreator {
  static std::unique_ptr<Object> create() {
    return std::make_unique<Object>("Base", ... );
  }
};

// 定义Derived对应的Object创建者
struct DerivedObjectCreator {
  static std::unique_ptr<Object> create() {
    return std::make_unique<Object>("Derived", ... );
  }
};

// 类型别名,对应原Base和Derived
using Base = GenericHandler<BaseObjectCreator>;
using Derived = GenericHandler<DerivedObjectCreator>;

void fun() {
  Derived d(42);
}

3. 策略模式

定义Object创建的策略接口,通过组合不同策略实现不同的Object初始化逻辑:

class Object { public: Object(std::string someString, ...); .... };

// Object创建策略接口
struct ObjectCreationStrategy {
  virtual std::unique_ptr<Object> create() const = 0;
  virtual ~ObjectCreationStrategy() = default;
};

// Base对应的创建策略
struct BaseCreationStrategy : ObjectCreationStrategy {
  std::unique_ptr<Object> create() const override {
    return std::make_unique<Object>("Base", ... );
  }
};

// Derived对应的创建策略
struct DerivedCreationStrategy : ObjectCreationStrategy {
  std::unique_ptr<Object> create() const override {
    return std::make_unique<Object>("Derived", ... );
  }
};

// 统一处理类,组合策略对象
class Handler {
public:
  Handler(int a, std::unique_ptr<ObjectCreationStrategy> strategy) 
    : value(a), object(strategy->create()) {}
  
  // 通用处理逻辑示例
  void handle() {
    // 使用value和object的业务逻辑
  }
  ...
private:
  int value;
  std::unique_ptr<Object> object;
};

void fun() {
  // 使用Derived策略创建Handler实例
  Handler d(42, std::make_unique<DerivedCreationStrategy>());
}

内容的提问来源于stack exchange,提问作者Coder909

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:50