首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当试图将ofstream传递给对象(C++)时出错

当试图将ofstream传递给对象(C++)时出错
EN

Stack Overflow用户
提问于 2014-03-24 14:01:44
回答 4查看 494关注 0票数 1

我正在为我的架构类编写一个分支预测器模拟器,而且在实现多个类之间的输出时遇到了一些困难。我试图在我的main.cpp中打开一个主流,并将它传递给每个类的构造函数,供对象使用。我的头文件中有很多错误,如:

代码语言:javascript
复制
In file included from main.cpp:4:0:
predictors.h: In constructor â?~ATPred::ATPred(std::ofstream&)â?T:
predictors.h:14:18: error: use of deleted function â?~std::basic_ofstream<char>& std::basic_ofstream<char>::operator=(
const std::basic_ofstream<char>&)â?T

因此,错误似乎出现在我的头文件中:

代码语言:javascript
复制
#ifndef PREDICTORS_H
#define PREDICTORS_H

#include <string>

// Always Taken
class ATPred{
    private:
            std::ofstream outputFile;

    public:
            // Constructor
            ATPred(std::ofstream& file)
            { outputFile = file; }

            // Deconstructor
            ~ATPred()
            {}

            // Member Functions
            void parseResults(std::string filename);
};

// Always Non-Taken
class ANTPred{
    private:
            std::ofstream outputFile;

    public:
            // Constructor
            ANTPred(std::ofstream& file)
            { outputFile = file; }

            // Deconstructor
            ~ANTPred()
            {}

            // Member Functions
            void parseResults(std::string filename);
};

#endif

我不知道我在哪里出了问题,所以如果能提供任何帮助,我们将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-24 14:08:26

这里的问题是,您存储的是ofstream值,而不是引用。您可以通过更改ANTPred (以及类似地更改ATPred)使代码工作,如下所示:

代码语言:javascript
复制
class ANTPred {
private:
    std::ofstream &outputFile;
public:
    ANTPred(std::ofstream &file) : outputFile(file) {
        // other construction work
    }
};

虽然我说这将使您的代码工作,但它并不一定是安全的。隐式地存储对ofstream对象的引用假定它将超过所有ATPredANTPred实例。如果首先破坏of,那么ATPredANTPred实例的行为将是未定义的,很可能导致分段错误。

其他选项的列表并不详尽,包括使用原始指针(导致上述相同的生存期问题)、共享指针( c++11 std::shared_ptrboost::shared_ptr或其他共享指针库)、为每个对象构造单独的输出流或在需要记录数据时将输出流传递给对象实例。

票数 0
EN

Stack Overflow用户

发布于 2014-03-24 14:08:14

标准的C++流是不可复制的,您正在按值存储成员outputFile。您必须将其更改为引用或指针。

票数 0
EN

Stack Overflow用户

发布于 2014-03-24 14:09:13

流对象不能简单地被复制和分配,因为它是复制流是没有意义的的。

您可以存储对流的引用(或智能指针),并确保只要您的类在附近,对象就不会超出作用域(但是要注意对象的所有者)。

无论如何,如果您确定了,这篇文章提供复制流的方法,但是.

总之,创建流的副本并不简单,只有当您真正需要流对象的副本时才应该这样做。在许多情况下,更适合使用对流对象的引用或指针,或者在两个流之间共享流缓冲区。

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

https://stackoverflow.com/questions/22611620

复制
相关文章

相似问题

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