Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор производного класса, параметр - указатель на ifstream 
V
    Опции темы
KasMP
Дата 15.7.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Приветствую вас, мои самые-самые 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 ...

Это сообщение отредактировал(а) KasMP - 15.7.2009, 12:17
PM MAIL   Вверх
mes
Дата 15.7.2009, 12:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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
 в том смысле, что точка-фигура и геометрическая точка на плоскости два разных объекта.


Это сообщение отредактировал(а) mes - 15.7.2009, 12:37


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.7.2009, 12:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

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

Код

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


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

 smile 
PM   Вверх
mes
Дата 15.7.2009, 12:57 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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

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

Это сообщение отредактировал(а) mes - 15.7.2009, 13:00


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 15.7.2009, 12:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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');
...
};


Это сообщение отредактировал(а) Леопольд - 15.7.2009, 13:00


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 15.7.2009, 13:00 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

 smile не заметил даже, а где определение? В любом случае в списке инициализации ошибка, в определении он нужен, но не в таком виде.
PM   Вверх
Леопольд
Дата 15.7.2009, 13:01 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

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

Я опоздал smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 15.7.2009, 13:05 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



Это сообщение отредактировал(а) mes - 15.7.2009, 13:06


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 15.7.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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;
    }
};


Это сообщение отредактировал(а) Леопольд - 15.7.2009, 14:27


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
KasMP
Дата 16.7.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(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 ! Я здесь 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 ???
PM MAIL   Вверх
mes
Дата 16.7.2009, 10:56 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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++ принято именовать макросы, и некрасиво смотрится когда также называют типы или переменные.



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 16.7.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(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 .
PM MAIL   Вверх
mes
Дата 16.7.2009, 12:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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




--------------------
PM MAIL WWW   Вверх
KasMP
Дата 16.7.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



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

Конечно, достанется smile : разве можно использовать такое тяжелое оружие как .Net, знакомый мне только понаслышке smile , нагрузить все это неопровержимой ссылкой   smile  и в итоге оставить меня совсем без возможности что-то возразить smile smile (и еще все сложные слова взять в кавычки smile  smile ).
PM MAIL   Вверх
mes
Дата 16.7.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5326 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.