Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по инициализации элемента const char* 
:(
    Опции темы
yngwie19
Дата 15.9.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте есть класс
Код

class Employee
{
   public:
         Employee(const char*);
   private:
         const char* name;
};

Подскажите как при создании объекта, например:
Код

Employee emp("John");

инициализировать поле Employee::name ?
PM MAIL   Вверх
JackYF
Дата 15.9.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Код

Employee::Employee(const char* name_)
 : name(strdup(name_))
{}


Не забудь про деструктор класса.

Или вообще используй std::string вместо const char*.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
yngwie19
Дата 15.9.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



JackYF, спасибо, в деструкторе нужно использовать соответственно free ?
PM MAIL   Вверх
JackYF
Дата 15.9.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



yngwie19, 
Цитата(yngwie19 @  15.9.2010,  18:09 Найти цитируемый пост)
спасибо, в деструкторе нужно использовать соответственно free ? 

Да.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
yngwie19
Дата 15.9.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



я с таким же успехом мог бы написать свою функцию с помощью new, Правильно?
Код

const char *getObj(const char* obj)
{
    char *temp = new char[strlen(obj) + 1];
    temp[strlen(obj)] = '\0';

    return temp;
}


Это сообщение отредактировал(а) yngwie19 - 15.9.2010, 19:46
PM MAIL   Вверх
djamshud
Дата 15.9.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



yngwie19, а копировать строку в temp кто будет?

ЗЫ. Для char и других простых типов new излишен. Определитесь, вам си или си++. Если второе, исп. std::string.

Добавлено через 40 секунд
ЗЗЫ, Копирование строки - strcpy. И он сам поставит 0 в конец.

Добавлено через 1 минуту и 31 секунду
ЗЗЗЫ. Хотя тут лучше использоваться memcpy, ибо strlen все равно уже вычислен.

Добавлено через 2 минуты и 24 секунды
Финальный ЗЫ: memcpy ноль в конец не поставит:).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Vovan222
Дата 15.9.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



Цитата(djamshud @  15.9.2010,  20:26 Найти цитируемый пост)
ЗЫ, Копирование строки - strcpy. И он сам поставит 0 в конец.

не понял, при копировании с помощью strcpy() автоматически проставляется 0 в конце.
PM MAIL   Вверх
bsa
Дата 15.9.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Vovan222 @  15.9.2010,  23:21 Найти цитируемый пост)
при копировании с помощью strcpy() автоматически проставляется 0 в конце

Если это вопрос, то ответ ДА.

Цитата(JackYF @  15.9.2010,  20:04 Найти цитируемый пост)
Не забудь про деструктор класса.

И будут у него проблемы, так как free принимает неконстантный указатель.  smile 


Цитата(yngwie19 @  15.9.2010,  19:05 Найти цитируемый пост)
инициализировать поле Employee::name ? 

В твоем случае, единственно правильный вариант:
Код
Employee::Employee(const char* name_)
 : name(name_)
{}
При этом в деструкторе ничего освобождать не нужно. С другой стороны, в качестве параметра можно передавать только те строки, которые будут "жить" все время жизни объекта класса Employee. Пример:
Код
Employee a("assd"); //правильно

char *s = new char[100];
//...
Employee b(s);
delete []s; //ошибка! Employee еще может использовать данные, на которые указывал s

PM   Вверх
djamshud
Дата 16.9.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



bsa, мы имели в виду использовать внутри char* :)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
yngwie19
Дата 17.9.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Всем спасибо. Подскажите что предпочтительнее:
Код

Employee::Employee(const char* name_)
 : name(name_)
{}

или
Код

std::string 

PM MAIL   Вверх
djamshud
Дата 17.9.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



стринг


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 17.9.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(yngwie19 @  17.9.2010,  10:24 Найти цитируемый пост)
Всем спасибо. Подскажите что предпочтительнее:

Код

const std::string&

PM   Вверх
bsa
Дата 17.9.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



azesmcar, ну я бы не был столь однозначен. Так как зависит от задачи. Если речь идет о функторе, то вариант со ссылкой предпочтительней, а если о каком-то самостоятельном объекте, время жизни которого может быть больше, чем область видимости создавшей его функции, то лучше обойтись без ссылок.
PM   Вверх
mes
Дата 17.9.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



bsa, как я понял, учитывая приведенный код тс в предшествующем сообщении, azesmzar предложил константную ссылку сделать аргументом конструктора, а не полем объекта класса.
 smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 17.9.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mes @  17.9.2010,  14:07 Найти цитируемый пост)
bsa, как я понял, учитывая приведенный код тс в предшествующем сообщении, azesmzar предложил константную ссылку сделать аргументом конструктора, а не полем объекта класса.

 smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2104 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.