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;
}