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


Автор: KasMP 15.7.2009, 12:14
Приветствую вас, мои самые-самые smile !

Предполагается такая структура классов и их наследников:
  • Figure
    • Point
    • Line
    • FilledFigure
      • Ellipse
      • Rectangle

Сейчас важны только Figure и Point.
Код

class Figure {
protected:
    char    type; // принимает значения от "0" до "4" (ничего, точка, линия, эллипс, прямоугольник)
    color    fpen; // объявлено выше: struct color {short r, g, g;};
public:
    bool ValidType (char i);
    Figure (ifstream *f, char ttype);
    Figure (char i, color j);
    // другие конструкторы
    // функции доступа
    virtual void Draw (HWND hWnd);
    virtual bool PtInFigure (POINT pt);
};


Код

class Point : public Figure {
protected:
    POINT    p;
public:
    Point (ifstream *f): Figure(ifstream *f,'1');
    // другие конструкторы
    // функции доступа
    void Draw (HWND hWnd);
    bool PtInFigure (POINT pt);
};


Предполагается, что точка задана в файле примерно так:
Цитата
point [три числа rgb] [два числа координат x и y]


С конструктором фигуры все очевидно (но приведу его на всякий случай - вдруг ключ к разгадке проблем именно в нем):
Код

Figure :: Figure (ifstream *f, char ttype) {
        *f >> fpen.r >> fpen.g >> fpen.b;
        type = ttype;};


С конструктором точки все тоже очевидно, но почему-то не работает:
Код

Point :: Point (ifstream *f): Figure(ifstream *f,'1') {*f >> p.x >> p.y;};


Т.е. получается так: мы узнали, что впереди точка; сначала вызвался конструктор Фигуры и прочитал цвет пера; потом вызвался конструктор производного класса Точка и прочитал координаты.
Но VS 2008 Express Edition совсем не думает, что все правильно и просто:
Цитата(Ошибки)

1> ... error C2144: syntax error : 'std::ifstream' should be preceded by ')'
1> ... error C2612: trailing 'type' illegal in base/member initializer list
1> ... error C2082: redefinition of formal parameter 'f'
1> ... error C2059: syntax error : 'constant'
1> ... error C2059: syntax error : ')'
1> ... error C2143: syntax error : missing ';' before '{'
Все ошибки относятся к строке с конструктором Точки:
Код

Point :: Point (ifstream *f): Figure(ifstream *f,'1') {*f >> p.x >> p.y;};


Я совсем не понимаю, что не так и что можно с этим сделать smile. Помогите, пожалуйста smile ...

Автор: mes 15.7.2009, 12:21
Цитата(KasMP @  15.7.2009,  11:14 Найти цитируемый пост)
 Point (ifstream *f): Figure(ifstream *f,'1');

 в объявлении конструктура список инициализации лишний.

P.S. привет.. давно тебя не было видно smile

Добавлено @ 12:23
Цитата(KasMP @  15.7.2009,  11:14 Найти цитируемый пост)
    char    type; // принимает значения от "0" до "4" (ничего, точка, линия, эллипс, прямоугольник)

не очень хорошое решение, чтоб объект базового класса знал о возможных наследниках.

Добавлено @ 12:24
P.S.. я так понял Вы теперь наконец то дошли до классов smile

Добавлено @ 12:33
Цитата(KasMP @  15.7.2009,  11:14 Найти цитируемый пост)
# Figure

    * Point
    * Line
    * FilledFigure
          o Ellipse
          o Rectangle

я надеюсь, что Point (:Figure) не используется как примитив Point для остальных фигур smile
 в том смысле, что точка-фигура и геометрическая точка на плоскости два разных объекта.

Автор: azesmcar 15.7.2009, 12:50
Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
 в объявлении конструктура список инициализации лишний.

Почему? В списке инициализации вызван конструктор базового класса, другое дело, что он вызван неправильно.

Код

Point (ifstream *f): Figure(f,'1'); //ifstream * вот это лишнее, это вызов а не объявление.


Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
не очень хорошое решение, чтоб объект базового класса знал о возможных наследниках.

 smile 

Автор: mes 15.7.2009, 12:57
Цитата(azesmcar @  15.7.2009,  11:50 Найти цитируемый пост)
Почему?

потому что это декларация, а не определение конструктора.

Цитата(azesmcar @  15.7.2009,  11:50 Найти цитируемый пост)
другое дело, что он вызван неправильно.

