将智能指针与类对象混合到类对象

时间:2017-08-03 14:31:18

标签: c++ class oop pointers reference

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

#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;
}

修改

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

3 个答案:

答案 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。