Рассмотрим этот класс из WinAPI:
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
Я улучшаю его в классе с именем Rect
который позволяет умножать / складывать / вычитать / сравнивать два Rect
с, наряду с другими функциями. Единственная реальная причина, по которой мне нужен мой Rect
класс, чтобы знать о RECT
потому что класс имеет оператор преобразования, который позволяет Rect
быть переданным как RECT
и быть назначенным RECT
,
Но в файле Rect.h
Я не хочу включать <Windows.h>
Я только хочу включить <Windows.h>
в исходном файле, чтобы я мог сохранить дерево включения небольшим.
Я знаю, что структуры могут быть переданы так: struct MyStruct;
Но фактическое название структуры tagRECT
и у него есть список объектов, так что я не совсем понимаю, как его переслать. Вот часть моего класса:
// Forward declare RECT here.
class Rect {
public:
int X, Y, Width, Height;
Rect(void);
Rect(int x, int y, int w, int h);
Rect(const RECT& rc);
//! RECT to Rect assignment.
Rect& operator = (const RECT& other);
//! Rect to RECT conversion.
operator RECT() const;
/* ------------ Comparison Operators ------------ */
Rect& operator < (const Rect& other);
Rect& operator > (const Rect& other);
Rect& operator <= (const Rect& other);
Rect& operator >= (const Rect& other);
Rect& operator == (const Rect& other);
Rect& operator != (const Rect& other);
};
Будет ли это действительным?
// Forward declaration
struct RECT;
Моя мысль нет, так как RECT
это просто псевдоним tagRECT
, Я имею в виду, я знаю, что заголовочный файл все равно будет действителен, если я это сделаю, но когда я создаю исходный файл Rect.cpp
и включать <Windows.h>
там я боюсь, что именно там я буду испытывать проблемы.
Как я мог переслать объявить RECT
?
Спасибо заранее 🙂
Вам не нужно знать определение функции, прежде чем разыменовывать тип.
Таким образом, вы можете отправить объявление в вашем заголовок файл (потому что вы не будете делать разыменование здесь), затем включите Windows.h
в вашем источник файл.
[редактировать] Не видел, что это был typedef. Однако другой ответ неверен: есть способ (вроде) форвард объявить typedef.
Вы можете многократно объявить имя typedef, а также одновременно объявить имя структуры:
typedef struct tagRECT RECT;
Обратите внимание, что вы не можете вызвать функцию, возвращающую неполный тип, поэтому преобразование operator RECT() const
не может быть вызван, если tagRECT
только форвард объявлен.