回 帖 发 新 帖 刷新版面

主题:关于类的一个小问题

#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个回复)

沙发

这句加了干嘛的啊 。。。。。。

板凳

有些莫名,有些奇妙。
非常莫名,非常奇妙。

3 楼

[quote]有些莫名,有些奇妙。
非常莫名,非常奇妙。[/quote]

4 楼

运行的时候出错,当然是有问题的。
抛开类的使用不谈,您觉得这样的代码是否有问题呢?
char* p = "peter";
char name[40];
strcpy(name, p);
strcpy(p, name); // 这句是否有问题呢?

主要还是指针的使用。strcpy(p, name)这句要求p所指向的数据是可以修改的。但是很不巧,前面定义的char* p = "peter";这样的数据在运行的时候并不能被修改。所以出错。
而您的代码在化简之后其实与上面那段代码相同。所以也出错。

5 楼

详细来说,char *p="peter";这个东西完整的类型是:char const *
注意中间的const,也就是说,p指向的值(字符串"peter")是不可篡改的
所以如果要取得这个名字,需要换个东西来接受

6 楼

那应该怎么引用GetName()函数成员呢?
能给我具体代码吗?谢谢!

7 楼

使用return语句!

8 楼

很简单啊,再声明一个char res[40];
这样,dog.GetName(res);就能取出来了,不过……我的问题跟很多人一样,取得成员属性的方法,为什么不直接return这个属性呢?

9 楼

字符串是存储在只读存储区,利用指针获得的紧紧是该字符串的地址,字符串该字符串无法被修改,不过有的编译器是可以的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册