【问题标题】:Error C2248:cannot access private member declared in class错误 C2248:无法访问在类中声明的私有成员
【发布时间】:2014-01-10 17:24:13
【问题描述】:

我已经创建了这个类:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class XLSCreator
{
private:
    ofstream filecontents;
    int fileType;
    int cellNumber;
    int rowsNumber;
public:
    XLSCreator(string);
    ~XLSCreator();
    void createType1File(string, string, string);
    void createType2File(string, string, string, string, string);
    void addNewRow();
    void addData(string);
    void saveFile();
};

但是当我尝试构建它时,它给了我这个错误:

错误 2 错误 C2248:“std::basic_ofstream<_elem>::basic_ofstream”:无法访问在类“std::basic_ofstream<_elem>”中声明的私有成员

那么有人可以帮我解决这个问题吗?

【问题讨论】:

  • 复制什么?代码有什么问题?
  • std::ofstream 是不可复制的。据推测,您正在尝试复制您的类,而默认的复制构造函数只是按成员复制文件流。
  • 所以我不能使用 std::ofstream 作为成员变量?
  • 你可以,我可以很好地编译你的类,但你不能依赖默认行为来复制它。你必须解决这个问题,具体如何取决于你想要什么,真的。

标签: c++ class ofstream


【解决方案1】:

您描述的错误不可能来自您提供的代码;你的班级声明很好。它一定来自代码的不同部分,您试图在其中复制 XLSCreator 类,例如通过调用复制分配:

XLSCreator foo("filename");
XLSCreator bar = foo; //copies foo to create bar

当 C++ 尝试为您的类生成 default copy-assignment operator 时会出现该错误,该类仅调用您已声明的每个成员的复制赋值运算符。 std::ofstream 是不可复制的,正如@chris 在 cmets 中所说,所以当编译器尝试调用 filecontents 的复制赋值运算符时,它发现它是不允许的(operator=basic_ofstream 内是私有的) .

为了解决这个问题,您要么需要确保从不复制XLSCreator,要么明确定义XLSCreator 的复制赋值运算符,以某种方式处理filecontents 成员而不尝试复制它。

【讨论】:

    【解决方案2】:

    你不需要导入ofstream吗?我认为您不能仅使用 iostream 和 fstream 创建 ofstreams。

    【讨论】:

    • @Basilevs 您的评论可以理解为“ofstream 标头是...”和“ofstream 类型是...”,所以要补充一点:没有 ofstream 标头。 ofstream 类型在&lt;fstream&gt; 中定义。
    • @hvd,我不明白你的意思,但实际上,ofstream 是在 本身中直接或间接包含的标头之一中定义的。我刚刚缩短了声明。
    • @Basilevs 这个答案说你需要#include &lt;ofstream&gt;,你的评论可以读作“不,你不需要那个,尽管它不会造成任何伤害”,或者“不,你不需要那个,如果你尝试一下,事情就会破裂”。我希望澄清,但可能没有这样做。 :)
    猜你喜欢
    • 2012-11-15
    • 2016-12-02
    • 1970-01-01
    • 2013-07-28
    • 2011-09-06
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多