Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 20.12.2016, 23:30   #1
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию Ошибка при создании классов

Объявляются два класса - точка и прямоугольник. Возникает ошибка компиляции
Цитата:
E2279 Cannot find default constructor to initialize member 'sm_rect:oint1'
В С++ builder первый день, в С++ третий. Перехожу с Делфи, на котором программировал лет пять назад
Код:

//класс точки
class sm_point
{
private:
        int x,y;
public:
        sm_point(int a, int b)
        {
                x=a;
                y=b;
        }
        ~sm_point();
};
//класс прямоугольника
class sm_rect
{
private:
        sm_point point1,
                 point2,
                 point3,
                 point4;
public:
        sm_rect(sm_point p1, sm_point p2, sm_point p3, sm_point p4)
                 {        /*подсвечивает эту строку красным при компиляции*/
                 point1=p1;
                 point2=p2;
                 point3=p3;
                 point4=p4;
                 }
        ~sm_rect() {}
};

При этом, если убрать определение функции инициализации sm_point (или если перегрузить её и добавить
Цитата:
sm_point() {}
) всё компилируется!
Прошу вашего совета
__________________
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 20.12.2016 в 23:38.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 09:16   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,779
Репутация: 1391

icq: 216409213
По умолчанию

А что вы хотите услышать другое от того, что вам сказал компилятор? Давайте я вам расскажу основы:
1. если вы определяете конструктор, то компилятор перестает заниматься своевольничаем и не генерит конструктор по умолчанию
2. если вы пишете, sm_point point1, то вызывается конструктор по умолчанию и если вы его не определили, то упс...
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 21.12.2016, 10:42   #3
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию

Как же всё просто..
То есть, конструктор по умолчанию вызывается даже тогда, когда я не ставлю скобки?
Код:

point1();

__________________
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 11:15   #4
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию

Ладно, эксперименты продолжаются.
Теперь у меня есть два конструктора, в том числе стандартный.
Но почему при объявлении в классе прямоугольника четырех точек с использованием нестандартного конструктора возникает ошибка компилятора?
Код:

/класс точки
class sm_point
{
private:
        int x,y;
public:

     sm_point()                     //стандартный конструктор
        {
                x=0;
                y=0;
        }
        sm_point(int a, int b)
        {
                x=a;
                y=b;
        }
        ~sm_point();
};
//класс прямоугольника
class sm_rect
{
private:
        sm_point point1(1,1),    //ошибка компилятора: ") expected"
                 point2(1,1),
                 point3(1,1),
                 point4(1,1);
public:
        sm_rect(sm_point p1, sm_point p2, sm_point p3, sm_point p4)
                 {
                 point1=p1;         //ошибка компилятора: "undefined symbol 'point1'"
                 point2=p2;
                 point3=p3;
                 point4=p4;
                 }
        ~sm_rect() {}
};

__________________
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 11:26   #5
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,779
Репутация: 1391

icq: 216409213
По умолчанию

Цитата:
То есть, конструктор по умолчанию вызывается даже тогда, когда я не ставлю скобки?
А как объект появится без вызова конструктора? По мановению палочки?

Цитата:
Но почему при объявлении в классе прямоугольника четырех точек с использованием нестандартного конструктора возникает ошибка компилятора?
point1{1,1}
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 21.12.2016, 11:33   #6
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию

point1{1,1} также не работает: "Declaration missing ;"
__________________
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 11:37   #7
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию

Встретил такое объявление функции:
Код:

 func(/*parameters*/) : /*something*/ {};

Что ставится после двоеточия? Роюсь по сайтам в поисках, но ничего пока не нашёл
__________________
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 11:46   #8
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,779
Репутация: 1391

icq: 216409213
По умолчанию

Цитата:
point1{1,1} также не работает: "Declaration missing ;"
Компилятор какой? В старых не было инициализации мемберов, только в конструкторе.

Цитата:
Что ставится после двоеточия? Роюсь по сайтам в поисках, но ничего пока не нашёл
Плохо роетесь. Это список инициализации конструктора. Т.е.
Код:

sm_rect(sm_point p1, sm_point p2, sm_point p3, sm_point p4) : point1(p1), point2(p2), point3(p3), point4(p4) {}

__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 21.12.2016, 12:02   #9
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Адрес: г. Магнитогорск
Сообщений: 193
Репутация: 28

icq: 383081882
По умолчанию

Использую C++ Bulder 6.
Я правильно понял, что список инициализации позволяет использовать такую запись?:
Код:

sm_point point1{1,1}

Я даже начал думать, что при объявлении класса нельзя инициализировать его переменные. Только при определении
__________________
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 21.12.2016 в 12:05.
Андрей 93 вне форума   Ответить с цитированием
Старый 21.12.2016, 12:22   #10
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 8,779
Репутация: 1391

icq: 216409213
По умолчанию

Цитата:
Я даже начал думать, что при объявлении класса нельзя инициализировать его переменные.
Я ж написал: в старых компиляторах и стандарте только в конструкторе, в "новых" добавили.

Не мучайте старичка, возьмите компилятор поновее если решили всерьез заняться программированием ,а не поиграться...
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при создании запроса edsjeka Помощь студентам 11 18.01.2016 23:12
Ошибка при создании модуля temka_buiko Паскаль 6 10.10.2012 22:17
Ошибка при создании COM сервера reggga C++ Builder 0 13.02.2012 18:22
Ошибка при создании БД alt5000 PHP и другие серверные скрипты 12 26.11.2011 18:46
Ошибка при создании домена JustPunk Помощь студентам 2 18.05.2011 19:48




01:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru