0

構造を使用してファイルオブジェクトを渡すときに1つの問題に直面しており、コードは

#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 に答える