C++ 在存储可以用不同派生类型初始化的基类型成员变量时,请避免使用new

C++ 在存储可以用不同派生类型初始化的基类型成员变量时,请避免使用new,c++,inheritance,new-operator,C++,Inheritance,New Operator,我的代码结构如下所示,其中多个类实现接口。在示例类I中,将指向接口的指针和new()存储在构造函数中(取决于此处未显示的构造函数参数)。我正在寻找避免在这种情况下使用new()的方法,但尚未找到解决方案。对于这样的事情,最好的做法是什么 class Interface { virtual void Foo() = 0; }; class A : public Interface { void Foo() { ... } }; class B : public Interface

我的代码结构如下所示,其中多个类实现接口。在示例类I中,将指向接口的指针和new()存储在构造函数中(取决于此处未显示的构造函数参数)。我正在寻找避免在这种情况下使用new()的方法,但尚未找到解决方案。对于这样的事情,最好的做法是什么

class Interface
{
   virtual void Foo() = 0;
};

class A : public Interface
{
   void Foo() { ... }
};

class B : public Interface
{
   void Foo() { ... }
};

class Example
{
private:
     Interface* m_bar; 
public:
     Example()
     {
         m_bar = new A(); // deleted in destructor
     }
};

通常有两种方法可以做到这一点,每种方法都有各自的优点

如果在编译时真正定义了,则处理此问题的典型方法是简单地使用模板类型:

template <typename T>
class TemplateExample
{
    T m_bar;
public:
    TemplateExample() : m_bar() {};
}
如果您遵循可关闭模式,则可以进行运行时配置:

class Interface
{
public:
   virtual void Foo() = 0;
   virtual Interface* clone() const = 0;
};

template <typename T>
class CloneHelper : public Interface
{
public:
     virtual Interface* clone() const { return new T(static_cast<const T&>(*this));}
};
class A : public CloneHelper<A>
{
   virtual void Foo() { std::cout << 'A' << std::endl; }
};

class B : public CloneHelper<B>
{
   virtual void Foo() { std::cout << 'B' << std::endl; }
};

class UniquePtrExample
{
   std::unique_ptr<Interface> m_bar;
public:
   UniquePtrExample() : m_bar(new A()){}
   UniquePtrExample(const Interface& i) : m_bar(i.clone());
};
类接口
{
公众:
虚拟void Foo()=0;
虚拟接口*clone()常量=0;
};
样板
类CloneHelper:公共接口
{
公众:
虚拟接口*clone()常量{return new T(static_cast(*this));}
};
A类:公共克隆助手
{

虚拟void Foo(){std::难道你不一定要避免使用新的,你要避免担心所有权。使用
std::unique_ptr
并完成它。别忘了给
接口
一个虚拟析构函数。你为什么要避免使用新的?请详细说明。。。
class Interface
{
public:
   virtual void Foo() = 0;
   virtual Interface* clone() const = 0;
};

template <typename T>
class CloneHelper : public Interface
{
public:
     virtual Interface* clone() const { return new T(static_cast<const T&>(*this));}
};
class A : public CloneHelper<A>
{
   virtual void Foo() { std::cout << 'A' << std::endl; }
};

class B : public CloneHelper<B>
{
   virtual void Foo() { std::cout << 'B' << std::endl; }
};

class UniquePtrExample
{
   std::unique_ptr<Interface> m_bar;
public:
   UniquePtrExample() : m_bar(new A()){}
   UniquePtrExample(const Interface& i) : m_bar(i.clone());
};