winapi — прямое объявление структуры typedef с именами объектов

Рассмотрим этот класс из 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?
Спасибо заранее 🙂

0

Решение

Вам не нужно знать определение функции, прежде чем разыменовывать тип.

Таким образом, вы можете отправить объявление в вашем заголовок файл (потому что вы не будете делать разыменование здесь), затем включите Windows.h в вашем источник файл.

[редактировать] Не видел, что это был typedef. Однако другой ответ неверен: есть способ (вроде) форвард объявить typedef.

2

Другие решения

Вы можете многократно объявить имя typedef, а также одновременно объявить имя структуры:

typedef struct tagRECT RECT;

https://ideone.com/7K7st7

Обратите внимание, что вы не можете вызвать функцию, возвращающую неполный тип, поэтому преобразование operator RECT() const не может быть вызван, если tagRECT только форвард объявлен.

3

По вопросам рекламы [email protected]