Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;继承与抽象函数实现_C++_Inheritance_Polymorphism_Virtual_Abstract - Fatal编程技术网

C++ C++;继承与抽象函数实现

C++ C++;继承与抽象函数实现,c++,inheritance,polymorphism,virtual,abstract,C++,Inheritance,Polymorphism,Virtual,Abstract,我得到了无法实例化抽象类的错误。现在我意识到了这一点,但是我不知道我的代码是如何出错的。所以我来了,请求帮助 我有 Action.h: #ifndef ACTION_H #define ACTION_H // ===== Dependencies ===== // #include ... ... // ===== Classes ===== // class Action { public: Action(); void set(...); virtual v

我得到了
无法实例化抽象类的错误。现在我意识到了这一点,但是我不知道我的代码是如何出错的。所以我来了,请求帮助

我有

Action.h

#ifndef ACTION_H
#define ACTION_H

// ===== Dependencies ===== //
#include ...
... 

// ===== Classes ===== //
class Action
{
public:
    Action();

    void set(...);

    virtual void doAction() = 0;
};

#endif
#ifndef MOVE_ACTION_H
#define MOVE_ACTION_H

// ===== Dependencies ===== //
#include ...
...

// ===== Classes ===== //
class MoveAction : public Action
{
public:
    MoveAction(...); // Constructor 

    using Action::set;

    void doAction(); // Do action

private:
    ...
};

#endif
MoveAction.h

#ifndef ACTION_H
#define ACTION_H

// ===== Dependencies ===== //
#include ...
... 

// ===== Classes ===== //
class Action
{
public:
    Action();

    void set(...);

    virtual void doAction() = 0;
};

#endif
#ifndef MOVE_ACTION_H
#define MOVE_ACTION_H

// ===== Dependencies ===== //
#include ...
...

// ===== Classes ===== //
class MoveAction : public Action
{
public:
    MoveAction(...); // Constructor 

    using Action::set;

    void doAction(); // Do action

private:
    ...
};

#endif
MoveAction.cpp

#include "MoveAction.h"

MoveAction::MoveAction(...) : Action() {
    ...
}

/* Do action */
void MoveAction::doAction() {
    ...
    setTile(...);
}
...
vector<Action> Actor::getActions(...) {
    vector<Action> actions = vector<Action>();

    actions.push_back(MoveAction(...));
    ...

    return actions;
}
因此本质上我是在继承
Action.h
的类
MoveAction.h
中实现
doAction()
。但是,当我执行以下操作时:

Actor.cpp

#include "MoveAction.h"

MoveAction::MoveAction(...) : Action() {
    ...
}

/* Do action */
void MoveAction::doAction() {
    ...
    setTile(...);
}
...
vector<Action> Actor::getActions(...) {
    vector<Action> actions = vector<Action>();

    actions.push_back(MoveAction(...));
    ...

    return actions;
}
它工作正常(注意将所有类型更改为
MoveAction
),这显然会停止任何扩展性选项

有人有什么想法吗?我觉得我错过了一些非常明显的东西


谢谢

不能有类型为
Action
的对象向量,即:

vector<Action>
向量。还记得在处理原始指针时正确处理内存管理。您可以使用某种类型的to指针来缓解内存问题:,或类似的问题。这样,您将引入一点,一点的效率开销,但这是强烈建议,只要你是一个初学者。不要担心这一点,因为这可能是预优化。首先,您需要一个正确的、工作正常的、不会泄漏内存的代码,然后您可以随时在以后进行调整(优化)

C++标准n3337§10.4/1抽象类

抽象类机制支持一般概念的概念, 例如一个形状,其中只有更具体的变体,如圆 和正方形,实际上可以使用。也可以使用抽象类 定义派生类为其提供各种 实现

C++标准n3337§10.4/2

抽象类是一个只能用作 另一类无法创建抽象类的对象 但作为派生自它的类的子对象除外。类是抽象的 如果它至少有一个纯虚函数。[注:此功能 可能被继承:请参见下文。-结束说明]虚拟函数 通过在函数中使用纯说明符(9.2)指定纯 类定义中的声明。(……)


您不能拥有
操作类型
的对象向量,即:

vector<Action>
向量。还记得在处理原始指针时正确处理内存管理。您可以使用某种类型的to指针来缓解内存问题:,或类似的问题。这样,您将引入一点,一点的效率开销,但这是强烈建议,只要你是一个初学者。不要担心这一点,因为这可能是预优化。首先,您需要一个正确的、工作正常的、不会泄漏内存的代码,然后您可以随时在以后进行调整(优化)

C++标准n3337§10.4/1抽象类

抽象类机制支持一般概念的概念, 例如一个形状,其中只有更具体的变体,如圆 和正方形,实际上可以使用。也可以使用抽象类 定义派生类为其提供各种 实现

C++标准n3337§10.4/2

抽象类是一个只能用作 另一类无法创建抽象类的对象 但作为派生自它的类的子对象除外。类是抽象的 如果它至少有一个纯虚函数。[注:此功能 可能被继承:请参见下文。-结束说明]虚拟函数 通过在函数中使用纯说明符(9.2)指定纯 类定义中的声明。(……)


下面是一个如何使用
std::vector
而不是
std:vector
的示例:

#包括
#包括
#包括
集体诉讼{
公众:
typedef std::向量ptr;
动作(){}
虚空doAction()=0;
};
集体行动:公共行动{
公众:
MoveAction(){}

void doAction(){std::cout下面是一个如何使用
std::vector
而不是
std:vector
的示例:

#包括
#包括
#包括
集体诉讼{
公众:
typedef std::向量ptr;
动作(){}
虚空doAction()=0;
};
集体行动:公共行动{
公众:
MoveAction(){}

void doAction(){std::cout您的意思是:存储“Action”而不是“Action*”或者
Action
而不是
MoveAction
;)@Mr_-Hic-up存储Action而不是Action*将是一个错误,即使它可以被编译!就是这样,肯定错过了这里显而易见的内容。谢谢伙计!@Ubobo我随时为您服务,先生,您的意思是:存储“Action”而不是“Action*”或者
Action
而不是
MoveAction
;)@Mr_-Hic-up存储Action而不是Action*即使可以编译也会是一个错误啊!就是这样,肯定错过了这里显而易见的内容。谢谢伙计!@Ubobo我随时为您服务,先生