复制构造函数是否重新初始化文件成员

Does copy constructor reinitialize the file member

本文关键字:初始化 文件 成员 构造函数 是否 复制      更新时间:2023-10-16

我遇到了一个有趣的案例:

我有一个文件流作为类的成员,以及一个在文件中写入数据的函数。对象作为参数传递给另一个类,该类使用该参数初始化其成员。我有一些问题,因为这个,我已经设法解决他们与字符串的向量和添加行到它。但是现在我发现我仍然把对象从一个类传递到另一个类。

下面是我所拥有的一个例子:

class A
{
private:
   std::ofstream oFile;
   std::vector<std::string> oFileStringVec;
public:
   A()
   {
      oFile.open("../Path/File.txt", std::fstream::out);
      if (!oFile.is_open()) { std::cout<<"Error!!n";}
   }
   ~A() {}
   void writeInfo(const std::string& s) 
   { oFileStringVec.push_back(s); }
   void closeFile()
   { oFile.close(); }
};

class B
{
private:
   A ma;
public:
   B(const A& aOb) : ma(aOb) {}
   void foo() 
   {
      // ...
      ma.writeInfo(mystr);
   }
   // ...
};

class C
{
private:
   A ma;
public:
   C(const A& aOb) : ma(aOb) {}
   // ...
   void foo()
   {
      // ...
      B myB(myA);
      //...
   }
};

我有一个函数,我创建了一个C对象并调用它的foo()方法:

void bar()
{
   // ...
   A myA;
   // ...
   C myC(myA);
   myC.foo();
   //...
}

我真的不知道这里发生了什么。流是否被创建了不止一次?它只创建了一次,然后就重新打开了?你会建议我在每个析构函数中添加oFile.close()函数吗?我是否应该将向量作为参数传递,并在bar()函数中使用ofstream ?

我真的不知道这里发生了什么。流是否被创建了不止一次?

这是感动。参考资料:

4)移动构造函数。首先,move-从other构造基类(不影响rdbuf()指针),然后move-构造std::basic_filebuf成员,然后调用这个->set_rdbuf()来安装新的basic_filebuf作为基类中的rdbuf()指针。


它只创建一次,然后它只是重新打开?

见第一点

你会建议我在每个析构函数中添加file .close()函数吗?

这已经在std::ofstream析构函数中自动完成了

我应该传递作为参数的向量和使用的流只是在bar()函数?

不知道上面的答案对你的用例有什么影响

在您的示例中,class A只是打开文件并写入它,让我们称之为FileWriter。然后还有两个类:class Bclass C,它们都创建了这个FileWriter (A)的副本,即使它们不必这样做:

class B
{
private:
   A ma;
public:
   B(const A& aOb) : ma(aOb) {}

class C
{
private:
   A ma;
public:
   C(const A& aOb) : ma(aOb) {}
   // ...
   void foo()
   {
      // ...
      B myB(myA);
      //...
   }

这是明显的设计错误,因为这不是组合而是聚合,换句话说:这不是"拥有"关系,这是"使用"关系。你应该做的是:

class B
{
private:
    const A& a_;
public:
    CBar(const A& a) : a_(a) {...}
};
如果A真的是可复制的,你的意图是复制它,那么它不应该保存std::ofstream对象,而是一个对它的引用。