主题:关于类的一个小问题
376923432
[专家分:150] 发布于 2010-04-03 15:07:00
#include<iostream.h>
#include<string.h>
class Animal
{
private:
char name[40];
float weight;
int age;
public:
void SetName(char *nm) { strcpy(name, nm); }
void SetWeight(float wt) { weight = wt; }
void SetAge(int ag) { age = ag; }
void GetName(char *nm) const { strcpy(nm, name); }
float GetWeight() const { return weight; }
int GetAge() const { return age; }
void Move();
};
void Animal:: Move()
{
cout << "Animal moving!\n";
}
void main()
{
Animal dog;
char *p = "peter";
dog.SetName(p);
dog.GetName(p);//这一句有什么问题吗?为什么运行有问题
cout << "The dog's name is:" << p << endl;
dog.Move();
}[code=c]
请填写代码
[/code]
回复列表 (共9个回复)
板凳
cxxcomp [专家分:2370] 发布于 2010-04-03 17:18:00
有些莫名,有些奇妙。
非常莫名,非常奇妙。
3 楼
liudan319 [专家分:3780] 发布于 2010-04-03 21:21:00
[quote]有些莫名,有些奇妙。
非常莫名,非常奇妙。[/quote]
4 楼
eastcowboy [专家分:25370] 发布于 2010-04-04 04:13:00
运行的时候出错,当然是有问题的。
抛开类的使用不谈,您觉得这样的代码是否有问题呢?
char* p = "peter";
char name[40];
strcpy(name, p);
strcpy(p, name); // 这句是否有问题呢?
主要还是指针的使用。strcpy(p, name)这句要求p所指向的数据是可以修改的。但是很不巧,前面定义的char* p = "peter";这样的数据在运行的时候并不能被修改。所以出错。
而您的代码在化简之后其实与上面那段代码相同。所以也出错。
5 楼
雪光风剑 [专家分:27190] 发布于 2010-04-04 08:36:00
详细来说,char *p="peter";这个东西完整的类型是:char const *
注意中间的const,也就是说,p指向的值(字符串"peter")是不可篡改的
所以如果要取得这个名字,需要换个东西来接受
6 楼
376923432 [专家分:150] 发布于 2010-04-05 11:27:00
那应该怎么引用GetName()函数成员呢?
能给我具体代码吗?谢谢!
8 楼
雪光风剑 [专家分:27190] 发布于 2010-04-05 17:59:00
很简单啊,再声明一个char res[40];
这样,dog.GetName(res);就能取出来了,不过……我的问题跟很多人一样,取得成员属性的方法,为什么不直接return这个属性呢?
9 楼
mur1985 [专家分:0] 发布于 2010-04-09 08:31:00
字符串是存储在只读存储区,利用指针获得的紧紧是该字符串的地址,字符串该字符串无法被修改,不过有的编译器是可以的!
我来回复