2

对不起,如果标题是错误的,我不知道如何命名它。

我有一个班级名称:

class Name {
    char * name;
public:
    Name(const char * n){
        name = new char[strlen(n)+1];
        strcpy(name,n);
    }
    Name& operator=(const Name& n){
        name = new char[strlen(n.name)+1];
        strcpy(name, n.name);
        return *this;
    }
    Name(const Name& n){
        *this = n;
    }
};

另一个类 Person 应该有 Name 对象作为它的成员。我怎样才能做到这一点?我在想这样的事情:

class Person{
    double height;
    Name name;
public:
    Person(double h, const Name& n){
        height = h;
        name = n;
    }
};

但只有这似乎有效:

class Person{
    double height;
    Name * name;
public:
    Person(double h, const Name & n){
        height = h;
        name = new Name(n);
    }
};

这是正确的方法吗?为什么我不能像我一开始想的那样做?谢谢

4

2 回答 2

2

像这样制作构造函数:

Person(double h, const Name& n)
  : height(h), name(n)
{}

然后阅读你最喜欢的 C++ 教科书中的构造函数初始化列表。

您的原始代码不起作用的原因是Name没有默认构造函数(可以不带参数调用的构造函数)。

于 2013-09-16T04:25:09.237 回答
1

您的Name类型没有默认构造函数,因此您必须在Person. 除此之外,您的operator=内存泄漏并且对于自分配是不安全的,并且您永远不会在析构函数中释放内存,因此那里还有另一个泄漏。

有充分的理由不使用std::string代替您的Name类型吗?

于 2013-09-16T04:27:29.010 回答