首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将到类对象的智能指针与类对象混合

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

Stack Overflow用户
提问于 2017-08-03 14:31:17
回答 3查看 207关注 0票数 1

我有一个代码,通过设计,一些类使用工厂函数来生成实际的类,而其他类则不使用工厂函数。许多类的函数具有相同的实现名称,这些函数是按顺序调用的(参见下文)。此设计的结果是将智能指针混合到对象和对象本身。下面的代码是否设计错误,是否应该到处使用智能指针?

代码语言:javascript
复制
#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;
}

编辑

在下面的注释之后,我在示例中添加了智能指针。

EN

回答 3

Stack Overflow用户

发布于 2017-08-03 14:53:29

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-08-03 14:36:49

通常,如果不需要的话,您应该避免使用指针。在大多数情况下,像返回值优化这样的主题使它们成为可选的。另外,不要使用C风格的指针。C++11引入了内存头,其中包括许多有用的智能指针。

是的,我觉得在这样的程序中使用这些指针是一个错误的设计决定。

票数 0
EN

Stack Overflow用户

发布于 2017-08-03 17:02:04

除了混合之外,为什么代码会打扰您?你认为什么会因为这件事而变得糟糕?你认为这种差别真的会损害可读性吗?

是的,调用print的行看起来不一样,这种差异告诉您对象是以不同的方式管理的。

如果开发人员不能同时理解这两种情况,那么做同样的事情没有明显的好处。而->则有更大的问题。

我编写了一个代码库,其中几乎所有的东西都由共享指针来处理,以保持一致性,尽管有些事情不应该是指针,而且大多数事情并不是真正的共享。应该避免不必要的不一致,但在隐藏合法差异的情况下保持一致性确实没有帮助。

代码相对于所有指针的一个好处是,由于a不是指针,所以可以确保a不是null。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45487202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档