用类做参数,错在哪儿?

zengcity 2004-11-21 03:48:39
麻烦高手赐教!

#include <iostream>
#include <tchar.h>
using namespace std;


class b;

class a
{
friend class b;
public:
a();
~a();
void Init();
void Output();

private:
char *abuffer;
};

a::a()
{
abuffer = new char[26];
}

a::~a()
{
delete []abuffer;
}

void a::Init()
{

for (int i=0;i<26;i++)
{
abuffer[i]='a'+i;
}

}

void a::Output()
{
for(int i=0;i<26;i++)
{
cout<<abuffer[i];
}
}

class b
{
public:
b();
~b();
void Init(a tp,int i);
void Output();
private:
char *bbuffer;
};

b::b()
{
bbuffer = new char [26];
}

b::~b()
{
delete []bbuffer;
}

void b::Init(a tp,int i)
{
bbuffer[i] = tp.abuffer[i];
}

void b::Output()
{
for(int i=0;i<26;i++)
{
cout<<bbuffer[i];
}
}

int _tmain(int argc, _TCHAR* argv[])
{
a exa;
exa.Init();
exa.Output();

cout<<endl;

//应该是下面有问题
b exb;
for(int i=0;i<26;i++)
{
exb.Init(exa,i);
}
exb.Output();
return 0;
}

编译没有错误,但是运行的时候,把a~z输出后,就出错!
应该是用类最参数那儿有问题!
...全文
112 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengcity 2004-11-21
  • 打赏
  • 举报
回复
呵呵,感谢斑竹~
搞定!
cliangb 2004-11-21
  • 打赏
  • 举报
回复
for(int i=0;i<26;i++)
{
exb.Init(exa,i);
}
i=0时没有问题,abuffer[0]='a',可以赋值给bbuffer[0],但这句执行完之后,会调用a::~a()
{
delete []abuffer;
}
当i=1时,abuffer[1]已经不存在了,abuffer[1]赋值给bbuffer[1]时不会把‘b’赋值给它,再次调用a::~a()时,而a已经不存在了,所以会报错
goodluckyxl 2004-11-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <tchar.h>
using namespace std;


class b;

class a
{
friend class b;
public:
a();
~a();
void Init();
void Output();

private:
char *abuffer;
};

a::a()
{
abuffer = new char[26];
}

a::~a()
{
delete []abuffer;
}

void a::Init()
{

for (int i=0;i<26;i++)
{
abuffer[i]='a'+i;
}

}

void a::Output()
{
for(int i=0;i<26;i++)
{
cout<<abuffer[i];
}
}

class b
{
public:
b();
~b();
void Init(a &tp,int i); //引用对象地址来copy,否则拷贝临时对象中引用了对象的buffer
//空间在函数调用结束后自动析构,原来对象存在但是存放的空间被
//销毁delete了
void Output();
private:
char *bbuffer;
};

b::b()
{
bbuffer = new char [26];
}

b::~b()
{
delete []bbuffer;
}

void b::Init(a& tp,int i) //这里用引用
{
bbuffer[i] = tp.abuffer[i];
}

void b::Output()
{
for(int i=0;i<26;i++)
{
cout<<bbuffer[i];
}
}

int _tmain(int argc, _TCHAR* argv[])
{
a exa;
exa.Init();
exa.Output();

cout<<endl;

//应该是下面有问题
b exb;
for(int i=0;i<26;i++)
{
exb.Init(exa,i);
}
exb.Output();
return 0;
}
zengcity 2004-11-21
  • 打赏
  • 举报
回复
我换成
a() { abuffer = new char[27]; abuffer[26]='\0';};
b() { bbuffer = new char[27]; bbuffer[26]='\0';};

也不行呀~
zengcity 2004-11-21
  • 打赏
  • 举报
回复
我换成
a() { abuffer = new char[27]; abuffer[26]='\0'};
b() { bbuffer = new char[27]; bbuffer[26]='\0'};

也不行呀~

Leaveye 2004-11-21
  • 打赏
  • 举报
回复
注意
a() { abuffer = new char[26]; };
b() { bbuffer = new char[26]; };
这两处,字符串长度为26,在写入字符后,有文字的长度也是26,没有位置放字符串结束符 '\0'

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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