gpt4 book ai didi

c++ - 将指向类对象的智能指针与类对象混合

转载 作者:行者123 更新时间:2023-11-30 05:10:48 27 4
gpt4 key购买 nike

我有一个代码,其中一些类使用工厂函数来生成实际类,而另一些则不使用。许多类都实现了具有相同名称的函数,并且这些函数被顺序调用(见下文)。这种设计导致混合了指向对象和对象本身的智能指针。下面的代码设计不好吗?我应该在所有地方都使用智能指针吗?

#include <iostream>
#include <memory>

class A
{
public:
void print_name() { std::cout << "A\n"; }
};

class B
{
public:
virtual void print_name() = 0;
static std::unique_ptr<B> factory(const int n);
};

class B1 : public B
{
public:
void print_name() { std::cout << "B1\n"; }
};

class B2 : public B
{
public:
void print_name() { std::cout << "B2\n"; }
};

std::unique_ptr<B> B::factory(const int n)
{
if (n == 1)
return std::make_unique<B1>();
else if (n == 2)
return std::make_unique<B2>();
else
throw std::runtime_error("Illegal option");
}

int main()
{
A a;
std::unique_ptr<B> b1 = B::factory(1);
std::unique_ptr<B> b2 = B::factory(2);

// The block below disturbs me because of mixed . and ->
a.print_name();
b1->print_name();
b2->print_name();

return 0;
}

编辑

我在下面的评论之后添加了指向示例的智能指针。

最佳答案

在我看来,这是一个合理的设计。在客户端代码中,您将通过基类接口(interface)工作。

class Base {};
class A: public Base {};
class B: public Base {};
class B1: public B {};
class B2: public B {};

class Factory {
std::unique_ptr<Base> create(const int n) {
// Instantiate a concrete class based on n
return std::unique_ptr<Base>(new A());
}
}

关于c++ - 将指向类对象的智能指针与类对象混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45487202/

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