当我将使用ofstream (稍后我想用来记录信息)和将一个类放置在另一个类中时,我收到了“使用已删除的函数”的消息。下面是我的最小示例:
#include <iostream>
#include <unistd.h>
#include <fstream>
class Tracker {
private:
std::ofstream tracker_file;
public:
Tracker(const std::string filename) {
tracker_file.open("tracker_file.csv", std::ios_base::app);
}
};
class Penguin {
private:
Tracker p_tracker;
public:
Penguin(
Tracker p_tracker
) : p_tracker(p_tracker) {}
};
int main()
{
Tracker penguin_tracker = Tracker("output");
Penguin gentoo(penguin_tracker);
return 1;
}
我不明白它们之间有什么关系,但是如果我删除中间类,那么它就能工作,如果我删除了ofstream,它就能工作了。
发布于 2022-05-03 13:16:36
在Penguin
的ctor中的这一行
) : p_tracker(p_tracker) {}
您试图使Tracker p_tracker
数据成员无效。因为您传递给它一个现有的Tracker
实例,所以它尝试使用复制构造器。
但是类Tracker
没有复制构造函数。这是错误中提到的“删除函数”。
正如@NathanPierson在下面的注释中所写的,这是因为删除了std::ofstream
成员变量tracker_file
的复制构造函数(以及而不是,因为您定义了转换构造函数,正如我最初所写的)。
理论上您可以通过在Tracker
中添加一个复制器来解决这个问题,比如:
Tracker(Tracker const & other)
{
// ...
}
但是-正如上面提到的,Tracker
有一个不可复制的std::ofstream
成员。
所以问题是,在这种情况下,你的意思是什么?
另外,请注意:对于类数据成员和传递给构造函数的参数都使用相同的名称:p_tracker
,这有点让人费解,而且不会被重新引用。
UPDATE:在下面的注释中回答OP的问题:如果Penguin
类只需要保持对Tracker
实例的引用,则可以执行以下操作(向成员添加"m_"前缀以将它们与其他变量区分开来):
#include <iostream>
#include <fstream>
// No change in Tracker:
class Tracker {
private:
std::ofstream m_tracker_file;
public:
Tracker(const std::string filename) {
m_tracker_file.open("tracker_file.csv", std::ios_base::app);
}
};
// Penguin now holds a reference to Tracker:
class Penguin {
private:
Tracker & m_tracker;
public:
Penguin(
Tracker & tracker
) : m_tracker(tracker) {}
};
int main()
{
Tracker penguin_tracker("output");
Penguin gentoo(penguin_tracker);
return 0;
}
但是,该解决方案要求您确保只要Tracker penguin_tracker
还活着(否则将有一个悬空引用),Tracker penguin_tracker
就处于活动状态。在你的例子中,它是好的,在一般情况下提到。
另一个方面注意:如果一切顺利,main
应该返回0(而不是1)。见:What should main() return in C and C++?。
https://stackoverflow.com/questions/72099896
复制相似问题