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

3

如果标题不正确,对不起,我不知道该怎么命名。

我有一个类名:

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

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


1
拷贝构造函数存在内存泄漏问题。请查阅拷贝并交换惯用法以正确解决该问题。 - Martin York
2个回答

2

将构造函数改为以下格式:

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

然后在您喜欢的C++教材中阅读有关构造函数初始化列表的内容。

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


如何处理 name(n) 当 n 必须预处理或是某些计算的结果?为什么这个语法如此笨拙?为什么 C++ 的语法如此奇怪:D - yota

1
你的Name类型没有默认构造函数,因此必须在Person的初始化列表中初始化它。除此之外,你的operator=泄漏了内存,对于自我赋值是不安全的,并且你从未在析构函数中释放内存,因此还有另一个泄漏。
使用std::string代替你的Name类型是否有充分的理由?

谢谢,我不太在意内存泄漏,因为我很快地在这里输入了这段代码,没有进行测试,它只是一个示例,并非我正在开发的真正程序 :) - tuks
@tuks:你应该关注内存泄漏。花5分钟思考对象的生命周期由谁负责要比事后试图找出并修补每个泄漏的地方容易得多。 - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接