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;
}

这需要ClassA,BC具有默认的构造函数和赋值运算符(默认的或您编码的)。

于 2012-06-14T22:01:13.107 回答