2

これは私の最初の投稿です。

私はたくさんのトピックを読み、大丈夫だと思いますが、次のコードをコンパイルしようとすると、上記のエラーが再び発生します。

// Header file

#include <fstream>
#include <ostream>
#include <string>

using namespace std;

class CLogger
{
private:
    ostream m_oStream;

public:
    CLogger(ostream& oStream);
    CLogger(const string sFileName);
};

// Implementation file

CLogger::CLogger(ostream& oStream) : 
m_oStream(oStream) // <-- Here is the problem?!
{
}

CLogger::CLogger(const string sFileName) :
    m_oStream(ofstream(sFileName.c_str()))
{   
}

私たちを手伝ってくれますか?

どうもありがとうございます!

4

2 に答える 2

6
CLogger::CLogger(ostream& oStream) : // <-- Here is the problem?!
m_oStream(oStream)

問題は 1 行目ではなく、2 行目です。

memberm_oStreamは非参照として宣言されているため、上記の 2 行目では、作成したことによって のコピー コンストラクターが無効になっているoStreamため、不可能なコピーを作成しようとしています。これは、エラー メッセージ"cannot access privateメンバー。"std::ostreamprivate

修正はこれです:

std::ostream * m_oStream; //declare it as pointer.
bool m_deleteStream;      //flag whether to delete m_oStream or not

今これを行います:

CLogger::CLogger(ostream& oStream) : 
m_oStream(&oStream), m_deleteStream(false)
{
}

CLogger::CLogger(const string sFileName) :
m_oStream(new std::ofstream(sFileName)), m_deleteStream(true)
{
  //Note : in C++03, you've to pass sFileName.c_str() to 
  //the constructor of std::ostream   
}

次に、デストラクタを次のように記述します。

~CLogger()
 {
    if ( m_deleteStream )
    {
        delete m_oStream;
    }
 }

重要なポイント : これはリソース管理 (ロガー) クラスであるため、ロガー インスタンスのコピーは意味がないため、コピー不可にすることをお勧めします。

于 2012-12-19T15:43:40.260 に答える
0

m_oStream(ofstream(sFileName.c_str()))

あなたはそれを構築し、それを使用してofstreamあなたをコピー構築しますm_oStream。書くだけ

m_oStream(sFileName.c_str())

ストリームは移動可能な型ですが、コピー構築可能でもコピー割り当て可能でもないため、この例では C++11 を使用していないと思います。

同じ理由で、

CLogger::CLogger(ostream& oStream) : 
    m_oStream(oStream)

動作しません。コピーを作成することはできません。(C++11 の場合) 移動するか、なんらかの形式の参照を保持することしかできません。


サイドノート:

あなたの例から、そうしたかどうかは完全には明らかではありませんが、ヘッダーファイルにガードを含めることを忘れないでください。

于 2012-12-19T15:43:26.947 に答える