c++中的状态模式错误(没有合适的构造函数)


class Tool {
public:
virtual void mouseUp();
virtual void mouseDown();
virtual ~Tool();
};
class SelectionTool : public Tool {
void mouseDown() override {
std::cout << "SelectionTool iconn";
}
void mouseUp() override {
std::cout << "Draw a dashed rectanglen";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool iconn";
}
void mouseUp() override {
std::cout << "Draw linen";
}
};
class Canvas {
Tool _currentTool;
public:
void mouseDown() {
_currentTool.mouseDown();
}
void mouseUp() {
_currentTool.mouseUp();
}
Tool getCurrentTool(){
return this->_currentTool;
}
void setCurrentTool(Tool currentTool) {
this->_currentTool = currentTool;
}
};
int main(int argc, char *argv[]){
auto george = std::make_unique<Canvas>();
george->setCurrentTool(std::make_unique<BrushTool>());
george->mouseDown();
george->mouseUp();
return 0;
}

没有合适的用户定义转换,从"std::unique_ptr<Brush,>"以"乳腺癌";存在。

我正在跟随youtube课程,在Java中使用这种多态性,我试图在c++中实现它,但它不起作用。这段代码有什么问题吗?

我怀疑你使用的多态性视频没有使用智能指针类型。

你不能使用std:: shared_ptr就好像它是底层类型一样。它们有get和set接口,但它们不是一个无缝的替代品。如果他们是,他们就无法完成他们的工作!

使用std::unique_ptr会增加更多您现在可能不想处理的条件。这里我将使用std::shared_ptr

如果你想要共享指针,我建议对共享指针类型做一个类型定义,并在任何地方使用它。您可以将std::shared_ptrstd:: shared_ptr类似于原始指针的继承规则。只要确保你有一个虚基析构函数,你已经有了。

#include <iostream>
#include <algorithm>
class Tool {
public:
virtual void mouseUp() {}
virtual void mouseDown() {}
virtual ~Tool() {}
};
typedef std::shared_ptr<Tool> shared_tool_type;
class SelectionTool : public Tool {
void mouseDown() override {
std::cout << "SelectionTool iconn";
}
void mouseUp() override {
std::cout << "Draw a dashed rectanglen";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool iconn";
}
void mouseUp() override {
std::cout << "Draw linen";
}
};
class Canvas {
shared_tool_type _currentTool;
public:
void mouseDown() {
_currentTool.get()->mouseDown();
}
void mouseUp() {
_currentTool.get()->mouseUp();
}
std::shared_ptr<Tool> getCurrentTool() {
return this->_currentTool;
}
void setCurrentTool(shared_tool_type currentTool) {
this->_currentTool = currentTool;
}
};
int main(int argc, char* argv[]) {
auto george = std::make_shared<Canvas>();
george->setCurrentTool(std::make_shared<BrushTool>());
george->mouseDown();
george->mouseUp();
return 0;
}

相关内容

最新更新