C++ 在存储可以用不同派生类型初始化的基类型成员变量时,请避免使用new
我的代码结构如下所示,其中多个类实现接口。在示例类I中,将指向接口的指针和new()存储在构造函数中(取决于此处未显示的构造函数参数)。我正在寻找避免在这种情况下使用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
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());
};