-1

次のクラスを想定します。

class FileManipulator
{
    static InputTypeOne * const fileone;
    InputTypeTwo *filetwo;

    public:
    FileManipulator( InputTypeTwo *filetwo )
    {
        this->filetwo = filetwo;
    }
    int getResult();
};

FileManipulatorは、両方のファイルのデータを使用して から出力を取得しますgetResult()。これは、複数の反復と、さまざまなオブジェクトに対する via 反復filetwoの複数の構築を意味します。入力は、たとえば、いくつかの .csv データベースです。タスク全体で同じままです。FileManipulatorsInputTypeTwoInputTypeOne

プログラム自体はマルチモジュラーであり、上記の操作はその小さな単位にすぎません。

static私の質問は、オブジェクト指向のパラダイムとカプセル化に従って、そのフィールドをどのように処理できるかです。このフィールドは、さまざまなプログラムの実行で固定値ではないため、何らかの方法で初期化する必要があります。私が C++ のルールを理解している限り、フィールドを設定するメソッドを作成することはできませんが、フィールドをパブリックにして、任意のクラス (FileManipulatorまたは友好的なクラス) の外で初期化することは、カプセル化と矛盾しているように思えます。

その場合、私は何ができますか?私の頭に浮かぶ唯一のことは、Cの方法でそれを行うことです。つまり、十分に分離されたコンパイルユニットで初期化します。私にできることは本当にそれだけですか?それは専門的な方法でどのように解決されますか?

編集

当初の意図であった定数へのポインタを定数へのポインタに修正しました。

4

2 に答える 2

0

頭に浮かぶこれを行う1つの方法は次のとおりです。

.cpp ファイル内

FileManipulator::fileone = NULL;

次に、コンストラクターを次のように変更します。

FileManipulator( InputTypeTwo *filetwo,  InputTypeOne  *initValue = NULL)
{
    if(fileone == NULL)
    {
        fileone = initValue;
    }
    this->filetwo = filetwo;
 }

または、init 関数を定義して、クラスを使用する前と CTOR の後に呼び出すようにすることもできます。init 関数には、fileone を初期化する方法のロジックが含まれます。

于 2013-12-12T10:14:33.470 に答える
0

フィールドを初期化する FileManipulator の public static メソッドを作成できます。

static void init()
{
  fileone = something();
}

そして、 main() またはプログラムが初期化されている場所から呼び出します。

于 2013-12-12T10:14:04.600 に答える