Синглтон в моей C ++ программе - PullRequest
2 голосов
/ 01 сентября 2010

Я написал 2 класса, Agent и Timing. Третий класс будет содержать функцию main() и управлять всем этим. Цель состоит в том, чтобы создать n экземпляров Agent и один экземпляр Timing. Важно отметить, что Agent использует Timing поля, а Timing использует Agent функции. Как я могу включить Timing в синглтон ?

//Agent.h
#ifndef Timing_h
#define Timing_h
#include <string>
#include "Timing.h"

class Agent{
    public:
        Agent(std::string agentName);
        void SetNextAgent(Agent* nextAgent);
        Agent* GetNextAgent();
        void SendMessage();
        void RecieveMessage(double val);
            //    static Timing runTime;

То, что я думал, решит мою проблему, но я получил:

«Сроки» не называет тип

        ~Agent();

    private:
        std::string _agentName;
        double _pID;
        double _mID;
        Agent* _nextAgent;
};
#endif


//Timing.h
#ifndef Timing_h
#define Timing_h

class Timing{
    private:
        typedef struct Message{
            Agent* _agent;
            double _id;
        }Message;
        typedef Message* MessageP;

        Message** _messageArr;
        static int _messagesCount;

    public:
        Timing();
        void AddMessage(Agent* agent, double id);
        void LeaderElected(string name);
        void RunTillWinnerElected();
        ~Timing();
};
#endif

Действительно ли это способ создания синглтона, и если это так, то в чем проблема? А если нет, то как я могу превратить его в синглтон?

Ответы [ 7 ]

10 голосов
/ 01 сентября 2010

Этот бит выглядит подозрительно в Agent.h ...

#ifndef Timing_h
#define Timing_h

Похоже, это тот же define-guard в Timing.h.Поэтому время не будет включено в агент.

Измените его на

#ifndef Agent_h
#define Agent_h
2 голосов
/ 01 сентября 2010

Ваш Timing не синглтон. Можно создать несколько объектов. Синглтоны обычно полагаются на метод static и частный ctor, а не ctor для копирования или op=. У вас есть два варианта:

  • Либо создайте static член Timing для Agent
  • Или создайте элемент Timing& для Agent и преобразуйте Timing в правильный синглтон

В зависимости от вашего дизайна, если объект Timing никогда не изменяется объектами Agent, вы можете идти вперед const квалифицировать участника.

2 голосов
/ 01 сентября 2010

Нет, на странице Википедии в шаблоне синглтона есть хороший пример и хорошее описание того, как на самом деле создается синглтон.

1 голос
/ 01 сентября 2010

Самый обычный способ создания синглтона имеет следующие требования:

1) Конструктор должен быть закрытым, и должен быть предусмотрен статический интерфейс, который, в свою очередь, создает статический объект класса singleton (который является членом самого класса) и возвращает его. В основном обеспечивают глобальную точку доступа.

2) Вы должны заранее решить, хотите ли вы, чтобы пользователи класса могли расширять его и разрабатывать для вашего класса поддержку в случае необходимости.

Если вышеуказанные два требования соблюдены, существует несколько способов разработки синглтона, включая те, которые будут работать с многопоточными приложениями.

1 голос
/ 01 сентября 2010

Так как кто-то уже упомянул страницу википедии, я также упомяну другую реализацию шаблона Singleton, сделанную немного по-другому.

Если вы посмотрите на класс Ogre :: Singleton , который вы 'Посмотрим, как это будет сделано по-другому.Это позволяет вам вызывать конструктор только один раз (или происходит утверждение).Итак, в вашей настройке вы вызываете конструктор.Затем в конце программы вы получаете этот экземпляр и удаляете его.

Это позволяет вам создать одноэлементный экземпляр, но позволяет создавать его экземпляры с другими параметрами.Мне это не нравится так же сильно, как реализации в Википедии, так как это требует от вас управления конструктором / деструктором синглтона.

1 голос
/ 01 сентября 2010

Синглтон должен иметь закрытый конструктор, а затем статический метод, чтобы получить экземпляр класса, который является приватным полем в самом классе.

0 голосов
/ 01 сентября 2010

Определите статический член Agent типа Timing и инициализируйте член, в котором он определен.Это уже не Синглтон, но может лучше моделировать поведение, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...