Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Объявляются два класса - точка и прямоугольник. Возникает ошибка компиляции
Цитата:
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 в 22:38.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 08:16   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

Как же всё просто..
То есть, конструктор по умолчанию вызывается даже тогда, когда я не ставлю скобки?
Код:
point1();
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 10:15   #4
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Ладно, эксперименты продолжаются.
Теперь у меня есть два конструктора, в том числе стандартный.
Но почему при объявлении в классе прямоугольника четырех точек с использованием нестандартного конструктора возникает ошибка компилятора?
Код:
/класс точки
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, 10:26   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

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

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

Встретил такое объявление функции:
Код:
 func(/*parameters*/) : /*something*/ {};
Что ставится после двоеточия? Роюсь по сайтам в поисках, но ничего пока не нашёл
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 10:46   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
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, 11:02   #9
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Использую C++ Bulder 6.
Я правильно понял, что список инициализации позволяет использовать такую запись?:
Код:
sm_point point1{1,1}
Я даже начал думать, что при объявлении класса нельзя инициализировать его переменные. Только при определении
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 21.12.2016 в 11:05.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 11:22   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при создании запроса edsjeka Помощь студентам 11 18.01.2016 22:12
Ошибка при создании модуля temka_buiko Паскаль, Turbo Pascal, PascalABC.NET 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