2015-12-04 60 views
0

我一直计划我的实验室项目相当长一段时间,因为我喜欢这样做之前真的跳进代码,并偶然发现了一个问题,我不知道如何短语在网上找到答案。包括抽象类或多态类C++

我目前的任务是编写一个非常基本的文本编辑器,其中我的教授给了我们一个基本的用户界面。

我们需要做的是... - 创建从抽象类派生的命令对象 - 这些命令对象有一个执行和取消方法 - 每个命令控制,如添加输入简单的动作,撤消输入或删除行

我遇到的问题是,当通过从抽象类派生的命令时,我将不得不导入/包含从抽象类派生的每个命令,以便使用像...

Command Abstract Class 
AddInput Derived Class (from above) 

AddInput input = new Command() 

我的终极问题是...

  • 我将不得不进口每一个我从抽象的
  • 威尔做命令AddInput =新AddInput使用类()工作我认为它会起作用吗?我知道它在C++中是合法的,但是它会返回AddInput类中的所有成员变量吗?
+0

'import'?那是什么?你的意思是'#include'? – PaulMcKenzie

+0

对不起。我来自Java背景。我的意思是包括。 –

+0

*我来自Java背景* - 所以这就是为什么你使用'new'的原因。在C++'命令AddInput;' - 不需要'新' – PaulMcKenzie

回答

0

首先,如果Command是一个抽象类(或者,如果你喜欢的界面),你不能创建它的一个实例,因此代码Command cmd = ...不正确。你只能使用它的指针。让我们考虑一些简单的例子:

//cmdintfs.h 
class ICommand 
{ 
public: 
    virtual bool Execute() = 0; 
    virtual bool Undo() = 0; 
    virtual ~ICommand() {}; 
}; 

#include "cmdintfs.h" 
class CDoSmthCommand : public ICommand 
{ 
public: //some cmd implementation 
}; 

class CDoOtherThingsCommand : public ICommand 
{ 
public: //some cmd implementation 
}; 

//... 
ICommand *pCmd = new CDoOtherThingsCommand(); 
pCmd->Execute(); 

在这里,我们有一个接口ICommand和一些派生的实现。 ICommandcmdintfs.h中声明,所有命令实现源应包含该头。当您通过多态接口使用命令时,您只能访问它描述的方法(在我们的示例中为ExecuteUndo)。所有其他具体的实现将被隐藏。

+0

感谢您提供全面而翔实的回复!如果抽象类的构造函数最后有一个“= default”,我的派生类将被强制使用该默认构造函数吗? –

+0

您可以在类层次结构的任何层上自由覆盖对象构造函数。尽管如此,您将不得不为正确的构造函数链调用提供代码。 – Ari0nhh

+0

谢谢,我把所有的东西都整理了出来。你是一个很好的帮助。 –