[英]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.