在线等~~~菜鸟问题 刚才发错地方了

yj19888239 2009-05-15 01:30:24
编译和连接都没问题~~~
就是运行出错
~~那个图我传不上来
就是个对话框
终止~重试~忽略

代码如下:
#include <iostream>
#include <cstring>
using namespace std;

class mystring;
mystring operator+(mystring& string1, mystring& string2);
ostream& operator < <(ostream& outs, mystring& string);

class mystring
{
public:
mystring(const char *s)
{
str=new char[strlen(s)+1];
strcpy(str,s);
}

mystring():max(100)
{
str=new char[max+1];
str[0]='\0';
}


~mystring()
{
delete [] str;
}

friend mystring operator+(mystring& string1, mystring& string2);
friend ostream& operator < <(ostream& outs, mystring& string);

private:
char *str;
int max;
};

mystring operator+(mystring& string1, mystring& string2)
{
mystring temp;
strcpy(temp.str,string1.str);
strcat(temp.str,string2.str);

return temp;
}

ostream& operator < <(ostream& outs, mystring& string)
{
outs < <string.str;
return outs;
}


int main()
{

mystring a,b("yang"),c("jie");

a=b+c;

cout < <a;

return 0;

}

谁来看看啊
...全文
161 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
koulongfei 2009-05-16
  • 打赏
  • 举报
回复
恩,学习.
papaofdoudou 2009-05-16
  • 打赏
  • 举报
回复
如果将
mystring a,b("yang"),c("jie");

a=b+c;
改写成:
mystring b("yang"),c("jie");

mystring a=b+c;
则就不需要调用operator=的,也就不需要定义了;
这个时候只需要一个copy constructor就行了;
但是针对楼主目前的代码,缺少copy constrctor和 operator=任何一个都是不可取的。
papaofdoudou 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 chenxu_ustc 的回复:]
引用 11 楼 aime99 的回复:
mystring operator+(mystring& string1, mystring& string2)
{
mystring temp;
strcpy(temp.str,string1.str);
strcat(temp.str,string2.str);

return temp;
}

a = b + c;

没有赋值运算符重载,a直接按位拷贝temp,会导致temp那个对象别释放两次

正解
[/Quote]
非正解,一定要定义赋值运算符重载的而且copy constructor也必须要定义 11楼和19楼理解有误,
return temp 的时候会调用copy constructor,因为是按值返回,
而运行a=b+c的时候会调用operator=,这是因为此时a已经构造完毕了,成为完整的对象,要对此对象赋值,当然要调用operator=了
yj19888239 2009-05-16
  • 打赏
  • 举报
回复
分给14楼吧~~~
我回去看了下书~~~貌似这样的
T技术沙龙 2009-05-16
  • 打赏
  • 举报
回复
晚了,已经有正确答案了
T技术沙龙 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tugouxp 的回复:]
#include <iostream>
#include <cstring>
using namespace std;

class mystring;
mystring operator+(mystring& string1, mystring& string2);
ostream& operator < <(ostream& outs, mystring& string);

class mystring
{
public:
mystring(const char *s)
{
str=new char[strlen(s)+1];
strcpy(str,s);
}

mystring()
{
max=100;
str=new char[max+1];
str[0]='\0';
}

mystrin…
[/Quote]
chenxu_ustc 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aime99 的回复:]
mystring operator+(mystring& string1, mystring& string2)
{
mystring temp;
strcpy(temp.str,string1.str);
strcat(temp.str,string2.str);

return temp;
}

a = b + c;

没有赋值运算符重载,a直接按位拷贝temp,会导致temp那个对象别释放两次
[/Quote]
正解
bbb332 2009-05-15
  • 打赏
  • 举报
回复
缺少重载operator=
,,
cpp_for_food 2009-05-15
  • 打赏
  • 举报
回复
在没有定义operator=和copy constructor的情况下,当遇到这个类有对operator=和copy constructor的调用时,编译器就会调用系统默认的自动生成的这个类的operator=和copy constructor,在这种情况下operator=只是对这个类中的成员变量执行标准的简单赋值操作,即mystring1=mystring2(mystring1.str=mystring2.str), 这样在mystring2对象析构时mystring2.str就会被delete两次了;copy constructor的情况类似。
ldming 2009-05-15
  • 打赏
  • 举报
回复
去掉析构函数就可以了 具体什么原因 待定 !!
papaofdoudou 2009-05-15
  • 打赏
  • 举报
回复
最好两个都要重载,重载operator=和copy constructor,都需要调用:
mystring(const mystring &strr)
{
str=new char[strlen(strr.str)+1];
strcpy(str,strr.str);
}

mystring& operator=(const mystring &strr)
{
if(this==&strr)
return *this;
//上面的的忘了这句自赋值情况,逻辑不完整,不过不会出错,最好加上这句。
delete []str;
str=new char[strlen(strr.str)+1];
strcpy(str,strr.str);
return *this;

}
papaofdoudou 2009-05-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstring>
using namespace std;

class mystring;
mystring operator+(mystring& string1, mystring& string2);
ostream& operator <<(ostream& outs, mystring& string);

class mystring
{
public:
mystring(const char *s)
{
str=new char[strlen(s)+1];
strcpy(str,s);
}

mystring()
{
max=100;
str=new char[max+1];
str[0]='\0';
}

mystring(const mystring &strr)
{
str=new char[strlen(strr.str)+1];
strcpy(str,strr.str);
}

mystring& operator=(const mystring &strr)
{
delete []str;
str=new char[strlen(strr.str)+1];
strcpy(str,strr.str);
return *this;

}


~mystring()
{
delete [] str;
}

friend mystring operator+(mystring& string1, mystring& string2);
friend ostream& operator <<(ostream& outs, mystring& string);

private:
char *str;
int max;
};

mystring operator+(mystring& string1, mystring& string2)
{
mystring temp;

strcpy(temp.str,string1.str);
strcat(temp.str,string2.str);

return temp;
}

ostream& operator <<(ostream& outs, mystring& string)
{
outs <<string.str;
return outs;
}


int main()
{

mystring a,b("yang"),c("jie");

a=b+c;
cout <<a<<endl;
return 0;

}
yj19888239 2009-05-15
  • 打赏
  • 举报
回复
9楼的代码还是出错

到底是缺少什么东西啊?
是复制构造函数?还是赋值构造函数?或者是重载=?
T技术沙龙 2009-05-15
  • 打赏
  • 举报
回复
没看完,出去一下,现在占个位,待会回来看
aime99 2009-05-15
  • 打赏
  • 举报
回复
mystring operator+(mystring& string1, mystring& string2)
{
mystring temp;
strcpy(temp.str,string1.str);
strcat(temp.str,string2.str);

return temp;
}

a = b + c;

没有赋值运算符重载,a直接按位拷贝temp,会导致temp那个对象别释放两次
lpf000 2009-05-15
  • 打赏
  • 举报
回复
return temp; //返回其拷贝的临时对象,系统合成的拷贝构造函数只会进行简单的复制运算temp.str=临时对象的str;
你需要自己定义拷贝构造函数 进行深拷贝
mengde007 2009-05-15
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstring>
using namespace std;

class mystring;
mystring operator+(mystring& string1, mystring& string2);
ostream& operator <<(ostream& outs, mystring& string);

class mystring
{
public:
mystring(const char *s):max(strlen(s))
{
str=new char[strlen(s)+1];
strcpy(str,s);
}
mystring(const mystring& my)
{
str=new char[strlen(my.str)+1];
strcpy(str,my.str);

}
mystring& operator=(const mystring& a)
{
if(this==&a)
return *this;
delete []str;
str=new char[strlen(a.str+1)];
strcpy(str,a.str);
return *this;
}
mystring():max(100)
{
str=new char[max+1];
str[0]='\0';
}


~mystring()
{
delete [] str;
}

friend mystring operator+(mystring& string1, mystring& string2);
friend ostream& operator <<(ostream& outs, mystring& string);

private:
char *str;
int max;
};

mystring operator+(mystring& string1, mystring& string2)
{

char* str1=new char[strlen(string1.str)+strlen(string2.str)+1];
strcpy(str1,string1.str);
strcat(str1,string2.str);
mystring temp(str1);
delete str1;
return temp;
}

ostream& operator <<(ostream& outs, mystring& string)
{
outs <<string.str;
return outs;
}


int main()
{

mystring a,b("yang"),c("jie");

a=b+c;

cout <<a;

return 0;

}
adventurelw 2009-05-15
  • 打赏
  • 举报
回复
有动态分配以及复制构造过程(重载+的返回对象一定会调用复制构造函数),却没有定义相关的复制构造函数,会导致析构的时候出问题。
同时,因为一体的关系,还需要
定义重载=。
rainID 2009-05-15
  • 打赏
  • 举报
回复
只扫了一眼,估计就是没有重载=,所以是按位拷贝,析构的时候会重复delete
lingyin55 2009-05-15
  • 打赏
  • 举报
回复
缺少重载operator=
加载更多回复(5)
内容概要:本文围绕基于交替方向乘子法(ADMM)的多主体综合能源系统分布式协同优化展开研究,提出了一种兼顾系统整体性能与各主体隐私保护的分布式优化框架,并提供了完整的Matlab代码实现。研究详细构建了包含电、热、气等多种能源形式耦合的多主体综合能源系统模型,设计了基于ADMM算法的分布式求解机制,实现了在去中心化架构下的协同优化调度。文中深入分析了算法的迭代流程、收敛条件及关键参数(如惩罚因子)对优化性能的影响,通过仿真实验验证了该方法在提升能源利用效率、促进多能协同、降低运行成本方面的有效性,适用于园区微网、能源互联网等复杂场景下的分布式决策需求。; 适合人群:具备一定优化理论基础和Matlab编程能力的研究生、科研人员及从事综合能源系统、智能电网、分布式能源管理等相关领域的工程技术人员。; 使用场景及目标:①实现多主体综合能源系统中电、热、气等多能流的协同调度与优化运行;②解决传统集中式优化带来的数据隐私泄露和计算负担过重问题,支持去中心化的分布式决策模式;③为能源互联网、智慧园区、微电网等实际应用场景提供可复现、易拓展的算法原型与技术参考。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,重点理解ADMM算法中增广拉格朗日函数的构造、变量更新规则及收敛判据的实现过程,关注惩罚参数设置对算法收敛速度与稳定性的影响,可进一步尝试将其拓展应用于其他分布式优化问题或与其他智能算法进行性能对比研究。

65,210

社区成员

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

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