1

いくつかのメンバー クラスを属性として持つクラスがあります。クラスのコンストラクターは、バイト ファイルのファイル名を受け取ります。さまざまなメンバー クラスは、コンストラクターでファイルの後続の部分を使用します。それらを部分 A、B、および C と呼びましょう。ファイルのサイズはさまざまです。

ヒープを使用して、次のようにします。

class myClass
{

    myClass(char *filename)
    {

        std::ifstream inputFile(filename, std::ios::binary);

        m_Class1 = new ClassA(inputFile); // read part A
        m_Class2 = new ClassB(inputFile); // read part B
        m_Class3 = new ClassC(inputFile); // read part C

        inputFile.close();
    }
}

ヒープではなくスタックでこれを行いたいと思います。

初期化リストが頭に浮かびますが、そのためには、各メンバー クラスに必要な部分に到達するために、入力ファイルの冗長部分を再読み取りして時間を浪費する必要があります。

これが単なるひどいアプローチであるかどうかはわかりませんが(おそらく)、これを効果的に達成するための提案はありますか? または、これを整理する別の方法の提案はありますか?

4

2 に答える 2

3
class myClass {
    myClass(char *filename) : inputFile(filename, std::ios::binary),
                              m_Class1(inputFile),
                              m_Class2(inputFile),
                              m_Class3(inputFile) {
        inputFile.close();
    }

private:
    std::ifstream inputFile;
    ClassA m_Class1;
    ClassA m_Class2;
    ClassA m_Class3;

};

メンバーの宣言順序が重要であることに注意してください。

于 2012-06-14T22:03:09.913 に答える
0

次の構文を少しだけ変更して使用できます。「スタック上」ではありませんが、ヒープを使用しないため、良いかもしれません。

class myClass
{
public: // note: public constructor to make the class usable
    myClass(char *filename)
    {
        std::ifstream inputFile(filename, std::ios::binary);

        m_Class1 = ClassA(inputFile); // read part A
        m_Class2 = ClassB(inputFile); // read part B
        m_Class3 = ClassC(inputFile); // read part C

        inputFile.close(); // note: no need to close; C++ does this automatically
    }
private:
    ClassA m_Class1; // note: not a pointer
    ClassB m_Class2;
    ClassC m_Class3;
}

これにはClassABCにデフォルトのコンストラクターと代入演算子 (デフォルトのものまたはコーディングしたもののいずれか) が必要です。

于 2012-06-14T22:01:13.107 に答える