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

Posted

技术标签:

【中文标题】我不断收到“无法将参数\'_inputVerifier\'声明为抽象类型\'InputVerifier\'”错误【英文标题】:I keep getting "cannot declare parameter '_inputVerifier' to be of abstract type 'InputVerifier'" error我不断收到“无法将参数'_inputVerifier'声明为抽象类型'InputVerifier'”错误 【发布时间】:2021-08-21 04:40:16 【问题描述】:

我目前正在将一个项目从 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++ 中使用类的新手,所以我正在努力学习,但我不明白如何解决这个错误。如果可以,你能解释一下什么是纯虚函数吗?任何帮助将不胜感激。

【问题讨论】:

错误明确地向您显示错误:InputVerifier 类是抽象的,因为 virtual bool meetsCriteria(char c) = 0; 抽象方法。您不能创建此类的实例。 InputVerifier 是一个抽象类,因为它具有纯虚函数。您不能创建它的对象。您可以将指针 InputVerifier* 作为成员,并且可以传递任何实现虚函数的子类对象。在这种情况下DigitInputVerifier 为了清楚起见,我想要实现的是一种超类和子类关系,其中我有一个超类,我可以有很多子类。超类变量将被分配给我想要分配给它的任何子类。此外,当我尝试将变量设为指针时,我得到“未定义对 WinMain@16 的引用”,这显然意味着应用程序正在尝试创建 Windows 应用程序而不是控制台应用程序。 【参考方案1】:

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 就足够了。

【讨论】:

所以我已经实现了,但我得到了这个错误:“未定义对 `WinMain@16' 的引用”。帮忙? 你需要定义main函数(或WinMain,取决于平台)。我建议你学习 C++ 的基础知识和 MSVC 中的简单 Windows 应用示例。

以上是关于我不断收到“无法将参数'_inputVerifier'声明为抽象类型'InputVerifier'”错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到此空指针未知来源错误?

我不断从 npm 收到 `errno 4058`

为啥我不断收到交互失败 (discord.py)

当我尝试输入 phpunit 时,我不断收到此错误

为啥我不断收到这个受诅咒的 SQL*Plus 无效标识符错误?

为啥我不断收到“java.net.MalformedURLException:无协议”[重复]