кстати да, в определении конструктора список инициализации вызывается неверно.

Автор: Леопольд 15.7.2009, 12:59
Цитата(KasMP @ 15.7.2009,  12:14)
Код

class Point : public Figure {
...
public:
    Point (ifstream *f): Figure(ifstream *f,'1');
...
};

Здесь синтаксическая ошибка.

Правильно вот так
class Point : public Figure {
...
public:
    Point (ifstream *f): Figure(ifstream *f,'1');
...
};

Автор: azesmcar 15.7.2009, 13:00
Цитата(mes @  15.7.2009,  12:57 Найти цитируемый пост)
потому что это декларация, а не определение конструктора.

 smile не заметил даже, а где определение? В любом случае в списке инициализации ошибка, в определении он нужен, но не в таком виде.

Автор: Леопольд 15.7.2009, 13:01
Цитата(azesmcar @ 15.7.2009,  12:50)
Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
 в объявлении конструктура список инициализации лишний.

Почему? В списке инициализации вызван конструктор базового класса, другое дело, что он вызван неправильно.

Я опоздал smile

Автор: mes 15.7.2009, 13:05
Цитата(Леопольд @  15.7.2009,  12:01 Найти цитируемый пост)
Я опоздал smile 

и {} забыл smile  Лучше поправить чтоб не путать топик-стартера smile 


Автор: Леопольд 15.7.2009, 14:07
Цитата(mes @ 15.7.2009,  13:05)
Цитата(Леопольд @  15.7.2009,  12:01 Найти цитируемый пост)
Я опоздал smile 

и {} забыл smile  Лучше поправить чтоб не путать топик-стартера smile

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

struct Class {
    int i;
    Class(void);
};
Class::Class(void):i(0){
    std::cout<<"Class::Class(void)"<<std::endl;
}


Или так:
Код

struct Class {
    int i;
    Class(void):i(0){
        std::cout<<"Class::Class(void)"<<std::endl;
    }
};

Автор: KasMP 16.7.2009, 10:21
Цитата(azesmcar @  15.7.2009,  12:50 Найти цитируемый пост)
Почему? В списке инициализации вызван конструктор базового класса, другое дело, что он вызван неправильно.

Цитата(mes @  15.7.2009,  12:57 Найти цитируемый пост)
кстати да, в определении конструктора список инициализации вызывается неверно.

Цитата(azesmcar @  15.7.2009,  12:50 Найти цитируемый пост)
Point (ifstream *f): Figure(f,'1'); //ifstream * вот это лишнее, это вызов а не объявление.

Спасибо вам огромное! Я бы еще долго искала эту незаметную ошибку... Глупее не придумать smile !
Цитата(Леопольд @  15.7.2009,  12:59 Найти цитируемый пост)
public:
    Point (ifstream *f): Figure(ifstream *f,'1');

smile smile
Цитата(azesmcar @  15.7.2009,  12:50 Найти цитируемый пост)

Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)

не очень хорошое решение, чтоб объект базового класса знал о возможных наследниках.
 smile  
 

Я думаю, я совсем уберу этот член: по типу переменной и так понятно, к какому классу-наследнику относится объект - зачем дублировать еще раз smile smile ?
Цитата(mes @  15.7.2009,  13:05 Найти цитируемый пост)
и {} забыл smile  Лучше поправить чтоб не путать топик-стартера 

Да ладно, с ошибками даже лучше: человек больше вдумывается, больше понимает, больше пишет сам, ... smile .
Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
P.S. привет.. давно тебя не было видно

smile smile
Неправда smile ! Я http://forum.vingrad.ru/act-Search/CODE/show/searchid-230bfc2f8c6438475cacf2e9a01bc531/search_in-posts/result_type/posts/flag/search/index.html smile ...
А ты здесь уже совсем освоился smile smile .
Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
P.S.. я так понял Вы теперь наконец то дошли до классов 

Мы давно до них дошли smile (и ответы на свои вопросы у меня получалось находить smile ), а наследование зачем-то пропустили... Вот я и занимаюсь им сама (с вашей помощью smile ).
Цитата(mes @  15.7.2009,  12:21 Найти цитируемый пост)
я надеюсь, что Point (:Figure) не используется как примитив Point для остальных фигур smile
 в том смысле, что точка-фигура и геометрическая точка на плоскости два разных объекта.

Нет, конечно smile !
Как тебе вообще такая мысль в голову пришла smile  smile  smile ???

