我写了两个课程,Agent
和Timing
。第三个类将包含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
这是否真的是创建单例的方法,如果它是什么问题? 如果没有,我怎么能把它变成单身?
答案 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的静态成员,并初始化定义它的成员。这不再是严格意义上的单身人士,但可以更好地模拟你想要的行为。