C++ 使用单个输入字节文件的不同部分实例化堆栈上的成员类

C++ Instantiating member classes on the stack using different parts of single input byte file

本文关键字:同部 实例化 堆栈 成员类 C++ 单个 输入 字节 文件      更新时间:2023-10-16

我有一个类,它有几个成员类作为属性。类的构造函数将采用字节文件的文件名。不同的成员类在其构造函数中使用文件的后续部分,我们称它们为 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();
    }
}

我想在堆栈而不是堆上执行此操作。

我想

到了初始化列表,但为此我不得不浪费时间重新读取输入文件的冗余部分,以获得每个成员类所需的部分。

我不知道这是否只是一个糟糕的方法(很可能),但是有人对有效实现这一目标有任何建议吗?还是对另一种组织方式的建议?

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

请注意,成员的声明顺序很重要。

您可以使用

以下内容,只是稍微更改了语法。它不是"在堆栈上",但它不使用堆,所以可能对你有好处。

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 具有默认构造函数和赋值运算符(默认构造函数和赋值运算符或已编码的运算符)。