【问题标题】:C++ object instance as a class memberC++ 对象实例作为类成员
【发布时间】:2013-09-16 04:23:03
【问题描述】:

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

我有一个班级名称:

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

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

【问题讨论】:

  • 附言。复制构造函数中存在内存泄漏。查找复制和交换习语以正确帮助它。

标签: c++ oop pointers


【解决方案1】:

构造函数如下:

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

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

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

【讨论】:

  • 当 n 必须被预处理或者是一些计算的结果时,如何处理name(n)?为什么这种语法如此尴尬?为什么 C++ 在语法上如此奇怪:D
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我不介意内存泄漏,因为我在这里快速输入了这段代码而没有测试它,这只是一个例子,而不是我正在处理的真实程序:)
  • @tuks:你应该关心内存泄漏。提前 5 分钟思考谁负责对象的生命周期,而不是事后弄清楚并修补泄漏的每个地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2019-04-09
相关资源
最近更新 更多