Вторник, 26 Ноября 2024, 13:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вопрос про классы в С++
TAPAKAHДата: Среда, 03 Марта 2010, 11:01 | Сообщение # 1
почетный гость
Сейчас нет на сайте
С классами особо работать не умею (грубо говоря только недавно для себя их открыл, хотя и раньше что-то слышал).
Пытаюсь сделать массив на пицот элементов типа Bullet.
Code
Bullet Bullets[500];

все прекрасно работает, пока не решишь выйти из програмы потом она говорит что происходит переполнение буфера.
почитал в тырнете нашёл строчку что это возможно связано с переполнением стека, и что правильно было бы выделять память под объект не в стеке, а в куче. Возможно я не правильно понял?
Далее исходя из своих соображений:
Code
Bullet *Bullets[500]= new Bullet;

на что в ответ получаю от компилятора:
Code
Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы

Что можете посоветовать почитать на эту тему? Ну или сам напишите доступным языком как правильно делать?


Все имеет свое имя и название.
Осмысливая смысл смысла, в смысле смысла смысла смысла, не смысл ли помыслить о немыслимом?
P:OG
Лишь идеи рождают шедевры.
ApatiДата: Среда, 03 Марта 2010, 11:51 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Вот так надо:
Code
Bullet *Bullets=new Bullet[500];

Потом удаление массива:
Code
delete []Bullets;
TAPAKAHДата: Среда, 03 Марта 2010, 13:24 | Сообщение # 3
почетный гость
Сейчас нет на сайте
да теперь нормально собирается работает... но при завершении программы все равно выскакивает бяка

Все имеет свое имя и название.
Осмысливая смысл смысла, в смысле смысла смысла смысла, не смысл ли помыслить о немыслимом?
P:OG
Лишь идеи рождают шедевры.
BOOMДата: Среда, 03 Марта 2010, 13:36 | Сообщение # 4
I am the creator of ADE
Сейчас нет на сайте
А можно в деструкторе Bullet прописать освобождение объектов класса, тогда тоже решается проблема.

Code

TBullet::~TBullet()
{
       delete []name;    //Удаляем массив символов, выделенный под имя
       delete variant;    //Удаляем какой то объект, который нужен для работы класса. :-)
}

Apati, Иногда не будит работать вариант создания объекта, без выше приведенного кода. С++ чем и "хорош", что требует полноценного контроля над памятью и объектами.

Вот еще вариант класса:

Code
class GBullets
{
private:
       vector<TBullet> Bullets;
public:
       void Add(TBullet &b)
       {
           Bullets.push_back(b);
       }
       void Pop()
       {
           Bullets.pop_back();
       }
       void Clear()
       {
           Bullets.clear();
       }
       int Size()
       {
           return (int)Bullets.size();
       }
};

В этом случае, перед завершением программы будит достаточно вызвать Clear(), T-Класс vector свою работу сделает.
Code
MyBullets.Clear();

Вот и зада решена, причем мы получаем класс GBullets с динамической "начинкой". В LIB С++ vector можно найти в соответствующем inc-файле: vector.h, vector.hpp или просто, vector

ЗЫ...
Код писал в ответе, могут быть и ошибки. smile


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Среда, 03 Марта 2010, 13:38
BOOMДата: Четверг, 04 Марта 2010, 15:33 | Сообщение # 5
I am the creator of ADE
Сейчас нет на сайте
Отвечаю на письмо, отправленное в личку, TAPAKAHом. Может кому и пригодится smile

РАЗЖОВЫВАЮ, ЧТО ТАКОЕ КОНСТРУКТОР И ДЕСТРУКТОР!

Ну там все просто. В конструкторе пишетутся конструкции объектов, а в деструкторе пишутся удаление этих объектов.
Вот пример:

Code

//Создадим класс
class a    
{
private:  //локально для класса (привратно)
     int x;
     int y;
     SObject *obj; //Некий нужный объект
     char *name; //Для имени
public:  //А после этого оператора, функции и переменные становятся доступными
     a(); //Первый конструктор
     a(int _X, int _Y); //Второй конструктор (То есть можно спокойно создавать до нескольких    
     //вариантов функций, где разница будит только в определении вгружаемых значений, или    
     //выводного значения *return*)

     //Некие функции...

     ~a();  //А это деструктор. Он вызывается автоматически оператором delete, либо
     //можно вызвать из объекта.
};

a::a()
{
     obj = new SObject(); //Создаем условный объект
     name = new char[50]; //Выделяем память для строки с именем
     x = y = 0; //Устанавливаем некие стандартные координаты
}

//Вариант второй конструктора
a::a(int _X, int _Y)
{
     //Здесь может быть практически тоже, но с легкой разницой.
     obj = new SObject(); //Создаем условный объект
     name = new char[50]; //Выделяем память для строки с именем
     x = _X; //В данном случае, этот конструктор устанавливает    
     y = _Y; //Введенные из вне координаты. Иногда удобно прибегать к
     //Такому варианту строения конструкторов.
}

//Теперь деструктор
a::~a()
{
     //В нем может быть любой код, но главная задача его - удалить    
     //из памяти все, что связано с объектом.
     delete obj; //Удаляем некий объект
     delete [] name; //Удаляем массив имени

     //Иногда, при удалении, строка: delete [] name может вызывать
     //Ошибку. В таком случае можно убпать квадратные скобочки.
     //delete name
     //И такой случай будит работать.
}

Поэксперементируй. Просто в теле деструктора впеши вызов Message. При удалении объекта, сообщение должно вылазить.

На счет конструкторов - добавлю. Он вызывается оператором new. С примером класса а, можно сделать так:

Code

void main()
{
     a * ob1 = new a(); //Создается объект, используя стандартные значения.
     //В этом случае x и y будут иметь значение нуля.
     a * ob2 = new a(10,20); //В этом случае, x будит равен 10, а y равен 20
     a * ob3 = new a(&ob1); //А этот вариант создаст копию объекта ob1.

     //...
}

Кстати & - необязателен. Но при его использовании, некоторые значений, переменные, классы и т.д. (в данном случае ob1) не смогут меняться внутри тела функции. (этот & можно использовать практически в любой функции.)

Ну вроде все... Разжувал, как смог.


______________________________
Я вернулся, и это чудо.
______________________________


Сообщение отредактировал BOOM - Четверг, 04 Марта 2010, 15:40
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг