繁体   English   中英

有人可以告诉我我是否正确使用了独特的指针

[英]Can someone please tell me if I'm using unique pointers correctly

我正在尝试更多地使用智能指针,但不确定我是否正确使用了它们。 我似乎需要到处使用 std::move 。 不太明白为什么,但它的工作原理。 我的示例代码所做的并不重要(什么都没发生:)),我更关心我如何使用这些指针的结构。 感谢您的任何建议。

class IBehaviour {
public: virtual void Process() = 0;
};

class BehaviourA : public IBehaviour {
    public: virtual void Process() override { /* do behaviour A stuff */ }
};

class BehaviourB : public IBehaviour {
    public: virtual void Process() override {/* do behaviour B stuff */ }
};

class BehaviourC : public IBehaviour {
    public: virtual void Process() override {/* do behaviour C stuff */ }
};

class BehaviourProcessor {
public:
    BehaviourProcessor(int m) {
        if (m == 1)     behaviour = std::make_unique<BehaviourA>();
        else if (m==2)  behaviour = std::make_unique<BehaviourB>();
        else            behaviour = std::make_unique<BehaviourC>();
    }

    std::unique_ptr<IBehaviour> getBehaviour() {
        return std::move(behaviour);
    }

    std::unique_ptr<IBehaviour> behaviour = nullptr;
};

class Container {
public:
    void setProcessor(std::unique_ptr<BehaviourProcessor> ada) {
        adaproc = std::move(ada);
    }

    std::unique_ptr<BehaviourProcessor> getProcessor() {
        return std::move(adaproc);
    }

    std::unique_ptr<BehaviourProcessor> adaproc = nullptr;
};

int main()
{
    Container c;
    std::unique_ptr<BehaviourProcessor> beh = std::make_unique<BehaviourProcessor>(1);
    c.setProcessor(std::move(beh));
    c.getProcessor()->getBehaviour()->Process();

    beh = std::make_unique<BehaviourProcessor>(2);
    c.setProcessor(std::move(beh));
    c.getProcessor()->getBehaviour()->Process();

    beh = std::make_unique<BehaviourProcessor>(3);
    c.setProcessor(std::move(beh));
    c.getProcessor()->getBehaviour()->Process();
}
class IBehaviour { public: virtual void Process() = 0; }; std::unique_ptr<IBehaviour> behaviour = nullptr; behaviour = std::make_unique<BehaviourA>();

这是错误的。 通过将智能指针指向基类 sub object,它将通过该基类指针进行删除,这将导致未定义的行为,因为基类的析构函数不是虚拟的。 解决方案:声明~IBehaviour虚拟。


 std::unique_ptr<IBehaviour> getBehaviour() { return std::move(behaviour); } std::unique_ptr<BehaviourProcessor> getProcessor() { return std::move(adaproc); }

这些都是可疑的。 非右值引用限定的 function 不应从成员中移动。 这可能不是调用者所期望的。


考虑到BehaviourProcessor不是基数 class,目前还不清楚为什么您对Container::adaproc使用动态分配。这可能是一种不必要的悲观。 我建议考虑一个有价值的成员:

class Container {
public:
    BehaviourProcessor adaproc;

同样,getter 和 setter 似乎在很大程度上是多余的。 这些类作为聚合可以简单得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM