2

C++ で標準ライブラリを学習しようとしており、自分のコードを実行しようとしていますが、うまくいきません。プログラムを正常に実行するには、何を忘れて、クラス「クラス」に何を追加する必要がありますか?

    #include <iostream>
    #include <vector>
    #include <list>
    #include <algorithm>
    #include <iterator>
    using namespace std;

    class Class {
    public:
      Class (int ii, double dd ) : ival(ii)  { dval = new double; *dval = dd; }
      ~Class() { delete dval; }
    private:
      int ival;
      double *dval;
    };

    int main()
    {

      vector<Class> vec;
      list<Class> list;
      vec.push_back( Class(1, 2.2) );
      vec.push_back( Class(2, 4.3) );
      vec.push_back( Class(3, 5.7) );
      ostream_iterator<const Class> classout(cout,"\n");
      copy( vec.begin(), vec.end(), classout );
    }

私は基本的にコピーアルゴリズムを理解し、使用しようとしています:

    template
      OutputIterator copy ( InputIterator first, InputIterator last, 
                            OutputIterator result )
    {
      while (first!=last) *result++ = *first++;
      return result;
    }
4

2 に答える 2

1

あなたのコードにはいくつかの問題があります。コンパイル エラーにつながる最初の原因は、クラスが<<streamout の演算子を宣言していないことです。つまり、ostream_iterator. これを修正するには、そのような演算子をクラスに追加する必要があります。

class Class {
public:
  Class (int ii, double dd ) : ival(ii)  { dval = new double; *dval = dd; }
  ~Class() { delete dval; }
  friend std::ostream& operator<<(std::ostream& os, const Class& c)
  {
    return os<<c.ival<<": "<<*c.dval;//or whatever you want your output to look like
  }
private:
  int ival;
  double *dval;
};

ただし、コードにはまだ重大な問題が 1 つあります。それは、3 のルール (または c++11 を使用している場合は 5 など) の違反です。クラスはカスタム デストラクタを宣言していますが、カスタム コピー コンストラクタもカスタム代入演算子も宣言していません。これは、クラスのインスタンスをコピーすると (クラスに配置するなどvector)、両方のオブジェクトに同じポインターが含まれ、2 番目のオブジェクトの破棄時に二重解放が原因で実行時エラーが発生することを意味します。これを修正するには、どちらかが必要です。これらの操作を自分で宣言するか、(さらに良いことに) 自分でリソース管理を行うのではなく、代わりにスマート ポインターを使用します (c++11 std::unique_ptr またはstd::shared_ptrstd::tr1::shared_ptrpree C++11 コードの boost からのポインター)。

于 2013-05-25T11:11:16.903 に答える
1

std::ostream_iterator挿入演算子<<を使用して、オブジェクトを出力ストリームに挿入します。そのような演算子を提供する必要があります。メンバー関数を使用した実装例:

class Class {
public:
  Class (int ii, double dd ) : ival(ii)  { dval = new double; *dval = dd; }
  ~Class() { delete dval; }
  void print(std::ostream &stream) const {
    stream << ival << ' ' << *dval;
  }
private:
  int ival;
  double *dval;
};

std::ostream& operator<< (std::ostream &stream, const Class &arg) {
  arg.print(stream);
  return stream;
}

friend別の方法として、メンバー関数を作成せずに にすることで実装することもできます。

于 2013-05-25T11:09:06.710 に答える