C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Массив указателей на классы в самом классе., Как правильно создать и удалить.
Владимир-
Отправлено: 15.11.2004, 19:20


Ученик-кочегар

Группа: Участник
Сообщений: 3



Есть класс:
CODE

class A
{
private:
 int kol; // кол-во классов в массиве  
 A **M; // массив классов
 int len; // длина массива классов
public:
 A(){A(10);} //по умолчанию создаем масив из 10 указателей на классы
 A(int size){
   len = size;
   M = (A)new int[size];
 }
 ~A(){
   if(kol>0){
    for(int a=0; a<kol; a++) delete M[a];
   }
   if(M) delete []M;      
 }
 AddClass(){ // добавляем в массив (без проверок на ошибки)
  M[kol] = new A;
  kol++;
 }
};

Помогите, пожайлуста, исправить ошибки!
Заранее спасибо!
Doga
Отправлено: 15.11.2004, 19:40


Мастер участка

Группа: Участник
Сообщений: 575



Вместо A **M для хранения списка классов А используйте TList.
olegenty
Отправлено: 16.11.2004, 08:06


Ветеран

Группа: Модератор
Сообщений: 2412



или vector
Konstantine
  Отправлено: 16.11.2004, 10:39


Мастер участка

Группа: Модератор
Сообщений: 545



ну чё ВЫ, нормальный класс... щас немного подлатаю:
это пиши в h-нике:
CODE
class A
{
private:
// int kol; // кол-во классов в массиве - можно и без этого
A **M; // массив классов
int len; // длина массива классов
public:
A(int len=10); //по умолчанию создаем масив из 10 указателей на классы
~A();
A* AddClass(); // добавляем в массив , возврат — указатель на новый класс
};
А эот в СРР-нике:
CODE
A::A(int size)
{
len = size;
M = new A*[len]; // возможно неточен синтаксис
for(int i=0;i<len;i++)
{M[i]=NULL;}
}

A::~A()
{
if(!M) return;
for(int i=0; i<len; i++)
if(M[i])
delete M[i];
delete M;
}

A* A::AddClass()
{
int i;
for(i=0;i<len;i++)
if(M[i]) break;
if(i==len) {//обр. ошибки — нет места в массиве; return NULL;}
M[i] = new A;
return M[i];
}
Этот класс (кто не понял) — это древовидная структура... ещё в ней поиск организовать..., но для этого данные нада хранить (для критерия поиска)

Отредактировано Konstantine — 22/11/2004, 12:55
AVC
Отправлено: 16.11.2004, 10:56


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
{//обр. ошибки — нет места в массиве}

Для избежания этой и прочей головной боли лучше использовать
vector как советовал olegenty
или TList — Doga
в них многие вопросы уже решены.

PS. Так, к слову — не существует указателя на класс, есть указатель на экземпляр класса. Правда существует указатель на метод класса даже без экземпляра.
Guest
Отправлено: 22.11.2004, 10:00


Не зарегистрирован







В методе A::~A()
в строке delete M;
дает ошибку: E2040 Declaration terminated incorrectly

Пробовал разные варианты удаления — не получается....
Valdemar
Отправлено: 22.11.2004, 11:43


Мастер участка

Группа: Участник
Сообщений: 433



QUOTE
В методе A::~A()
в строке delete M;
дает ошибку: E2040 Declaration terminated incorrectly

А вы посчитайте количество открывающих и закрывающих скобок.
Konstantine
Отправлено: 22.11.2004, 11:54


Мастер участка

Группа: Модератор
Сообщений: 545



Я уже исправил.... извините — писАл без компилятора
olegenty
Отправлено: 22.11.2004, 12:11


Ветеран

Группа: Модератор
Сообщений: 2412



а если указатели, входящие в класс, уникальны по некоторому признаку, рулить будет map<>.

правда, vector и map ведут себя совершенно не так, как TList (хранят внутренние копии объектов), что накладывает некоторые ограничения на определение и реализацию класса (а некоторых случаях)
Asher
Отправлено: 22.11.2004, 13:19


Мастер участка

Группа: Модератор
Сообщений: 550



QUOTE
правда, vector и map ведут себя совершенно не так, как TList (хранят внутренние копии объектов)

Что кладете — то и хранят. biggrin.gif
Дадите ему на хранение указатель — будет хранить указатель.
А если нужен реальный лист, так всегда есть std::list
olegenty
Отправлено: 24.11.2004, 08:30


Ветеран

Группа: Модератор
Сообщений: 2412



да я просто намекаю, что если будет пользоваться — пусть инфу почитает, а то будет ожидать поведения TList...

Вернуться в Вопросы программирования в C++Builder