0

我在使用结构传递文件对象时遇到一个问题,代码是

#include <iostream>
#include<fstream>
using namespace std;
typedef struct abc
{
    ofstream &t;

}stabc;

class dc
{
    public:
    static void fun(stabc *ad);
    static stabc ab;

};
int main()
{
    ofstream str;
    str.open("hello.csv",ios::app);
    str<<"hellllooo"<<endl;
    dc d;
    d.ab.t=str;
    dc::fun(&d.ab);
    cout << "Hello world!" << endl;
    return 0;
}
void dc::fun(stabc *ad)
{
    ofstream& st=ad->t;
    st<<"kikiki"<<endl;

}

它给出未初始化的引用成员 abc::t。请告诉我我错在哪里?

4

2 回答 2

3

您需要t成员初始化列表中初始化引用。
引用是特殊的构造,需要在创建时进行初始化。由于您没有初始化成员引用,因此编译器会发出诊断信息。

成员引用必须在成员初始化器列表中进行初始化。

在线样品

#include <iostream>
#include <fstream>
using namespace std;
struct stabc
{
    ofstream &t;
    stabc(ofstream &obj):t(obj){}
};

int main()
{
    ofstream obj2;
    stabc obj(obj2);
    return 0;
}

另请注意,在 C++(与 C 不同)中,您不需要typedef结构即可在没有关键字的情况下使用它struct。您可以简单地使用结构名称,而无需预先添加struct.

于 2013-01-28T08:20:23.183 回答
1

您不能重新设置参考。它们必须被初始化,并且没有“默认”值作为参考。因此,您需要abc使用对文件流对象的引用来构造一个实例:

struct abc
{
    std::ofstream &t;
};

然后

abc myabc = {str};

或者给出abc一个构造函数并使用构造函数初始化列表:

struct abc
{
  abc(std::ofstream& o) : t(o) {}
  std::ofstream &t;
};

abc myabc(str);
于 2013-01-28T08:21:17.520 回答