2016-10-13 6 views
0

私は2つのプログラムを書いています。電卓とチェスゲームを考えてみましょう。彼らは多くのコード(インターフェイス管理、ファイルのオープン/保存)を共有しており、コードの繰り返しを避けるためのベストプラクティスを見つけようとしています。C++の派生クラスで繰り返しコードを避ける

私の考えは、親クラスを作成し、それをGeneric_Programと呼ぶことにしました。これはすべての共通関数を持ち、子クラスを派生させます。

私が遭遇する問題は、親クラスではなく派生クラスの関数を呼び出す方法です。設定を保存して終了とConrete例:今

class Generic_Program { 
    void SaveConfig() { 
     // Write general parameters to a file 
    } 
    void Exit() { 
     SaveConfig(); //First save configuration 
     // Configuration saved, do exit routines, like make window invisible, etc. 
    } 
} 

class Calculator : Generic_Program { 
    void SaveConfig() { 
     Generic_Program::SaveConfig(); //Write generic parameters 
     // Write calculator-specific data, like calculation results, etc. 
    } 
} 

class Chess : Generic_Program { 
    void SaveConfig() { 
     Generic_Program::SaveConfig(); //Write generic parameters 
     // Write chess-specific data, like player scores, etc. 
    } 
} 

、私は両方のプログラムからExit()を呼び出すことができるようにしたいと思います。望ましい行動は、彼らが一般的なデータと特定のデータを保存してから終了することです。

私が上記のコードを実行すると、親クラスのSaveConfig()が呼び出され、汎用プログラムデータのみが保存されます。

もちろん、特定のExit()子クラスのルーチンを書くこともできますが、そのポイントは共有コードを1回だけ書き込むことです。

親クラスの子どものSaveConfig()を呼び出す方法はありますか?この場合繰り返しコードを避けるためのベストプラクティスですか?

+1

を出口ルーチンを呼び出すため

Generic_Program::Exit() { SaveConfig(); // First save configuration ExitSub(); // invoke sub object configuration } 

。 –

+4

http://stackoverflow.com/questions/2391679/why-do-we-need-virtual-functions-in-c – drescherjm

+2

@drescherjm。ばっちり成功。 –

答えて

1

通常、子オブジェクトのexitルーチンを呼び出すと、そのexitルーチンは基本出口ルーチンを呼び出します。

Calculator::exit() { 
    GenericProgram::exit(); 
    std::cout << "do Chess configs" << std::endl; 
    // if needed can call parent routine again, GenericProgram::finish_configs(); 
} 

基本オブジェクトのExitルーチンを呼び出して、子オブジェクトのExitを呼び出す場合は、基本オブジェクトに仮想ExitSubルーチンを宣言します。

virtual void GenericProgram::ExitSub(); 

ベースオブジェクトが呼び出されても子オブジェクトがインスタンス化されていない場合のデフォルトバージョンを宣言/定義します。

Generic_Program::ExitSub() { // do nothing }; 

とそれぞれの子オブジェクトなどのバージョンを定義/宣言:

Chess::ExitSub() { 
    std::cout << "do chess configs" << std::cout; 
} 

宣言/子供がExitSubルーチンを呼び出すオブジェクトGeneric_Programで出口ルーチンを定義します。 (これは多型です)。次いで、テンプレート関数パターンをルックアップベースオブジェクトから

MyGenericProgram.Exit(); 
+0

ありがとうGregg。まさに私が探していたもの。主な考え方は、繰り返しのExit()サブルーチンを避け、親が子のSaveConfig()を呼び出させるようにすることです。あなたの例はまさにそうです。 – Szak1

関連する問題