2015-12-04 58 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

謝謝,我把所有的東西都整理了出來。你是一個很好的幫助。 –