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
使用std::unique_ptr会增加更多您现在可能不想处理的条件。这里我将使用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 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;
}