2012-02-26 22 views
1

main()にofstreamを構築したくありません。ここで私は何をしていますが、コンパイルしません:クラスのストリームの初期化

#include <fstream> 
using namespace std; 
class test 
{ 
private: 
    ofstream &ofs; 
public: 
    test(string FileName); 
    void save(const string &s); 
}; 
//---------------- 
test::test(string FileName) 
    : ofs(ofstream(FileName.c_str(),ios::out)) 
{ 
} 
//---------------- 
void test::save(const string &s) 
{ 
    ofs << s; 
} 
//---------------- 
//Provide file name and to-be-written string as arguments. 
int main(int argc,char **argv) 
{ 
    test *t=new test(argv[0]); 
    t->save(argv[1]); 
    delete t; 
} 

test.cpp: In constructor ‘test::test(std::string)’: 
test.cpp:13: error: invalid initialization of non-const reference of type ‘std::ofstream&’ from a temporary of type ‘std::ofstream’ 

コードを修正するには?

答えて

4

ofstream(FileName.c_str(),ios::out))は、非const参照にバインドできない一時オブジェクトを作成します。

はなぜ(同様のコメントを読んで)あなたが代わりにこれを行ういけない:

class test 
{ 
private: 
    ofstream ofs; //remove & ; i.e delare it as an object 
public: 
    test(string const & FileName); //its better you make it const reference 
    void save(const string &s); 
}; 

test::test(string const & FileName) //modify the parameter here as well 
    : ofs(FileName.c_str(),ios::out) //construct the object 
{ 

} 

お役に立てば幸いです。

+1

注(少なくともとの結合に対して一時的な)が、 'test'インスタンスは、コンストラクタの実行の終了時に破棄された一時オブジェクトへの参照を保持します。 –

+0

この場合、オブジェをオブジェクトとして宣言するにはどうすればよいですか? –

+0

@AndréCaron:言い換えれば、 'ofs'をconst参照として宣言することは解決策ではありません。 – Nawaz

0

特殊な状況でのみ、別のオブジェクトへの参照をクラスデータメンバーとして使用します。通常は、メンバオブジェクトにクラスの生涯の依存関係が必要です。通常、クラスはコピーと割り当てに制限があります。参照が必要な場合は、オブジェクトが作成されている必要があります。

発信者:

ofstream ouf("someFileName.txt"); 
test testObj(ouf) 

クラス・ヘッダ:それは* const参照として宣言*した場合、初期化が正当であろうこと

test::test(ofstream& ous) : ofs(ous) { }