Включить 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

Это нормально, чтобы он был наверху. Тем не менее, это не очень хорошая практика, чтобы поместить его в глобальную сферу, как упомянуты другие.