Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
DARKDOOM
1 / 1 / 0
Регистрация: 02.09.2009
Сообщений: 7
#1

Классы - C++ Builder

04.09.2009, 09:40. Просмотров 1127. Ответов 12
Метки нет (Все метки)

Здравствуйте!

Итак, вопрос: как вернуть название объекта?

Предположим, есть класс

C++
1
2
3
4
class ship
{
...
};
Далее создаём объект

C++
1
ship Zed;
как создать, скажем свой битмап для каждого объекта, прописанного в классе? Думал через

C++
1
2
3
Graphics::TBitmap *"Имя объекта + bitmap"  = new Graphics::TBitmap();
 
"Имя объекта + bitmap"->LoadFromFile("имя.bmp");
Но столкнулся с проблемой названий.

Хотелось - бы , в идеале, указывать путь через класс, для упрощённой работы, вида

C++
1
Zed.bitmap="имя.bmp";
Но не знаю как...

Думаю, говорить что я новичок не обязательно, но всё же, сильно не пинайте.

P.S.

Если мыслю вообще не в том направлении, наставьте на путь истинный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2009, 09:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Классы (C++ Builder):

Классы - C++ Builder
Нужно сделать иерархию из основных деталей которые используютcя в электронике Используя при этом классы Всего 5 элементов, на каждый...

Классы - C++ Builder
Прижало тут задачку сделать, а я чет туплю, ни как не получается.М.б. поможете? Создайте класс с именем Complex, позволяющий...

классы - C++ Builder
Помогите, пожалуйста, написать прогу с помощью классов... к примеру? на сумму всех эелементов матрицы...visual 2008 Добавлено через...

Классы - C++ Builder
Совсем не разбираюсь в классах, а нужно прогу сдать. 1. Описать класс Points, затем производный от него Circle. Создать динамический...

Классы - C++ Builder
Необходимо разработать программу классов больных. Параметры фамилия и возраст. Может есть у кого пример реализации классов на билдере? ...

Классы - C++ Builder
Вынужден снова обратиться за помощью. Вот мой .h файл #include <Buttons.hpp> #include <Chart.hpp> #include <ExtCtrls.hpp> #include...

12
solar_wind
760 / 751 / 42
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
04.09.2009, 11:02 #2
"Название объекта" это всего лишь типизированная ссылка на область памяти, на один и тот же объект может ссылаться сколько угодно указателей. Самое лучшее, с моей точки зрения, создать в классе поле, которое будет обозначать название конкретного объекта. При создании объекта это поле заполняется нужными данными и в дальнейшем используется.
1
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
04.09.2009, 11:05 #3
Пусть будет в классе
C++
1
2
3
4
5
6
7
class ship
{
---------
  Graphics::TBitmap *bmp;
  String name_bmp;
--------
};
Инициируем класс:
C++
1
2
3
4
ship sh;
sh.name_bmp = "имя.bmp";
sh.bmp = new Graphics::TBitmap();
sh.bmp->LoadFromFile(sh.name_bmp);
Как-то вот так...
1
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
04.09.2009, 12:31 #4
В классе члены приватные по-умолчанию. Поэтому надо писать public:
C++
1
2
3
4
5
6
class ship
{
public:
  Graphics::TBitmap *bmp
...
}
Далее, в конструкторе иницыируем его. Не забыть в деструкторе убрать битмап. Поскольку, битмап - динамический, в классе нужно создать ещё операторы копирования и присваивания.
1
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
04.09.2009, 12:47 #5
Airhand, Абсолютно с Вами согласен! Простите, что не уточнил
0
DARKDOOM
1 / 1 / 0
Регистрация: 02.09.2009
Сообщений: 7
04.09.2009, 21:46  [ТС] #6
Попробовал так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ship
{
 public:
  Graphics::TBitmap *bmp;
  void pic(UnicodeString bmp_path);
};
 
void ship::pic(UnicodeString bmp_path)
{
 ship::bmp->LoadFromFile(bmp_path);
}
 