Автор: mes 16.7.2009, 10:56
Цитата(KasMP @  16.7.2009,  09:21 Найти цитируемый пост)
Неправда smile ! Я здесь smile ...

ну так это больше там, чем здесь  smile  я в ту "даль" редко заглядываю, поэтому и не замечал smile

Цитата(KasMP @  16.7.2009,  09:21 Найти цитируемый пост)
Я думаю, я совсем уберу этот член: по типу переменной и так понятно, к какому классу-наследнику относится объект - зачем дублировать еще раз smile smile ?

 smile  smile 

Цитата(KasMP @  16.7.2009,  09:21 Найти цитируемый пост)
а наследование зачем-то пропустили... Вот я и занимаюсь им сама (с вашей помощью smile ).

 smile 



Цитата(KasMP @  16.7.2009,  09:21 Найти цитируемый пост)
Цитата

я надеюсь, что Point (:Figure) не используется как примитив Point для остальных фигур smile
 в том смысле, что точка-фигура и геометрическая точка на плоскости два разных объект
а.
Нет, конечно smile !
Как тебе вообще такая мысль в голову пришла smile  smile  smile ??? 

посмотрел повнимательней, действительно нет :
Цитата(KasMP @  15.7.2009,  11:14 Найти цитируемый пост)
class Point : public Figure {
protected:
    POINT    p;

приношу извинения за ложную тревогу.   smile 
просто это самая распространенная ошибка при  составлении иерархии классов фигур.

кстати заглавными буквами в C++ принято именовать макросы, и некрасиво смотрится когда также называют типы или переменные.

Автор: KasMP 16.7.2009, 11:49
Цитата(mes @  16.7.2009,  10:56 Найти цитируемый пост)
ну так это больше там, чем здесь  smile  я в ту "даль" редко заглядываю, поэтому и не замечал smile

Заглядывай туда чаще - там тоже интересно smile .
Цитата(mes @  16.7.2009,  10:56 Найти цитируемый пост)
посмотрел повнимательней, действительно нет :

smile
Цитата(mes @  16.7.2009,  10:56 Найти цитируемый пост)
кстати заглавными буквами в C++ принято именовать макросы, и некрасиво смотрится когда также называют типы или переменные.

smile Заглавными буквами в WinAPI обозначаются именно типы, крепко-крепко связанные с этой самой WinAPI: HWND, HDC, RECT, HGDIOBJ, HPEN, HBRUSH, HFONT, COLORREF и, конечно же, POINT smile smile .

Автор: mes 16.7.2009, 12:13
Цитата(KasMP @  16.7.2009,  10:49 Найти цитируемый пост)
smile Заглавными буквами в WinAPI обозначаются именно типы, крепко-крепко связанные с этой самой WinAPI: HWND, HDC, RECT, HGDIOBJ, HPEN, HBRUSH, HFONT, COLORREF и, конечно же, POINT smile smile . 

ах да.. забыл про эти "пережитки" .. в .Net  они уже называются "по-человечески":
http://msdn.microsoft.com/ru-ru/library/system.drawing.aspx
smile

P.S. ox чувствую, что достанется мне сейчас за эти  "пережитки", "по-человечески" и за оскорбление религиозных чувств. 
будем надеяться, что пронесет..
smile


Автор: KasMP 16.7.2009, 13:20
Имхо логично придерживаться правил, связанных именно с тем, где ты сейчас, а не правил какого-то мифического пространства smile .
Цитата(mes @  16.7.2009,  12:13 Найти цитируемый пост)
P.S. ox чувствую, что достанется мне сейчас за эти  "пережитки", "по-человечески" и за оскорбление религиозных чувств. 
будем надеяться, что пронесет..

Конечно, достанется smile : разве можно использовать такое тяжелое оружие как .Net, знакомый мне только понаслышке smile , нагрузить все это неопровержимой ссылкой   smile  и в итоге оставить меня совсем без возможности что-то возразить smile smile (и еще все сложные слова взять в кавычки smile  smile ).

Автор: mes 16.7.2009, 13:24
Цитата(KasMP @  16.7.2009,  12:20 Найти цитируемый пост)
Имхо логично придерживаться правил, связанных именно с тем, где ты сейчас, а не правил какого-то мифического пространства smile .

Ну да никуда не деться, если работать с WinAPI придется подстраиваться под их среду.
smile

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