在我的C ++程序中使用Singleton

时间:2010-09-01 16:00:28

标签: c++ singleton

我写了两个课程,AgentTiming。第三个类将包含main()函数并管理它。目标是创建Agent的n个实例和Timing的SINGLE实例。值得一提的是,Agent使用Timing字段,Timing使用Agent函数。 如何将Timing转为singleton

//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;

我认为可以解决我的问题,但我得到了:

  

'Timing'未命名类型

        ~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 个答案:

答案 0 :(得分:10)

这个位在Agent.h中看起来很可疑......

#ifndef Timing_h
#define Timing_h

似乎它与Timing.h中的定义守护相同。因此,时间不会包含在代理中。

将其更改为

#ifndef Agent_h
#define Agent_h

答案 1 :(得分:2)

不,单身模式上的wikipedia page有一个很好的例子,还有一个关于如何实际构造单身的好文章。

答案 2 :(得分:2)

您的Timing不是单身人士。可以创建多个对象。 Singleton通常依赖于static方法和私有ctor,而不是复制ctor或op=。你有两个选择:

  • static
  • 创建Timing成员Agent
  • 或者,为Timing&创建Agent成员,并将Timing转换为合适的单身人士

根据您的设计,如果Timing对象永远不会被Agent对象更改,您可以继续const限定该成员。

答案 3 :(得分:1)

单例必须有一个私有构造函数,然后是一个静态方法来获取类的实例,这是类本身的私有字段。

答案 4 :(得分:1)

既然有人已经提到过维基百科页面,我还会提到Singleton模式的另一种实现方式略有不同。

如果您查看Ogre::Singleton课程,您会看到它以不同的方式完成。它允许您只调用一次构造函数(或者发生一个断言)。所以在你的设置中,你调用构造函数。然后在程序结束时,您将获得此实例并将其删除。

它允许您创建单例实例,但允许使用不同的参数进行实例化。我不喜欢它与维基百科的实现差不多,因为它要求你管理单例的构造函数/析构函数。

答案 5 :(得分:1)

创建单身人士的最常规方法有以下要求:

1)构造函数应该是私有的,并且应该提供静态接口,该接口又创建单例类的静态对象(它是类本身的成员)并返回它。基本上提供全球访问点。

2)您必须提前决定是否希望班级用户能够扩展它并设计您的课程以在必要时支持它。

如果满足上述两个要求,可以通过多种方式设计单例,包括可与多线程应用程序配合使用的方法。

答案 6 :(得分:0)

定义类型为Timing的Agent的静态成员,并初始化定义它的成员。这不再是严格意义上的单身人士,但可以更好地模拟你想要的行为。