С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183

Непонятки с конструктором класса

31.10.2010, 10:46. Показов 1593. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал простенький класс, и не менее сложный конструктор и при компиляции вадает ошибки. Может компилятор нагибается потихоньку ? Ну или что не так написал или наоборот не дописал, подскажите. Спасибо за внимание )

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
class BOT {
  BOT(int);
  int lvl;
  int hp;
  int dmg;
  int speed;
  int coordX;
  int coordY;
  char bot_name[20];
  char bot_img[20];
  int GoX;
  int GoY;
};
 
BOT::BOT(int create_lvl) {//вот у этой скобки ошибка E2089
  char botname[] = "Мародер";
  lvl = create_lvl;
  hp = lvl*5;
  dmg = lvl;
  speed = random(5)+5;
  coordX = 100;
  coordY = 100;
  strcpy(bot_name,botname);
  strcpy(bot_img,".//bot.bmp");
}
[BCC32 Error] Unit1.h(30): E2089 Identifier '{' cannot have a type qualifier
[BCC32 Error] Unit1.h(30): E2251 Cannot find default constructor to initialize base class 'TForm'
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.10.2010, 10:46
Ответы с готовыми решениями:

Непонятки с конструктором
Вопрос такой, допустим я создал класс и в конструкторе ,в параметрах прописал два переменных , и когда наследуешь его , ты и в других...

