Russian Qt Forum
Ноябрь 23, 2024, 20:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: typedef и предварительное описание  (Прочитано 8926 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 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 не создает новых типов?
 
Спасибо
« Последнее редактирование: Сентябрь 13, 2011, 16:55 от Igors » Записан
vincent
Гость
« Ответ #1 : Сентябрь 14, 2011, 10:32 »

typedef не создает новых типов это точно, но он определяет альтернативное имя для существующего типа. Чего собственно у вас не получается - вы пытаетесь и альтернативное имя создать и в тоже время определить ему иной тип.
И, кстати, Point в приведенном примере не класс, а структура.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Сентябрь 14, 2011, 10:38 »

И, кстати, Point в приведенном примере не класс, а структура.
В с++ структура == класс.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 14, 2011, 11:01 »

typedef не создает новых типов это точно, но он определяет альтернативное имя для существующего типа. Чего собственно у вас не получается - вы пытаетесь и альтернативное имя создать и в тоже время определить ему иной тип.
Почему же "иной" - ведь Point и MyPoint синонимы
Записан
vincent
Гость
« Ответ #4 : Сентябрь 14, 2011, 12:35 »

Вы полностью текст ошибки приведите.
Записан
shirushizo
Гость
« Ответ #5 : Сентябрь 14, 2011, 12:40 »

И, кстати, Point в приведенном примере не класс, а структура.
В с++ структура == класс.
В описании структур видимость по умолчанию  - public, а у классов - private=) Ну и остальные отличия... Смеющийся

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Сентябрь 14, 2011, 12:41 »

Остальных нет. Только этим и отличаются.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
slim
Гость
« Ответ #7 : Сентябрь 14, 2011, 13:46 »

Остальных нет. Только этим и отличаются.

вообщето не только этим.. еще при наследование, у классов по умолчанию приват наследование, у структур паблик..
Записан
Wlad_C
Гость
« Ответ #8 : Сентябрь 14, 2011, 14:26 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Сентябрь 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'
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 14, 2011, 15:20 »

Ага, предварительное описание использовать можно, но надо писать

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


Страница сгенерирована за 0.123 секунд. Запросов: 23.