Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
1

Указатель на массив экземпляров класса

08.09.2010, 09:18. Показов 5195. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!

Есть класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class SPicture
{
private:
    TMemoryStream*  FBaseBuffer;
    TMemoryStream*  FCurrentBuffer;
    TMemoryStream*  FMarkedBuffer;
 
    int         FFrameWidth;//ширина буфера
    int         FFrameHeight;//высота буфера
 
    bool            FIsError;//true если ошибка
    UnicodeString              FErrMessage;//сообщение об ошибке
 
    unsigned int        FNumber;
 
protected:
public:
    __fastcall SPicture();
    __fastcall ~SPicture();
 
    __property int              FrameWidth = {read = FFrameWidth, write = FFrameWidth};
    __property int              FrameHeight = {read = FFrameHeight, write = FFrameHeight};
    __property bool             IsError = {read = FIsError, write = FIsError};
    __property UnicodeString    ErrMessage = {read = FErrMessage, write = FErrMessage};
    __property TMemoryStream*   BaseBuffer = {read = FBaseBuffer, write = FBaseBuffer};
    __property TMemoryStream*   CurrentBuffer = {read = FCurrentBuffer, write = FCurrentBuffer};
    __property TMemoryStream*   MarkedBuffer = {read = FCurrentBuffer, write = FCurrentBuffer};
    __property unsigned int     Number = {read = FNumber, write = FNumber};
 
};
Так вот... Как лучше мне объявлять массив экземпляров этого класса и как выделять память под них?
Я делаю так:

C++
1
SPicture *Pictures[];
Потом когда необходимо добавить очередной экземпляр, делаю так:
C++
1
Pictures[n] = new SPicture();
Проблема в том, что в определенный момент происходит исключение:
Access violation at address <...> in module <...>

Научите корректно работать с памятью....
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2010, 09:18
Ответы с готовыми решениями:

Динамический массив экземпляров класса, с неизвестным количеством экземпляров
Доброго времени суток. По ходу работы, программно должны создаваться и удаляться объекты класса....

Двумерный динамический массив экземпляров класса
Ребят, подскажите пожалуйста как создать двумерный динамический массив экземпляров класса :)

Двухмерный динамический массив экземпляров класса TImage
Здравствуйте! Столкнулась с такой проблемой: при создании двухмерного динамического массива...

Указатель на массив экземпляров класса
Пытаюсь разобраться с указателями, но видимо что-то совсем плохо понимаю: class bull {int x;};...

7
221 / 135 / 48
Регистрация: 12.04.2010
Сообщений: 248
08.09.2010, 09:42 2
А где выделяется память под массив указателей? Правильно... нигде.
Т.е. нужно выделить память под массив указателей.
C++
1
SPicture *Pictures[N];
где N - размер массива.
А если не известен размер массива, то можно воспользоваться контейнерами, например
list
1
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
08.09.2010, 09:52  [ТС] 3
Цитата Сообщение от uggway Посмотреть сообщение
А где выделяется память под массив указателей? Правильно... нигде.
Т.е. нужно выделить память под массив указателей.
Код
SPicture *Pictures[N];
где N - размер массива.
А если не известен размер массива, то можно воспользоваться контейнерами, например
list
Секундочку, то, что я указываю в квадратных скобках размер массива, не значит, что я выделяю память. Надо new использовать вроде?

Если я напишу
C++
1
SPicture *Pictures[4];
Автоматически будет выделена память (т.е. вызван конструктор SPicture) под 4 элемента?
0
221 / 135 / 48
Регистрация: 12.04.2010
Сообщений: 248
08.09.2010, 10:01 4
Это значит, что будет выделена память под 4 указателя на класс SPicture. А память для самих классов (и вызов конструкторов ) выполняется при помощи оператора new.
C++
1
Pictures[n] = new SPicture();
1
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
08.09.2010, 10:11 5
davian, ошибка происходит из-за того, что вы не делаете удаление старых объектов при создании новых, то есть вы не перераспределяете память, а просто выделяете новую область. Это вызывает утечку.