Непонятки с конструктором копирования
class Table { Row* p; size_t size; public: Table(int i = 0) { p = new Row; size = i; }

Рандомная дата GregorianCalendar и непонятки с конструктором
Создал класс Student, у которого имеется поле GregorianCalendar birthday. Рандомную дату реализовал следующим способом. //birthday...

9
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
31.10.2010, 11:03
самое интересное, что билдер при создании окна порождает новенький класс, неужели сложно изучить его конструктор?...

не уверен, что все конструкторы должны быть такими по форме, но один хотя бы точно должен присутствовать:

C++
1
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
31.10.2010, 11:50  [ТС]
Если я правильно понял:

Огрызок Unit1.h
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
31
32
33
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
 
class BOT {
  BOT(int);
  int lvl;
  int hp;
  int dmg;
  int speed;
  int coordX;
  int coordY;
  char bot_name[20];
  char bot_img[20];
  int GoX;
  int GoY;
};
 
BOT::BOT(int create_lvl) {
  char botname[] = "Мародер";
  lvl = create_lvl;
  hp = lvl*5;
  dmg = lvl;
  speed = random(5)+5;
  coordX = 100;
  coordY = 100;
  strcpy(bot_name,botname);
  strcpy(bot_img,".//bot.bmp");
}
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
"Огрызок" Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
BOT bot;
}
//---------------------------------------------------------------------------
Но здесь не чего не изменилось, я не изобретал велосипеда, и создал готовый проект в билдере, который компилировался и выводил пустое окно на экран, Но вставив свой класс, появились ошибки. Я грешу на свою не граммотность в создании конструктора класса. Как создавать конструктор я узнал из книги по С++ за 21 день, которая, строго говоря, наверно, больше ориентирована на Visual C++. Может есть какие различия в синтаксисе написания конструторов в визуал и билдере ? (

Добавлено через 20 минут
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
Если рассматривать этот конструктор, то он отличается от моего, только тем, (1)что использует __fastcall, (2)В качестве значения ему передается указатель и (3) он использует иницилизацию TForm(Owner), вместо эквивалентного присвоения TForm = Owner.

Я сделал аналогично :

C++
1
2
3
4
5
6
7
8
9
 BOT::BOT(int create_lvl):
   lvl(create_lvl),
   hp(lvl*5),
   dmg(lvl),
   speed(random(5)+5),
   coordX(100),
   coordY(100),
   bot_name("Мародер"),
   bot_img(".//bot.bmp")
Хоть в книге первые главы все присваивалось в { .. } и если закрыть глаза на то, что меня это не устраивает =( ...так как невозможно создать ветвление процесса при создании нового Bot'a. Факт остается фактом - все те же ошибки )))) И чесно говоря, это вызывает на моем лице улыбку, так как нету там уже этих скобок ))))))
0
 Аватар для Lerny
56 / 56 / 10
Регистрация: 14.03.2010
Сообщений: 157
31.10.2010, 11:52
Deimon,
Странно, у меня Билдер сжирает этот класс, правда потом уже в самой программе при создании объекта такого класса не находит конструктор, ну оно и понятно.
Попробуй добавить public:
C++
1
2
3
4
class BOT {
public:
  BOT(int);
...
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
31.10.2010, 11:58  [ТС]
Цитата Сообщение от Lerny Посмотреть сообщение
Попробуй.
Попробывал, но нечего не изменилось.


Цитата Сообщение от Lerny Посмотреть сообщение
Странно, у меня Билдер сжирает этот класс, правда потом уже в самой программе при создании объекта такого класса не находит конструктор, ну оно и понятно.
Не понял метфоры, всмысле, этот код у вас компилируется и запускается? Или не выдает тех ошибок что у меня а выдает ошибку при создании BOT bot; ругаясь на конструктор?
0
 Аватар для Lerny
56 / 56 / 10
Регистрация: 14.03.2010
Сообщений: 157
31.10.2010, 12:01
Цитата Сообщение от Deimon Посмотреть сообщение
Не понял метфоры, всмысле, этот код у вас компилируется и запускается? Или не выдает тех ошибок что у меня а выдает ошибку при создании BOT bot; ругаясь на конструктор?
Код компилируется без проблем.
Но когда я создаю объект (BOT bot1(4)), то он у меня ругался на конструктор. Добавил public и всё летает.
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
31.10.2010, 12:25  [ТС]
Цитата Сообщение от Lerny Посмотреть сообщение
Код компилируется без проблем.
Чесно говоря, все дошло до полного абсурда:

C++
1
2
3
4
5
6
7
class BOT {
  public:
  BOT (int y): x(y) {}
  int x;
};
 
BOT bot(4);  //BOT bot( тут_хочет_поставить_скобку 4);
Ошибка:
[BCC32 Error] Unit1.h(22): E2293 ) expected


Вообщем, я так понял, он хочет использовать стандартный конструтор BOT() вместо моего BOT(int). Вот только вопрос, почему он не дает мне использовать мой (0__о)... может с компилятором проблеммы ?


Цитата Сообщение от Lerny Посмотреть сообщение
Добавил public и всё летает.
На сколько я знаю, добавление public не чего не меняет, так как данные доступны по умолчанию. Вообщем class и struct не чем не отличаются кроме как, то что класс может иметь закрытые и открытые методы:
C++
1
2
3
4
5
6
7
8
9
10
class BOT {
  public:
    ...
  private:
    ...
};
 
struct BOT {
  ...
};
Тоесть на данном (моем) этапе я могу класс заменить структурой и не чего не изменится. Впрочем не чего и не изменилось поменяв класс на структуру, выдает те же ошибки =(
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
01.11.2010, 00:01
В классе по умолчанию данные записываются в privat раздел.
C++
1
2
3
4
5
class BOT {
  BOT(int);
  int lvl;
  int hp;
  int dmg;
Это я из той же книги переделывал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
unit1.h
class Tame
{
public:
// Tame();
 Tame(int=0,int=0,int=0);
 void setTime(int,int,int);//запись в класс
 void setTim(int,int,int);
 void printMilitary();
 void printStandart();
 friend void setTa(Tame*);
// friend void setTa(Tame*,int,int,int);
 
private:
 int hour;
 int minute;
 int second;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unit1.cpp
Tame::Tame(int hr,int min,int sec)
{
setTime(hr,min,sec);//или если h,m,s чему то равны //setTime(h,m,s);
}
//запись в класс-------------------------------------------------------------
void Tame::setTime(int h,int m,int s)
{
 if (h>=0&&h<24) hour=h;
 else hour=0;//hour=(h>=0&&h<24) ? h : 0;
 minute=(m>=0&&m<60) ? m : 0;
 second=(s>=0&&s<60) ? s : 0;
}
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
01.11.2010, 09:49  [ТС]
Цитата Сообщение от Grey Посмотреть сообщение
В классе по умолчанию данные записываются в privat раздел.
Странно, этот класс компилится.....а мой нет.
У меня работает мой конструктор который создает все как надо, но он работает без передачи ему каких либо значений ( BOT bot; ) ...тоесть у меня проблема токльо с этим(((((

А насчет того что все члены в привате находятся - я так не думаю, вернее это чушь. Если бы они были в привате, то я создав объект класса не смог бы получить доступ ни к одному из методов или переменных этого объекта. Но всеровно я приписал public и всеровно не работает =( Я просто не понимаю что за ИИ меня так ненавидит XDDDD

Попробуйте сами создать класс без привата и паблика... и создав объект, обратиться к нему. Если все привате, то компилятор не даст обратиться ни к чему.
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
01.11.2010, 17:27
Цитата Сообщение от Deimon Посмотреть сообщение
Огрызок Unit1.h
Ой не знаю, кто вас учил описывать код в заголовочном файле, но скажу, что это извращение.
Вас правильно советуют посмотреть на области класса (а ещё лучше - почитать литературу).

Исправленный вариант ниже.

Объявление в хидере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BOT {
  private:
    int lvl;
    int hp;
    int dmg;
    int speed;
    int coordX;
    int coordY;
    char bot_name[20];
    char bot_img[20];
    int GoX;
    int GoY;
  public:
    BOT(int);
};
Описание конструктора в файле с кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
BOT::BOT(int create_lvl) {
  char botname[] = "Мародер";
  lvl = create_lvl;
  hp = lvl*5;
  dmg = lvl;
  speed = random(5)+5;
  coordX = 100;
  coordY = 100;
  strcpy(bot_name,botname);
  strcpy(bot_img,".//bot.bmp");
}
И для примера динамическое создание объекта:
C++
1
BOT *TestBot = new BOT(5);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.11.2010, 17:27
Помогаю со студенческими работами здесь

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Приведите пример класса с методом и конструктором. Создайте экземпляр этого класса. Правильный ли пример?
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } }

Дополнение класса конструктором и деструктором
Дополнить класс прямоугольника: перегруженным конструктором, деструктором и перегруженной операцией «+» (в результате добавления получается...

Создание класса с определенным конструктором
Добрый день! Буду благодарен если поможете создать класс VectorEntry который будет соответствовать данному коду: VectorEntry...

Инициализация полей класса конструктором
Добрый день! возникла такая проблема. Необходимо создать класс Polygon, в котором создать конструктор, принимающий один параметр -...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru