重载输出运算符有点问题。

syoumei 2011-09-17 06:24:36

void print_list(ostream& out)const
{
for(int i =0;i<n;i++){
out << data[i] << " ";
}
}

friend ostream& operator<<(ostream& out, const list<T> x )
{
x.print_list(out);
return out;
}

上面是类里的两个方法。用<< 打印一次之后,data数组的值变调了。这是为什么!!!
cout << seq << endl;
...全文
201 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
syoumei 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]
终于找到原因了:
没有重载list的复制构造函数,执行的是浅挎贝。调用op<<时只是把指针复制给他。所以第一次能运行成功。
op<<返回之前调用list析构函数把那个指针delete掉了。所以第二次运行时,指针已经无效。

也可以用引用来代替:如下
friend ostream& operator<<(ostream& out, const list<T> &x……
[/Quote]
多谢,这贴有收获。
pathuang68 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]

引用 2 楼 syoumei 的回复:

恩,是个模板list。
插入值之后
cout << seq << endl;
cout << seq << endl;
内容是不一样的。
很奇怪啊。

C/C++ code
#include <iostream>
using namespace std;

class out_bounds{};
class no_mem{};……
[/Quote]

其他的代码,俺基本上没有改动,只把排版格式调整了一下。
pathuang68 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 syoumei 的回复:]

恩,是个模板list。
插入值之后
cout << seq << endl;
cout << seq << endl;
内容是不一样的。
很奇怪啊。

C/C++ code
#include <iostream>
using namespace std;

class out_bounds{};
class no_mem{};

template<typename T>
clas……
[/Quote]

把楼主上面的代码改成下面这样子就可以了:

#include <iostream>
using namespace std;

class out_bounds{};
class no_mem{};

template<typename T>
class List
{
private:
int n ;
int max_size;
T *data;

public:
List(int max_list_size =10)
{
max_size = max_list_size;
data = new T[max_list_size];
n = 0;
}

~List()
{
delete[] data;
}

bool empty()const
{
return n==0;
}

int size()
{
return n;
}

int locate(const T& x)const
{
for(int i=0;i<n;i++)
{
if(data[i]==x)
return ++i;
}
return 0;
}

bool retrieve(int k, T& x)const
{
if(k<1 || k>n) return false;
x = data[k-1];
return true;
}

List<T>& insert(int k,const T& x)
{
if(k<0 || k>n) throw out_bounds();
if(n==max_size)throw no_mem();
for(int i= n-1;i>=k;i--)
{
data[i+1]=data[i];
}
data[k]=x;
n++;
return *this;
}

List<T>& erase(int k, T& x)
{
if(retrieve(k,x))
{
for(int i =k;i < n ; i++)
data[i-1] = data[i];
n--;
return *this;
}
else
{
throw out_bounds();
}
}
template<typename T>
friend ostream& operator<<(ostream& out, const List<T>& x);
};

template<typename T>
ostream& operator<<(ostream& out, const List<T>& x)
{
for(int i = 0;i < x.n; i++)
{
out << x.data[i] << " ";
}
return out;
}


int main(void)
{
List<int> lst;
lst.insert(0, 0);
lst.insert(1, 1);

cout << lst << endl;
return 0;
}


几个需要注意的地方:
1. 类名最好不要叫list,因为stl中已经有list了
2. insert,erase等这些函数应该返回List<T>&,而不是List&
3. <<操作符重载要小心了
pathuang68 2011-09-17
  • 打赏
  • 举报
回复
把下面的两个函数合并成一个:

void print_list(ostream& out)const
{
for(int i =0;i<n;i++){
out << data[i] << " ";
}
}

friend ostream& operator<<(ostream& out, const list<T> x )
{
x.print_list(out);
return out;
}

合并成下面这样试试:

friend ostream& operator<<(ostream& out, const list<T> x )
{
for(int i =0;i<n;i++)
{
out << data[i] << " ";
}
return out;
}
iamnobody 2011-09-17
  • 打赏
  • 举报
回复
终于找到原因了:
没有重载list的复制构造函数,执行的是浅挎贝。调用op<<时只是把指针复制给他。所以第一次能运行成功。
op<<返回之前调用list析构函数把那个指针delete掉了。所以第二次运行时,指针已经无效。

也可以用引用来代替:如下
friend ostream& operator<<(ostream& out, const list<T> &x )
syoumei 2011-09-17
  • 打赏
  • 举报
回复
恩,是个模板list。
插入值之后
cout << seq << endl;
cout << seq << endl;
内容是不一样的。
很奇怪啊。

#include <iostream>
using namespace std;

class out_bounds{};
class no_mem{};

template<typename T>
class list{
private:
int n ;
int max_size;
T *data;
public:

list(int max_list_size =10)
{
max_size = max_list_size;
data = new T[max_list_size];
n = 0;
}
~list(){delete[] data;}
bool empty()const{return n==0;}
int size(){return n;}

int locate(const T& x)const
{
for(int i=0;i<n;i++){
if(data[i]==x) return ++i;
}
return 0;
}

bool retrieve(int k, T& x)const
{
if(k<1 || k>n) return false;
x = data[k-1];
return true;
}

list& insert(int k,const T& x)
{
if(k<0 || k>n) throw out_bounds();
if(n==max_size)throw no_mem();
for(int i= n-1;i>=k;i--){
data[i+1]=data[i];
}
data[k]=x;
n++;
return *this;
}

list& erase(int k, T& x)
{
if(retrieve(k,x)){
for(int i =k;i < n ; i++)
data[i-1] = data[i];
n--;
return *this;
}else{
throw out_bounds();
}
}

void print_list(ostream& out)const
{
for(int i =0;i<n;i++){
out << data[i] << " ";
}
}

friend ostream& operator<<(ostream& out, const list<T> x )
{
x.print_list(out);
return out;
}

};

ryfdizuo 2011-09-17
  • 打赏
  • 举报
回复
代码贴全点,你自定义了list<T>?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