Включить typedef внутри заголовка класса
Это мой заголовок:
#ifndef TIMING_H
#define TIMING_H
#define MAX_MESSAGES 1000
typedef Message* MessageP; //inside the class?
class Timing {
public:
Timing();
private:
struct Message {
Agent *_agent;
double _val;
};
MessageP* _msgArr;
int _waitingMsgs;
};
Мой вопрос: должен ли я поместить typedef внутри блока класса прямо над MessageP * _msgArr или он в порядке, чтобы разместить его рядом со всем #define?
Он не выводит ошибки компиляции, поэтому я не уверен в этом.
Ответы
Ответ 1
Вне класса этот тип должен называться Timing::Message
, поэтому
typedef Timing::Message* MessageP;
Но это возможно только после объявления Timing::Message
, но MessageP
используется до того, как объявление Timing
будет завершено, поэтому это невозможно.
Кроме того, структура является членом private:
, поэтому вы никак не можете определить эту внешность. typedef
должен выполняться внутри класса Timing
.
class Timing {
public:
Timing();
private:
struct Message {
Agent *_agent;
double _val;
};
typedef Message* MessageP; // <--
MessageP* _msgArr;
int _waitingMsgs;
};
Вероятно, вы не получили ошибку компиляции, потому что уже существует другой тип Message
в глобальной области.
Ответ 2
Поместите typedef
в место, где это имеет смысл.
Помещение вверху означает, что вы добавляете псевдоним в область глобального пространства имен. Ввод его внутри класса может означать, что он доступен для просмотра или просмотра только для членов (и/или подклассов) в зависимости от ближайшего спецификатора доступа (или private
, если таковых нет).
Если клиентам класса не нужно знать об этом псевдониме, он будет закрыт.
Если вы поместите его внутри класса: обратите внимание, однако, что вне класса вам нужно будет полностью квалифицировать имя как Timing::MessageP
, а также нужна директива using Timing::MessageP
в области. Кроме того, полная квалификация может быть выполнена только после того, как класс был определен (вы не можете создавать псевдонимы для неполных типов - это означает, что объявление вперед Timing
не работает).
class Timing {
public:
Timing() {}
private:
struct Message {
Agent *_agent;
double _val;
};
MessageP* _msgArr;
int _waitingMsgs;
};
typedef Timing::Message* MessageP; // okay
Ответ 3
Это нормально, чтобы он был наверху. Тем не менее, это не очень хорошая практика, чтобы поместить его в глобальную сферу, как упомянуты другие.