微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我不断收到“无法将参数‘_inputVerifier’声明为抽象类型‘InputVerifier’”错误

如何解决我不断收到“无法将参数‘_inputVerifier’声明为抽象类型‘InputVerifier’”错误

我目前正在将一个项目从 Java 转换为 C++。我使用基类作为接口类,我使用派生类作为“接口”类的子类。现在,我遇到了关于基类和派生类的问题。下面是 CPP 文件中的一些代码

enum class State {
    START,INTEGER,DECIMAL,END
};

class Edge {
    private:
        State currentState;
        InputVerifier inputVerifier;
        Action action;
        State nextState;
    public:
        Edge(State _currentState,InputVerifier _inputVerifier,Action _action,State _nextState) {
            currentState = _currentState;
            inputVerifier = _inputVerifier;
            action = _action;
            nextState = _nextState;
        }
};

Edge machine[1] = {
    Edge(State::START,DigitInputVerifier(),ValueIsDigitaction(),State::INTEGER)
};

以及头文件中的部分代码

class InputVerifier {
    public:
        virtual bool meetsCriteria(char c) = 0;
};

class Action {
    public:
        virtual InterimResult execute(InterimResult x,char c) = 0;
};

class ValueIsDigitaction: public virtual Action {
    public:
        InterimResult execute(InterimResult x,char c) override {
            x.setV(c - '0');
            return x;
        }
};

class DigitInputVerifier: public virtual InputVerifier {
    public:
        bool meetsCriteria(char c) override {
            if (c >= '0' && c <= '9') {
                return true;
            }
        return false;
        }
};

InterimResult 是另一个类,但这不是问题。我一直在尝试编译它,但我不断遇到的错误之一是错误:无法将参数“_inputVerifier”声明为抽象类型“InputVerifier”。我一直在尝试搜索这个问题,但我运气不佳。我是在 C++ 中使用类的新手,所以我正在努力学习,但我不明白如何解决这个错误。如果可以,你能解释一下什么是纯虚函数吗?任何帮助将不胜感激。

解决方法

C++ 不是 Java。明显地。后果之一是参数可以通过值或通过引用传递。关于 InputVerifier 这意味着:

  • InputVerifier inputVerifier 是尝试创建类 InputVerifier 的实例(该类是抽象的,因此不允许实例)。
  • 参数 InputVerifier _inputVerifier 是按值传递的,所以再说一遍:这是尝试创建一个无法创建的类。
  • 有一次深度复制的尝试inputVerifier = _inputVerifier;
  • 当您传递 DigitInputVerifier() 参数时,您实际上创建了一个临时对象(它将在计算表达式后立即销毁),并且正在复制该值以按值传递。

这同样适用于 Action

您可能想要的是:

class Edge {
    private:
        State currentState;
        InputVerifier &inputVerifier;
        Action &action;
        State nextState;
    public:
        Edge(State _currentState,InputVerifier &_inputVerifier,Action &_action,State _nextState)
            : currentState(_currentState),inputVerifier(_inputVerifier),action(_action),nextState(_nextState) {
        }
};

DigitInputVerifier digitInputVerifier;
ValueIsDigitAction valueIsDigitAction;
Edge machine[1] = {
    Edge(State::START,digitInputVerifier,valueIsDigitAction,State::INTEGER)
};

还有一点:public virtual 是一种特殊类型的继承,我猜你不需要它。简单的 class DigitInputVerifier: public InputVerifier 就足够了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。