C++ 使用单个输入字节文件的不同部分实例化堆栈上的成员类
C++ Instantiating member classes on the stack using different parts of single input byte file
我有一个类,它有几个成员类作为属性。类的构造函数将采用字节文件的文件名。不同的成员类在其构造函数中使用文件的后续部分,我们称它们为 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;
}
这要求 ClassA
、B
和 C
具有默认构造函数和赋值运算符(默认构造函数和赋值运算符或已编码的运算符)。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- 为什么我不能在类定义中实例化同一类的对象