【发布时间】:2015-04-18 15:17:00
【问题描述】:
我正在尝试创建一个 C++ 单例模式对象,使用引用而不是指针,其中构造函数采用 2 个参数
我查看了大量示例代码,包括: Singleton pattern in C++, C++ Singleton design pattern 和 C++ Singleton design pattern
我相信我理解所涉及的原则,但是尽管尝试几乎直接从示例中提取代码的 sn-ps,但我无法编译它。为什么不 - 以及如何使用带参数的构造函数创建这个单例模式对象?
我已经把收到的错误代码放在了cmets中。
此外,我正在 ARMmbed 在线编译器中编译这个程序 - 可能有/可能没有 c++ 11,我目前正在尝试找出哪个。
传感器.h
class Sensors
{
public:
static Sensors& Instance(PinName lPin, PinName rPin); //Singleton instance creator - needs parameters for constructor I assume
private:
Sensors(PinName lPin, PinName rPin); //Constructor with 2 object parameters
Sensors(Sensors const&) = delete; //"Expects ;" - possibly c++11 needed?
Sensors& operator= (Sensors const&) = delete; //"Expects ;"
};
传感器.cpp
#include "Sensors.h"
/**
* Constructor for sensor object - takes two object parameters
**/
Sensors::Sensors(PinName lPin, PinName rPin):lhs(lPin), rhs(rPin)
{
}
/**
* Static method to create single instance of Sensors
**/
Sensors& Sensors::Instance(PinName lPin, PinName rPin)
{
static Sensors& thisInstance(lPin, rPin); //Error: A reference of type "Sensors &" (not const-qualified) cannot be initialized with a value of type "PinName"
return thisInstance;
}
非常感谢!
【问题讨论】:
-
这看起来比通常的单例方法错误更多。想象一下这段代码:
Sensors::Instance(foo, bar).doSomething(); Sensors::Instance(baz, qux).doSomething();。第二次调用将公然忽略参数,这在调用站点根本不明显。 -
这很重要吗?由于它不应该创建新对象而是返回原始对象,因此忽略参数是否重要?如果要检查参数,在返回原始对象之前在方法中添加验证步骤不是很简单吗?
-
问题是它们在代码中不会很好地相互跟随。假设您在代码中只看到
Sensors::Instance(alpha, beta).doSomething();somwhere。您无法知道该实例是否实际具有参数alpha和beta,或者它是否会作用于在先前调用中创建的具有可能完全不同的参数的实例。
标签: c++ design-patterns reference singleton