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

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;
}

作为替代方案,您也可以通过将其设为 afriend而不是创建成员函数来实现它。

于 2013-05-25T11:09:06.710 回答
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;
};

但是,您的代码仍然包含一个严重的问题:违反三规则(或五规则/无论您使用的是 c++11 还是其他规则)。您的类声明了一个自定义析构函数,但既没有自定义复制构造函数也没有自定义赋值运算符。这意味着当您复制类的实例时(例如将其放入 avector中,两个对象都将包含相同的指针,由于在销毁第二个对象时双重释放而导致运行时错误。要解决此问题,您需要自己声明这些操作,或者(甚至更好)不要自己进行资源管理,而是使用智能指针(c++11 std::unique_ptr 或std::shared_ptrstd::tr1::shared_ptr或来自 boost 的指针,用于 pree C++11 代码)。

于 2013-05-25T11:11:16.903 回答