C++ 中的状态模式错误(没有合适的构造函数)
State pattern error in C++ (no suitable constructor)
class Tool {
public:
virtual void mouseUp();
virtual void mouseDown();
virtual ~Tool();
};
class SelectionTool : public Tool {
void mouseDown() override {
std::cout << "SelectionTool icon\n";
}
void mouseUp() override {
std::cout << "Draw a dashed rectangle\n";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool icon\n";
}
void mouseUp() override {
std::cout << "Draw line\n";
}
};
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”到“Tool”的合适的用户定义转换。
我正在关注 youtube 课程,其中在 Java 中使用了这种多态性,我尝试用 C++ 实现它,但它不起作用。该代码有什么问题?
我怀疑你使用的多态视频没有使用智能指针类型。
您不能只使用 std::shared_ptr 就好像它是基础类型一样。它们有获取和设置接口,但它们不是无缝替代。如果他们是,他们就无法完成他们的工作!
使用 std::unique_ptr 会添加更多您现在可能不想处理的条件。我将在这里使用 std::shared_ptr。
如果您想要共享指针,我建议为共享指针类型制作一个 typedef 并在任何地方使用它。您可以将 std::shared_ptr 分配给 std::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 icon\n";
}
void mouseUp() override {
std::cout << "Draw a dashed rectangle\n";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool icon\n";
}
void mouseUp() override {
std::cout << "Draw line\n";
}
};
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;
}
class Tool {
public:
virtual void mouseUp();
virtual void mouseDown();
virtual ~Tool();
};
class SelectionTool : public Tool {
void mouseDown() override {
std::cout << "SelectionTool icon\n";
}
void mouseUp() override {
std::cout << "Draw a dashed rectangle\n";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool icon\n";
}
void mouseUp() override {
std::cout << "Draw line\n";
}
};
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
我正在关注 youtube 课程,其中在 Java 中使用了这种多态性,我尝试用 C++ 实现它,但它不起作用。该代码有什么问题?
我怀疑你使用的多态视频没有使用智能指针类型。
您不能只使用 std::shared_ptr
使用 std::unique_ptr 会添加更多您现在可能不想处理的条件。我将在这里使用 std::shared_ptr。
如果您想要共享指针,我建议为共享指针类型制作一个 typedef 并在任何地方使用它。您可以将 std::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 icon\n";
}
void mouseUp() override {
std::cout << "Draw a dashed rectangle\n";
}
};
class BrushTool : public Tool {
void mouseDown() override {
std::cout << "BrushTool icon\n";
}
void mouseUp() override {
std::cout << "Draw line\n";
}
};
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;
}