string作为成员为何不能被操作?

cimstu 2008-02-22 04:32:07
我的代码如下
A.h
#include <string>
using namespace std;
class A
{
private:
string m_mystr;
public:
getstr(string str);
}
A.cpp
A::getstr(string str)
{
m_mystr = str;
}
上边的代码编译的时候可以通过,运行时会出错,而且不光是不能赋值,对m_mystr的任何操作都会出错,请问我是遇到了什么高深的问题吗?
...全文
191 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cimstu 2008-03-03
  • 打赏
  • 举报
回复
很感动大家能这样关心我的string,呵呵我发现错误在哪里了,上边的代码是我现编的,就是那么个意思。如果上边的语法无误的话。其实应该是可以正确赋值的。我的错误是你们谁也想不到的,呵呵就不再那出来逗大家乐了。感谢!
九个太阳2023 2008-02-26
  • 打赏
  • 举报
回复
8楼的解释的很详细了,不需要再补充什么了~~~
tsst 2008-02-26
  • 打赏
  • 举报
回复
楼主的写法有问题,基础知识不扎实!呵呵!潜力很大
fish6344 2008-02-26
  • 打赏
  • 举报
回复
的确如此,getstr有误导语意。
运算符科技 2008-02-26
  • 打赏
  • 举报
回复
都是猛男。。
建议函数名getstr改为setstr,我看着总以为你是要得到值。。
ShardowM 2008-02-25
  • 打赏
  • 举报
回复
class定义后应该加分号,getstr函数没有返回值。
fish6344 2008-02-25
  • 打赏
  • 举报
回复
把你贴子中的类声明稍作完善,粘贴到我的几个编译器上:

class A//没有构造函数(当然也不需要)!在A实例化时,m_mystr是一个空的string实例(缓冲区无字符)
{
private:
string m_mystr;
public:
getstr(string str);
};//完善一:加';'!

A::getstr(string str)
{
m_mystr = str;
cout << m_mystr << endl;//完善二:纯演示赋值操作结果!
}

在如下程序中:

int main(void)
{
string _s("Good!");
A _a;
_a.getstr(_s);//输出"Good!"!

_PAUSE;
return 0;
}

BC6.0编译器仅有一个警告"W8070 Function should return a value",程序经编译链接,正常运行;
VC7.1编译器同上,警告" warning C4183: “getstr”: 缺少返回类型;假定为返回“int”的成员函数",程序经编译链接,正常运行;

上述二个编译器仅按语言规则,视你的getstr函数因无返回值类型声明而使用缺省的返回值类型,就是int!只是给与程序设计层面以警告,而顺利编译链接,正常运行!

在GCC编译器上,上述未指定返回值的问题,造成编译时错误而不能Build,这是因为GCC尊从C++98标准给与上述代码以否决!在此,为getstr函数加上一个返回值类型,例如:

class A
{
private:
string m_mystr;
public:
void getstr(string str);//增加返回值类型声明;
};


void A::getstr(string str));//增加返回值类型声明;

{
m_mystr = str;
cout << m_mystr << endl;
}

上述程序一如BC和VC编译器,顺利编译链接,正常运行!

综上所述,string作为类成员并非如你所说:"不能被操作?"!string作为STL一部份,其实现目标就是为了使string象其它C++内建类型一样,安全、方便!(见《C++标准程序库》page471)因此,作为类成员的string对象变量,具有良好的可操作性。



hemu1190 2008-02-25
  • 打赏
  • 举报
回复
建议多看看书吧!
visame 2008-02-22
  • 打赏
  • 举报
回复
对呀,这个程序肯定不能同过编译,除非你的编译器有问题.
至少两处错误:class定义后应该加分号,getstr函数没有返回值。
理论上应该不会出现别的问题。除非你的编译器有问题。
ssdx 2008-02-22
  • 打赏
  • 举报
回复
我觉得楼主,你最好把你完整的代码帖出来。
Treazy 2008-02-22
  • 打赏
  • 举报
回复
函数的返回值在哪?
gccli 2008-02-22
  • 打赏
  • 举报
回复
不知你的A.cpp里有没有
#include "A.h"
还有class A{
};//要以';'结束

还有,C++有一种“迟缓型错误检测”机制,所以有时候编译时不一定检查出,只有运行时被触发后在能检测出来。
“迟缓型错误检测”,这是提高程序性能的一种策略。
ltc_mouse 2008-02-22
  • 打赏
  • 举报
回复
class A{
...
public:
getstr(string str); //这样可以编译通过?Dev C++提示需要返回值...
};

增加void返回值后,测试代码如下,Dev C++是正常的
A test;
test.getstr(string("Hello"));

64,639

社区成员

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

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