Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Пользовательские классы


Автор: GLOOM 28.1.2006, 00:51
Вопрос такой как,куда добавлять собственные классы в форме чтоб потом ими пользоваться в bcb 6

Автор: Artemon 28.1.2006, 19:57
Во-первых: добавлять каждый класс нужно в отдельном файле (а лучше в двух)

Во-вторых:
Включать созданные файлы директивой #include "Имя файла"

Втретьих :
Создавать объект нужного тебе класаа.


А потом пользуйся сколько хочешь.


Автор: GLOOM 29.1.2006, 14:06
Сделал файл ".h" с классом
class Planet
{
public:
int a;
};

добавил его в Unit.cpp
создал экземпляр Planet* P
в обработчике кнопки написал
P->a = 1;

а мне выдают project raised exception class EAccessViolation with message "Access Violation at address 00401cc8 in modul "....exe" . Write of address 00000000.

Автор: BreakPointMAN 29.1.2006, 14:25
GLOOM, а как ты "создал экземпляр Planet* P" и где ты это сделал?

Автор: DeadSoul 29.1.2006, 14:37
Цитата(GLOOM @ 29.1.2006, 14:06 Найти цитируемый пост)

создал экземпляр Planet* P

GLOOM, ты создал не класс, а указатель на класс

Автор: GLOOM 29.1.2006, 15:11
Первое не понял что значит "ты создал не класс" если он у меня объявлен в ".h" и объясните как тогда создавать классы.

Второе у меня проект в нём форма в исходнике формы и создавал экземпляр простым объявлением а при нажатии кнопки на форме, менялось значение "а" у экземпляра класса.

третье не понял реплики
Цитата

GLOOM, ты создал не класс, а указатель на класс

извините я наверное выгляжу идиотом, но не объясните по подробнее

Автор: Artemon 29.1.2006, 15:15
GLOOM, ты все верно сделал, только в конструкторе формы добавь строку

Цитата

Planet = new P;



Автор: mr.Anderson 29.1.2006, 15:17
Как тут объяснишь? smile Вы создали УКАЗАТЕЛЬ на объект класса Planet, а не сам объект. Чтобы было нормально, вместо вашей строчки впишите
Код

Planet OBJECT;

А потом уже работайте с объектом. Если не понятна разница - объясняю: надо убрать звездочку перед именем объекта. Надеюсь, понятно объяснил.

Автор: Artemon 29.1.2006, 15:18
Если интересно про указатели - то прочитай любую книгу по C

Автор: mr.Anderson 29.1.2006, 15:18
Artemon, да зачем так париться! Видно же, что человек не разбирается пока в том, что такое указатели и с чем их едят, как и я, впрочем. Так что зачем вообще маяться с указателями? Убрал звездочку и все станет ОК!
Добавлено @ 15:19
Artemon, прочитать мало иногда бывает. smile По себе знаю.
Добавлено @ 15:22
GLOOM, чтобы было уж совсем понятно, давайте свой пример приведу.

В файле, предположим, myclass.h, пишем следующее:
Код

class MyClass
{
 public: void MyFunc(void);
};

void MyClass::MyFunc(void)
{
 printf("\nThis is method of my class!");
}

Усе! Теперь в основном файле программы пишем:
Код

#include "myclass.h"
//-------------------------------------
void main(void)
{
 MyClass MyObject1;
 MyObject1->MyFunc();
}

И все будет полный чпок! Понятно теперь? Я постарался максимально просто и понятно сделать.
Добавлено @ 15:24
GLOOM, и не забудьте плиз отписаться, поняли аль нет. Если еще вопросы, давайте их сюда. smile Мне ж тоже интересно, помогли ли вам мои объяснения или объяснения других людей.

Автор: GLOOM 29.1.2006, 17:08
первое я отлично понимаю разницу между объектом и указателем на него , даже более того я отлично понимаю разницу между ссылкой на объект и самим объектом.

Второе
Цитата

Вы создали УКАЗАТЕЛЬ на объект класса

Нааада же , а я то уже подумал что я создаю
Цитата

указатель на класс


Кстати кто-нибудь объяснит мне что такое указатель на класс?