ship black;
black.pic("C:\plane.bmp");
Canvas->Draw(20,20,black.bmp);
Ругается на 10-ю строку. Похоже, я что-то не так делаю...
0
Otaka
1827 / 685 / 18
Регистрация: 11.12.2008
Сообщений: 1,019
04.09.2009, 21:54 #7
C++
1
2
3
4
void ship::pic(UnicodeString bmp_path)
{
bmp->LoadFromFile(bmp_path);
}
Вот только будет эксепшн, так как ты не выделяешь память под рисунок.
Было бы хорошо определить конструктор и деструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
class ship
{
 public:
  Graphics::TBitmap *bmp;
  ship(){bmp=new Graphics::TBitmap();}
  ~ship()
          {
           if(bmp!=NULL)delete bmp;
           }
  void pic(UnicodeString bmp_path);
};
Добавлено через 1 минуту
Кстати. Когда пишешь на форум:
Цитата Сообщение от DARKDOOM Посмотреть сообщение
Ругается на 10-ю строку
Копируй сюда также то, какими именно словами он ругается.
1
Rififi
2363 / 1056 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
04.09.2009, 21:55 #8
DARKDOOM,
Ругается на 10-ю строку. Похоже, я что-то не так делаю...
Случай конечно тяжелый, но медицина помочь в состоянии.
необходимо срочно записаться на приём к доктору, желательно сразу к нескольким: Шилдт, Липман, Страуструп etc...

ship::bmp->LoadFromFile(bmp_path);

помимо того, что переменная bmp не проинициализирована и во время работы программы произойдет попытка выполнения случайного участка памяти, так ещё запись вида ship::bmp означает обращение к статической переменной, коей в данном случае не наблюдается.
1
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
04.09.2009, 21:59 #9
Цитата Сообщение от DARKDOOM Посмотреть сообщение
C++
1
black.pic("C:\plane.bmp");
Не забывай, в С++ ставится двойной слеш. Вот так:
C++
1
black.pic("C:\\plane.bmp");
1
DARKDOOM
1 / 1 / 0
Регистрация: 02.09.2009
Сообщений: 7
04.09.2009, 22:10  [ТС] #10
Извиняюсь
До этого было 10-я строка

Код
First chance exception at $7C812AEB. Exception class EAccessViolation with message 'Access violation at address 00401AFF in module 'Project1.exe'. Read of address 00000000'. Process Project1.exe (2528)
С переписаном вами, Otaka, классом, ругань такая
Код
[ILINK32 Error] Error: Unresolved external 'ship::pic(System::UnicodeString)' referenced from D:\DOCS\RAD STUDIO\PROJECTS\CLASSES\DEBUG\UNIT1.OBJ
[ILINK32 Error] Error: Unable to perform link
0
Otaka
1827 / 685 / 18
Регистрация: 11.12.2008
Сообщений: 1,019
04.09.2009, 22:17 #11
Вот видишь. Все стало гораздо понятнее. У тебя был ексепшн, так как ты не делал new.
А, я ведь только кусок привел, чтобы ты поменял.
Так ругаться будет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ship
{
 public:
  Graphics::TBitmap *bmp;
  ship(){bmp=new Graphics::TBitmap();}
  ~ship()
          {
           if(bmp!=NULL)delete bmp;
           }
  void pic(UnicodeString bmp_path)
          {
          bmp->LoadFromFile(bmp_path);
          }
};
1
DARKDOOM
1 / 1 / 0
Регистрация: 02.09.2009
Сообщений: 7
04.09.2009, 22:52  [ТС] #12
Спасибо, всё работает!

Теперь хоть понял основную структуру класса, а также увидел реальный пример деструктора и зачем его делать. Ещё один шаг в усвоении.
Приятно, когда люди адекватно реагируют на человека со скудными знаниями в их профессиональной сфере. Авось, через пару лет упорного труда и я к вам примкну(всмысле к программистам).

Спасибо всем кто отписался и поделился собственным мнением и профессиональным советом!
0
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
05.09.2009, 12:26 #13
Цитата Сообщение от Rififi Посмотреть сообщение
так ещё запись вида ship::bmp означает обращение к статической переменной, коей в данном случае не наблюдается.
Запись вида ship::bmp означает обращенме к классу ship к переменной bmp. Это тебе надо почить Страуструпа, чтобы не писать такую чущь. :: - это спецификатор области видимости, а не указатель на то, что это статическая переменная. Как ты тогда оценишь ::Sleep(10); ? Какая статическая переменная ? Это же функция. А эта запись означет, что мы берем внешнюю по отношению к нашей области функцию, чтобы не вызвать переопределённую.
0
05.09.2009, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2009, 12:26
Привет! Вот еще темы с ответами:

Классы в Builder - C++ Builder
Подскажите пж в чем может быть ошибка! Код написала как в практической было)) Ощибку вот здесь выдает class Plus: public Telement{ ...

Классы и их свойства - C++ Builder
Создадим приложение, которое взаимодействует с иерархией классов: TAnimal (базовый класс) и THuman, TDog, TCat (дочерние классы)....

Классы в C++ Builder - C++ Builder
Есть класс для массива. Файл класса Unit2.h const int Nmax=100; class mas{ private: int FN; int FA; public: void FNN(int...

Классы в билдере - C++ Builder
КаК в билдере инициализировать класс и как потом из него достать нужную переменную или функцыю? Заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru