2013-09-16 5 views
2

Извините, если заголовок неправильный, я не знаю, как его еще назвать.Экземпляр объекта C++ как член класса

У меня есть класс Название:

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, который должен иметь имя объекта, как это член. Как я могу это сделать? Я думал, что-то вроде этого:

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

Является ли это правильный способ сделать это, и почему я не могу сделать это, как я думал, что в первое место? Благодаря

+0

PS. В конструкторе копирования есть утечка памяти. Найдите копию и замените идиому, чтобы помочь ей правильно. –

ответ

2

Сделать конструктор, как это:

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

Тогда читайте о конструкторах списках инициализаторов в вашем любимом учебнике C++.

Причина, по которой ваш исходный код не работает, заключается в том, что Name не имеет конструктора по умолчанию (конструктор, который можно вызвать без параметров).

+0

Большое спасибо :) – tuks

+0

Как бороться с 'name (n)', когда n должно быть предварительно обработано или является результатом некоторых вычислений? Почему этот синтаксис так неудобен? почему C++ так синтаксически странно: D – yota

1

Тип Name не имеет конструктора по умолчанию, поэтому вы должны инициализировать его в списке инициализаторов в Person. Помимо этого, ваш operator= утечки памяти и небезопасно для самонаведения, и вы никогда не выпускаете память в деструкторе, так что там есть еще одна утечка.

Есть ли веская причина не использовать std::string вместо вашего Name типа?

+0

Спасибо, я не возражал против утечек памяти, потому что я набрал этот код здесь быстро, не тестируя его, это всего лишь пример, а не реальная программа, над которой я работаю :) – tuks

+0

@tuks: You должен заботиться о утечке памяти. Гораздо легче думать в течение 5 минут, кто ответственен за всю жизнь объекта, чем попытается выяснить после факта и заплатить все места, где вы протекаете. –

Смежные вопросы