sim7 хорошо оказывается разбираешся в указателях
сможешь сам найти ошибку в своём коде без помощи debuger'a

artemon
А почему нельзя просто написать
Planet* P; а нужно так
Planet* P = new Planet;

Автор: mr.Anderson 29.1.2006, 17:24
Цитата

Видно же, что человек не разбирается пока в том, что такое указатели и с чем их едят, как и я, впрочем

Пропустили эти слова, да? А я ж написал их, и они ясно говорят, что я тоже в указателях не разбираюсь.
Ладно. Хотел помочь, а получилось наоборот. Отлично...

Автор: BreakPointMAN 29.1.2006, 17:47
Цитата(GLOOM @ 29.1.2006, 17:08 Найти цитируемый пост)

А почему нельзя просто написать
Planet* P; а нужно так
Planet* P = new Planet;

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

Planet* P;

то ты создаешь указатель P, в котором может хранится адрес объекта класса Planet.
Но сейчас указтель P никуда не указывает, в нем находится мусор.

С помощью new ты создаешь новый объект класса Planet, операция new возвращает его адрес, и этим адресом инициализируется указатель P:
Код

Planet* P = new Planet;

То есть теперь существует и объект, и указатель на него. Поэтому ты можешь обращаться к нему в дальнейшем с помощью "->".


Автор: GLOOM 29.1.2006, 17:47
Ладно не парься sim7 меня чёто занесло

Если бы я совершенно не разбирался в указателях меня вот это поставило в тупик: указатель на класс

кстати
MyClass MyObject1;
MyObject1->MyFunc();

"звездочку" smile забыл перед MyClass или точку после MyObject1 заместо ->

и всётаки
почему нельзя просто написать
Planet* P; а нужно так
Planet* P = new Planet;
и не надо разъяснять что оператор new выделяет бла-бла-бла а почему bcb ругается

Автор: BreakPointMAN 29.1.2006, 17:54
Цитата(GLOOM @ 29.1.2006, 17:08 Найти цитируемый пост)

первое я отлично понимаю разницу между объектом и указателем на него , даже более того я отлично понимаю разницу между ссылкой на объект и самим объектом.

Боюсь, что не понимаешь... судя по вопросам в данном топике...
Цитата(GLOOM @ 29.1.2006, 17:47 Найти цитируемый пост)

почему bcb ругается

а BCB ругается потому, что не знает, к какому объекту обращаться... этого объекта просто нет, если ты пишешь:
Код

Planet* P;
P->a=1;

поскольку в P лежит мусор


Автор: GLOOM 29.1.2006, 18:00
File1.h:
class Pl
{
public:
int a ;
};



консольное приложение не форма
Unit1.cpp:
#include <iostream.h>
#include "File1.h"
int main(int argc, char* argv[])
{
Pl* Po;
Po->a = 0;
cout << Po->a;
cin >> Po->a;
return 0;
}
на экран выведет 0.
Цитата

сейчас указтель P никуда не указывает, в нем находится мусор

Тогда почему bcb не заикнулся даже что у меня в указателе мусор

Автор: BreakPointMAN 29.1.2006, 18:08
Цитата(GLOOM @ 29.1.2006, 18:00 Найти цитируемый пост)

Тогда почему bcb не заикнулся даже что у меня в указателе мусор

Счастливая случайность.
Советую почитать книгу по C++... smile
Разделы про указатели и про динамическое создание объектов.

Автор: GLOOM 29.1.2006, 18:18
Цитата

Советую почитать книгу по C++... 
Разделы про указатели и про динамическое создание объектов

Да и что мне там раскажут что иногда бывают "Счастливые случайности".

Автор: BreakPointMAN 29.1.2006, 18:27
GLOOM, тебе указали на ошибку, объяснили, почему так делать нельзя, посоветовали почитать конкретные разделы, чтобы восполнить пробел в знаниях... а ты все равно продолжаешь упираться...
О'кей! Хочешь узнать, почему у тебя программа заработала и не заглючила, хотя могла? Берешь в руки дизассемблер и отладчик, и роешь код. Возможно, на тебя снизойдет озарение и ты это поймешь. Но не проще ли это отложить до тех времен, когда тебе это действительно понадобится, а сейчас все делать красиво и по правилам?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)