Для примера, создаём класс:
C++
1
2
3
4
5
6
7
class Temp {
  private:
    unsigned int Width, Height;
  public:
    void SetHW(int W, int H) { Width = W; Height = H; };
    unsigned int GetSquare(void) { return Width * Height; };
};
Объявим указатель:
C++
1
Temp *Test;
В конструкторе формы создадим один объект этого класса:
C++
1
Temp *Test = new Temp[1];
Дальше нам необходимо будет изменять количество объектов класса и работать с ними.
Для этого воспользуемся функцией realloc (для примера, количество необходимых объектов я буду получать из Edit1):
C++
1
2
3
4
5
6
7
int Count = Edit1->Text.ToInt();
Test = (Temp *)realloc(Test,Count*sizeof(Temp));
 
for (int i = 0; i < Count; i++) {
  Test->SetHW(i,i+1);
  ShowMessage(Test->GetSquare());
}
Однако, realloc является немного устаревшим вариантом (пришедшим из С), т.к. не учитывает особенности, присутствующиев классе (конструкторы/деструкторы).

Вместо этого можно написать шаблон, который будет использовать операторы С++, такие как new и delete. Если интересно, могу помочь реализовать такой шаблон...

Ещё один выход - использовать контейнеры list, vector, TList и другие.
2
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
08.09.2010, 10:46  [ТС] 6
MikeSoft, Я понял, что вы имеете ввиду до места, где вы говорите о шаблоне...
Вместо этого можно написать шаблон, который будет использовать операторы С++, такие как new и delete. Если интересно, могу помочь реализовать такой шаблон...
Можно подробнее, о чем идет речь (никогда не реализовывал ничего подобного). Можно ввиде реализации

Ещё один выход - использовать контейнеры list, vector, TList и другие.
Тут тоже, пару примерчиков, если можно...
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
08.09.2010, 12:04 7
Лучший ответ Сообщение было отмечено как решение

Решение

davian, для примера приведу шаблон для изменения размерности массива char:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <algorithm>
#include <iostream>
 
using namespace std;
//---------------------------------------------------------------------------
template <typename T>
T *resize(T *Array, size_t OldSize, size_t NewSize)
{
  T *Temp = new T[NewSize];
  delete [] Array;
  return copy(Array, Array + OldSize, Temp);
}
//---------------------------------------------------------------------------
int main()
{
  char *s = new char[5];
  char *t = "Test";
  char *u = "Another Test";
 
  copy(t, t + 5, s);
  cout << s << endl;
  s = resize(s, 5, 13);
  copy(u, u + 13, s);
  cout << s << endl;
 
  system("pause");
  return 0;
}
И небольшой примерчик работы с TList, используя вышеприведенный класс Temp:
C++
1
2
3
4
5
TList *TestList = new TList();
Temp *Test = new Temp();
Test->SetHW(2,5);
TestList->Add(Test);
ShowMessage(((Temp *)TestList->Items[0])->GetSquare());
То есть, TList выступает контейнером, в котором можно хранить объекты различных классов.
При этом, объекты хранятся как массив указателей и обращение к ним производится посредством приведения Items[index] к нужному типу.
4
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
08.09.2010, 12:31  [ТС] 8
MikeSoft, спасибо огромное за помощь. Я, пожалуй, воспользуюсь шаблоном...
0
08.09.2010, 12:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2010, 12:31
Помогаю со студенческими работами здесь

Массив экземпляров класса
Доброго времени суток уважаемые форумчане. Возник вопрос: как заполнять массив экземплярами класса...

Написать метод, инициализирующий массив экземпляров класса
метод инициализирует массив экземпляров класса , #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Как создать массив экземпляров класса, не проинициализировав его сразу?
Чтобы было что-то вроде такого: class Controller { public: User users;//ошибка, пустой, без...

Массив в классе инициализируется только 1 раз для всех экземпляров класса
Вопрос решен. Здравствуйте! Создается класс, в классе есть массив, который используется...

Как создать массив экземпляров класса для последующего обращения к его элементам по ссылке?
Всем здравствуйте. Вот код моего класса: class Param { private: int cnt; float akk;...

Как поступить, если необходимо создать массив экземпляров класса, но в классе нет конструктора по умолчанию?
Как поступить, если необходимо создать массив экземпляров класса, но в классе нет конструктора по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru