首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用fstream时使用已删除的函数

使用fstream时使用已删除的函数
EN

Stack Overflow用户
提问于 2022-05-03 13:10:15
回答 1查看 126关注 0票数 1

当我将使用ofstream (稍后我想用来记录信息)和将一个类放置在另一个类中时,我收到了“使用已删除的函数”的消息。下面是我的最小示例:

代码语言:javascript
运行
复制
#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,它就能工作了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-03 13:16:36

Penguin的ctor中的这一行

代码语言:javascript
运行
复制
) : p_tracker(p_tracker) {}

您试图使Tracker p_tracker数据成员无效。因为您传递给它一个现有的Tracker实例,所以它尝试使用复制构造器。

但是类Tracker没有复制构造函数。这是错误中提到的“删除函数”

正如@NathanPierson在下面的注释中所写的,这是因为删除了std::ofstream成员变量tracker_file的复制构造函数(以及而不是,因为您定义了转换构造函数,正如我最初所写的)。

理论上您可以通过在Tracker中添加一个复制器来解决这个问题,比如:

代码语言:javascript
运行
复制
Tracker(Tracker const & other)
{
    // ...
}

但是-正如上面提到的,Tracker有一个不可复制的std::ofstream成员。

所以问题是,在这种情况下,你的意思是什么?

另外,请注意:对于类数据成员和传递给构造函数的参数都使用相同的名称:p_tracker,这有点让人费解,而且不会被重新引用。

UPDATE:在下面的注释中回答OP的问题:如果Penguin类只需要保持对Tracker实例的引用,则可以执行以下操作(向成员添加"m_"前缀以将它们与其他变量区分开来):

代码语言:javascript
运行
复制
#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++?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72099896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档