C ++对象实例作为类成员

时间:2013-09-16 04:23:03

标签: c++ oop pointers

如果标题错误,我很抱歉,我不知道如何命名。

我有一个名字:

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;
    }
};

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

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);
    }
};

这是正确的方法,为什么我不能像我想的那样做到这一点?感谢

2 个答案:

答案 0 :(得分:2)

使构造函数如下:

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

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

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

答案 1 :(得分:1)

您的Name类型没有默认构造函数,因此您必须在Person的初始值设定项列表中对其进行初始化。除此之外,你的operator=泄漏内存并且对于自我分配是不安全的,你永远不会在析构函数中释放内存,所以那里还有另一个泄漏。

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