Владимир- |
Отправлено: 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 (хранят внутренние копии объектов) |
Что кладете — то и хранят.
Дадите ему на хранение указатель — будет хранить указатель.
А если нужен реальный лист, так всегда есть std::list
|
|
olegenty |
Отправлено: 24.11.2004, 08:30 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
да я просто намекаю, что если будет пользоваться — пусть инфу почитает, а то будет ожидать поведения TList...
|
|