Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » С++ динамическое выделение памяти

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
При динамическом выделении памяти для одной переменной в конструктор можно передать параметр так book *a=new book("text"). А как быть, когда мне нужно передать параметры в массив?
Так book *obj; obj=new book("TEXT2"),book(),book("TEXT"); работает неправильно.

Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 23:58 14-03-2004
CaptainFlint



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
book* obj[3];
obj[0] = new book("TEXT2");
obj[1] = new book();
obj[2] = new book("TEXT");


----------
Почему же, ё-моё, ты нигде не пишешь "ё"?

Всего записей: 5484 | Зарегистр. 11-11-2002 | Отправлено: 00:16 15-03-2004
sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CaptainFlint, спасибо за ответ. А по кароче варианта нет?
И если уж я начал, то почему следующий кусок кода выдает "Null pointer assignment"?
Код:

Цитата:
 
#include <conio.h>
#include <iostream.h>
class book {
 char *s;
 public:
  book(char[]);
  book();
 ~book();
};
book::book() {
  cout<<"конструктор без параметра!\n";
  s=new char;
  cout<<"Введите s=";
  cin>>s;
  cout<<"====\n";
}
book::book(char k[]) {
  cout<<"конструктор с параметром!\n";
  s=new char;
  s=k;
  cout<<"s="<<s<<"\n====\n";
}
book::~book() {
 cout<<"деструктор!\n";
 cout<<"s="<<s;
 delete s;
 cout<<"\ndelete s\n";
 cout<<"-----\n";
}
 
int main() {
 clrscr();
 book *a=new book("text");
 book *b=new book();
 delete a;
 delete b;
 return 0;
}
 


Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 01:09 15-03-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sergsd

Цитата:
А по кароче варианта нет?

Куда уж покoроче? И зачем?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 09:47 15-03-2004
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скорее надо бы писать  

Код:
 
  s=new char;  
  cout<<"Введите s=";  
  cin>>*s;  
 

 
и далее по коду.
Осторожнее с указателями
 

Код:
 
 s=k;  // реально k - const char* - из сегмента данных программы
...
delete s; // удаляешь область, расположенную не в куче.
 

 
надо писать видимо так (если работаешь со стандартными библиотеками С)

Код:
 
 s=strdup(k);  
...
free(s); // удаляешь область, расположенную в куче.
 

 
или так (если больше нравится С++)

Код:
 
s=new char[length(k)];  
memcpy(s,k,length(k));
...
delete s; // удаляешь область, расположенную в куче.
 


Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 10:22 15-03-2004 | Исправлено: Mickey_from_nsk, 07:51 16-03-2004
sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk, благодарю за ответ
Извините, но еще один вопросик по ходу появился.
После записи
Цитата:
 
book* obj[3];  
obj[0] = new book("TEXT2");  
obj[1] = new book();  
obj[2] = new book("TEXT");  

обращение ко всем членам объекта стало производится с помощью оператора "->" , например obj[0]->get_i(), это логично т.к. имеется массив указателей. Но раньше, чтобы создать массив объектов без передачи параметров в конструктор я писал:

Цитата:
book *obj=new book[3];
и обращение к фу-ям членам объекта производилось через оператор "." и вроде бы все было ОК, так вот, непоянтно почему при такой записи обращений производилось через оператор точка, а не через "->"? Или эта запись неправильна?

Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 23:25 15-03-2004
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sergsd
Это происходить потому, что если выделять массив элементов через new для каждого элемента вызывается конструктор без параметров.
То есть, если хочешь работать через точку, надо делать так:

Код:
 
book obj[3]; // Должен существовать конструктор по умолчанию
obj[0] = book("TEXT2");
obj[2] = book("TEXT");
 

 
Естественно, должен быть определен оператор присваивания.

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 08:01 16-03-2004
sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk, спасибо за ответ.
Я правда немного о другом спрашивал, если перефразировать: можно ли при выделении массива через new каким-нибудь образом производить доступ к членам объекта через оператор точка, а не через "->"?

Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 20:15 17-03-2004
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sergsd
Дык, это уже фича языка - если работаешь с указателем - используй стрелку, если с переменной или с сылкой на нее - используй точку. То есть, если выделяешь через new массив элементов - обращайся к элементу нормально - через точку:

Код:
 
book *obj = new book[3];
obj[3].get() ...
 

Но при этом должен быть конструктор по умолчанию.
Проще сделать оператор копирования и использовать его, например так:

Код:
 
class book
{
...
  book& operator = (const book& b)
  {
  }
...
};
 
...
book obj[3];
obj[0] = book("TEXT2");
obj[2] = book("TEXT");
 

 
Добавлено
sergsd
Дык, это уже фича языка - если работаешь с указателем - используй стрелку, если с переменной или с сылкой на нее - используй точку. То есть, если выделяешь через new массив элементов - обращайся к элементу нормально - через точку:

Код:
 
book *obj = new book[3];
obj[3].get() ...
 

Но при этом должен быть конструктор по умолчанию.
Проще сделать оператор копирования и использовать его, например так:

Код:
 
class book
{
...
  book& operator = (const book& b)
  {
  }
...
};
 
...
book obj[3];
obj[0] = book("TEXT2");
obj[2] = book("TEXT");
 

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 08:32 18-03-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk

Цитата:
это уже фича языка - если работаешь с указателем - используй стрелку, если с переменной или с сылкой на нее - используй точку

Даже не фича, а фундамент, одна из основополaгающих вещей... как и:

Цитата:
что если выделять массив элементов через new для каждого элемента вызывается конструктор без параметров.

sergsd, не понятно в чем проблема?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:51 18-03-2004
sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Благодарю всех за помощь.
Все понял

Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 19:05 18-03-2004
CaHeK



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
memcpy(s,k,length(k));

Имхо, это лучше сделать так:

Код:
strcpy(s,k);

 
А вообще, если хочешь работать с объектами через '.' и не заморачиваться с памятью - обрати внимание на C#.

Всего записей: 24 | Зарегистр. 14-03-2002 | Отправлено: 19:26 18-03-2004
sergsd

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А вообще, если хочешь работать с объектами через '.' и не заморачиваться с памятью - обрати внимание на C#.

 
CaHeK, т.е. ты мне предлагаешь забить на C++ , и переходить сразу на C#
По-моему, это не выход из ситуации. Вдруг мне и там, что-нибудь непонятно станет, тогда, следуя твоей логике, мне нужно забивать на проблему и ийти изучать, что полегче.

Всего записей: 273 | Зарегистр. 20-06-2003 | Отправлено: 14:40 20-03-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это же бубль-гум, т.е. С++
 
book* obj[3];  // указатель на массив: используется "->"
book obj[3];  // просто массив: используется "."

Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 11:55 20-05-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » С++ динамическое выделение памяти


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru