我正在尝试用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;
}
答案 0 :(得分: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
而不创建成员函数来实现它。
答案 1 :(得分:1)
您的代码有几个问题。第一个应该导致编译错误的是,您的类没有为streamout声明<<
运算符,这意味着它不能使用{{1}打印到流中}。要解决这个问题,您需要在类中添加这样的运算符,例如:
ostream_iterator
但是你的代码仍然包含一个严重的问题:违反三条规则(或者如果你使用的是c ++ 11,则为五条/无论如何)。您的类声明了一个自定义析构函数,但既不是自定义复制构造函数也不是自定义赋值运算符。这意味着当您复制类的实例(例如将其放入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 std :: unique_ptr或vector
,{{1}或者来自boost for C ++ 11代码的指针)。