gpt4 book ai didi

c++ - 是否可以在同一个类中创建一个类的实例?

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 26 4
gpt4 key购买 nike

假设我有一个类:

class Foo{
public:

Foo(){
}

//Is it possible to create a function like this:
virtual Foo* createOb(){
//Should create a new Foo,Bar or Fiz, depending on the actual object type.
}
}

class Bar: public Foo{
public:

Bar(){
}
}

class Fiz: public Foo{
public:

Fiz(){
}
}

是否有可能在基类中有一个方法 createOb(),所以当在其中一个派生类的实例上调用 createOb() 时,派生类的一个实例是创建?

最佳答案

是的,可以使用 CRTP 来完成.

但首先,返回从 new 获得的原始指针非常危险。在 c++ 中,仅当原始指针不具有指向对象的所有权时才应使用它们。所以我冒昧地使用unique_ptr:

struct Base {
virtual auto create_obj() -> std::unique_ptr<Base>
{
return std::unique_ptr<Base>{};
}
};

// abstract works too:
struct Base {
virtual auto create_obj() -> std::unique_ptr<Base> = 0;
};

template <class Derived>
struct Base_crtp : Base {
auto create_obj() -> std::unique_ptr<Base> override /* final */
{
return std::unique_ptr<Base>{new Derived{}};
}
};

struct D1 : Base_crtp<D1>
{
};

struct D2 : Base_crtp<D2>
{
};

然后:

auto b1 = std::unique_ptr<Base>{new D1{}};
auto b2 = std::unique_ptr<Base>{new D2{}};

auto new_d1 = b1->create_obj();
auto new_d2 = b2->create_obj();

关于c++ - 是否可以在同一个类中创建一个类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com