1

次のようにクラスで宣言された fstream オブジェクトがあります(単なる例):

class Asd {

  public:
  Asd();

  private:
  std::fstream stream;

};

コンストラクターが呼び出されたときに、次のように fstream パラメーターを指定したい

Asd::Asd() {

  this->stream = std::fstream(file, std::fstream::in);

}

そして、私が持っているすべてのクラス関数でそのストリームを使用しますが、機能しません。VSが私に与えている1つのエラーは次のとおりです。

no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'

だから私はそれを読んで、私が見つけることができるのは、私がストリームをコピーできない(というか、コピーすべきではない)ということだけです。実際、私はそれをしたくさえありません。これをコンストラクターに追加できると誰かが言った:

Asd::Asd() : stream(file, std::fstream::in) {

  ...

}

しかし、それは同じエラーを出力し、何をすべきかわかりません...また、他の誰かがオブジェクトを参照する必要があると言いましたが、方法がわかりません?? これを機能させたいだけですが、わかりません:(

編集:これは完全なエラーメッセージです

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(860): error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator =(const std::basic_istream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(604): error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator =(const std::basic_ostream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
4

1 に答える 1

5

あなたが書いたことに基づいて、コンストラクターにまだ割り当てがあるようです。これが機能するかどうか試してください:

class Asd {
public:
    Asd(char const* file);

private:
    Asd(Asd&);
    void operator= (Asd&);

    std::ifstream stream;
};

Asd::Asd(char const* file): stream(file) {}

メンバー初期化子リストを使用してオブジェクトを作成すると、デフォルトでオブジェクトを作成して後で設定する必要がなくなります。最初にストリームを構築し、後で設定したい場合は、ストリームはコピー構築可能でもコピー割り当て可能でもないため、割り当てを使用できません。ただし、次のように開くこともできます。

Asd::Asd(char const* file) { stream.open(file); }

を使用std::ifstreamすることで、コンストラクターまたはに渡す必要はありません(または、 likestd::ios_base::inから間接的に派生したクラスを介して this 値を取得する際のその他のバリエーション) :は、 のコンストラクターまたはに渡されるものに自動的に追加されます。また、は よりもやや単純なクラスです。より小さくする必要があり、おそらく構築が高速です。std::ios_basestd::fstreamopen()std::ios_base::instd::ifstreamstd::ifstream::open()std::ifstreamstd::fstream

Mooing Duck のコメントに基づいて、プライベート コピー コンストラクトとプライベート 代入演算子を追加しました。オブジェクトをコピー コンストラクトまたはコピー アサインしようとした場合に、コンパイラがこれらのいずれかを示すことを期待していAsdます。引数を値渡しする関数に渡した場合や、オブジェクトを返す場合は、copy object を試みますので注意してくださいAsd。コンストラクターでの割り当てが、コンパイラーがストリームをコピーできないことについて不平を言った場所の 1 つである可能性は十分にありますが、コピーが試行される場所は他にもある可能性があります。

于 2013-08-29T22:52:19.293 に答える