我有一个代码,在设计中,一些类使用工厂函数来生成实际的类,而其他类则没有。许多类具有实现相同名称的函数,并且这些函数按顺序调用(参见下文)。这种设计导致将智能指针混合到对象和对象本身。代码是否设计不好,我应该在任何地方使用智能指针吗?
#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;
}
修改
我在下面的评论后面添加了智能指针。
答案 0 :(得分:1)
这看起来像是一个合理的设计。在客户端代码中,您将使用基类接口。
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());
}
}
答案 1 :(得分:0)
通常,如果不需要,应该避免使用指针。回归值优化等主题在大多数情况下都是可选的。另外,请勿使用C-Style-Pointers。 C ++ 11引入了内存头,其中包含许多有用的智能指针。
是的,我觉得在这样的程序中使用这些指针是一个糟糕的设计决定。
答案 2 :(得分:0)
除了混音之外,为什么代码会打扰你?你认为它真的会因此而变得糟糕吗?你认为差异真的会伤害可读性吗?
是的,调用print的行看起来不同,并且这种差异告诉您对象以不同的方式进行管理。
如果开发人员不能理解这两者,那么他们没有明显的好处。和 - &gt;那么你有更大的问题。我已经在一个代码库上工作,几乎所有东西都是由共享指针处理来保持一致性,即使有些东西不应该是指针而且大多数都不是真正共享的。应该避免不必要的不一致,但在隐藏合法差异的情况下保持一致并不是很有帮助。
代码对所有指针的一个好处是,因为a不是指针,所以你可以确定a不是null。