我有一个代码,通过设计,一些类使用工厂函数来生成实际的类,而其他类则不使用工厂函数。许多类的函数具有相同的实现名称,这些函数是按顺序调用的(参见下文)。此设计的结果是将智能指针混合到对象和对象本身。下面的代码是否设计错误,是否应该到处使用智能指针?
#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;
}编辑
在下面的注释之后,我在示例中添加了智能指针。
发布于 2017-08-03 14:53:29
在我看来这是个合理的设计。在客户端代码中,您将通过基类接口工作。
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());
}
}发布于 2017-08-03 14:36:49
通常,如果不需要的话,您应该避免使用指针。在大多数情况下,像返回值优化这样的主题使它们成为可选的。另外,不要使用C风格的指针。C++11引入了内存头,其中包括许多有用的智能指针。
是的,我觉得在这样的程序中使用这些指针是一个错误的设计决定。
发布于 2017-08-03 17:02:04
除了混合之外,为什么代码会打扰您?你认为什么会因为这件事而变得糟糕?你认为这种差别真的会损害可读性吗?
是的,调用print的行看起来不一样,这种差异告诉您对象是以不同的方式管理的。
如果开发人员不能同时理解这两种情况,那么做同样的事情没有明显的好处。而->则有更大的问题。
我编写了一个代码库,其中几乎所有的东西都由共享指针来处理,以保持一致性,尽管有些事情不应该是指针,而且大多数事情并不是真正的共享。应该避免不必要的不一致,但在隐藏合法差异的情况下保持一致性确实没有帮助。
代码相对于所有指针的一个好处是,由于a不是指针,所以可以确保a不是null。
https://stackoverflow.com/questions/45487202
复制相似问题