Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 13, 2011, 16:54



Название: typedef и предварительное описание
Отправлено: Igors от Сентябрь 13, 2011, 16:54
Добрый день

Пример: есть какие-то сторонние исходники (напр API) с самыми обычными описаниями

Код
C++ (Qt)
// User.h файл
struct Point;   // предварительное описание чтобы объявлять Point *, Point &
 
// User.cpp файл
#include "Point.h"   // подключили полное описание
 
Теперь мне понадобилось усовершенствовать класс Point. Написал свой класс
Код
C++ (Qt)
// Point.h
struct MyPoint {
...
};
 
typedef MyPoint Point;
 
Но по каким-то (мне непонятным причинам) это не сбивается с предварительным описанием (struct Point), говорит, мол, смотрите, Point oбъявлен как (и показывает на мой typedef). Почему, ведь typedef не создает новых типов?
 
Спасибо


Название: Re: typedef и предварительное описание
Отправлено: vincent от Сентябрь 14, 2011, 10:32
typedef не создает новых типов это точно, но он определяет альтернативное имя для существующего типа. Чего собственно у вас не получается - вы пытаетесь и альтернативное имя создать и в тоже время определить ему иной тип.
И, кстати, Point в приведенном примере не класс, а структура.


Название: Re: typedef и предварительное описание
Отправлено: Пантер от Сентябрь 14, 2011, 10:38
И, кстати, Point в приведенном примере не класс, а структура.
В с++ структура == класс.


Название: Re: typedef и предварительное описание
Отправлено: Igors от Сентябрь 14, 2011, 11:01
typedef не создает новых типов это точно, но он определяет альтернативное имя для существующего типа. Чего собственно у вас не получается - вы пытаетесь и альтернативное имя создать и в тоже время определить ему иной тип.
Почему же "иной" - ведь Point и MyPoint синонимы


Название: Re: typedef и предварительное описание
Отправлено: vincent от Сентябрь 14, 2011, 12:35
Вы полностью текст ошибки приведите.


Название: Re: typedef и предварительное описание
Отправлено: shirushizo от Сентябрь 14, 2011, 12:40
И, кстати, Point в приведенном примере не класс, а структура.
В с++ структура == класс.
В описании структур видимость по умолчанию  - public, а у классов - private=) Ну и остальные отличия... ;D



Название: Re: typedef и предварительное описание
Отправлено: Пантер от Сентябрь 14, 2011, 12:41
Остальных нет. Только этим и отличаются.


Название: Re: typedef и предварительное описание
Отправлено: slim от Сентябрь 14, 2011, 13:46
Остальных нет. Только этим и отличаются.

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


Название: Re: typedef и предварительное описание
Отправлено: Wlad_C от Сентябрь 14, 2011, 14:26
Цитировать
Но по каким-то (мне непонятным причинам) это не сбивается с предварительным описанием (struct Point), говорит, мол, смотрите, Point oбъявлен как (и показывает на мой typedef). Почему, ведь typedef не создает новых типов?
У Вас уже есть тип данных по названием Point. Вы создаете новый тип данных с названием MyPoint, Создаете ему псевдоним - Point. А теперь скажите: когда Вы в программе укажите имя Point, к какй тип данных должен взять компилятор - Point или MyPoint ?
Поэтому компилятор и сообщает об ошике!


Название: Re: typedef и предварительное описание
Отправлено: Igors от Сентябрь 14, 2011, 15:05
У Вас уже есть тип данных по названием Point.
Та откуда он там есть ?  :)
В аттаче микро-пример который нормально компилится - но только если в main.h я включаю include "Point.h". Но если вместо этого запишу struct Point., то получаю

Цитировать
/Users/../Point.h:8:0 /Users/../Point.h:8: error: conflicting declaration 'typedef struct MyPoint Point'
/Users/../main.h:5:0 /Users/../main.h:5: error: 'struct Point' has a previous declaration as 'struct Point'


Название: Re: typedef и предварительное описание
Отправлено: Igors от Сентябрь 14, 2011, 15:20
Ага, предварительное описание использовать можно, но надо писать

Код
C++ (Qt)
// struct Point;   // ошибка если Point определен через typedef
typedef struct MyPoint Point;  // такое предварительное описание проходит
 
При этом о MyPoint ничего больше неизвестно (в хедере). Хммм... а ведь я часто видел это в хедерах SDK