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) {...}
};