Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数是否重新初始化文件成员_C++_Default Copy Constructor - Fatal编程技术网

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

C++ 复制构造函数是否重新初始化文件成员,c++,default-copy-constructor,C++,Default Copy Constructor,我遇到了一个有趣的案例: 我有一个作为类成员的文件流,还有一个在文件中写入数据的函数。该对象作为参数传递给另一个类,该类使用该参数初始化其成员。由于这个原因,我遇到了一些问题,我用字符串向量并向其中添加行来解决这些问题。但是现在我发现我仍然将对象从一个类传递到另一个类 以下是我的一个例子: class A { private: std::ofstream oFile; std::vector<std::string> oFileStringVec; public:

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

我有一个作为类成员的文件流,还有一个在文件中写入数据的函数。该对象作为参数传递给另一个类,该类使用该参数初始化其成员。由于这个原因,我遇到了一些问题,我用字符串向量并向其中添加行来解决这些问题。但是现在我发现我仍然将对象从一个类传递到另一个类

以下是我的一个例子:

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


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

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

我真的不确定这里发生了什么。流的创建是否不止一次?只创建一次,然后重新打开?请允许我在每个析构函数中添加file.close()函数的
?我是否应该将向量作为参数传递,并在
bar()
函数中使用ofstream?

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

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

这是明显的设计错误,因为这不是组合而是聚合,换句话说:这不是“has”关系,这是“uses”关系。你应该做的是:

class B
{
private:
    const A& a_;
public:
    CBar(const A& a) : a_(a) {...}
};
或者,如果
A
实际上意味着可以复制,并且您的目的是复制它,那么它不应该包含
std::of stream
对象,而应该包含对它的引用

我真的不确定这里发生了什么。流的创建是否不止一次

它被移动了。自以下日期起:

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


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

见第1点

请允许我在每个析构函数中添加oFile.close()函数,好吗

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

我应该只传递向量作为参数,并在bar()函数中使用ofstream吗


无法判断上述答案对您的用例有何影响。

至于
std::ofstream
提供了一个移动构造函数(请参阅)。
std::ofstream
的复制构造函数过去和现在都不可用。谢谢,我还不知道/看到一个。这不是我问题的答案,但是谢谢,知道这个很好。(+1)
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) {...}
};