我要两节课,
class CFoo
{
public:
static CFoo& GetInstance()
{
static CFoo instance;
return instance;
}
int GetValue(){
return value;
}
private:
CFoo(){
value = 0;
ltr = 'a';
}
int value;
char ltr;
};
class CBar
{
public:
static CBar& GetInstance(){
static CBar instance;
return instance;
}
float GetValue(){
return value;
}
private:
CBar(){
value = 0.4;
ltr = 2;
}
float value;
int ltr;
};
Run Code Online (Sandbox Code Playgroud)
是否可以为这两个类创建一个类模板,区别仅在于数据类型.由于该类是单例,我在为这两个类创建模板类时如何调用?请提供基本模板类的示例代码.
请指教.
非常感谢.
通常,当您想要概括类似这样的类时,可以通过使用类型参数替换每个类型来实现.因此,例如,在这里,您将声明类型的类型参数value和类型的类型参数ltr.
显然,这看起来像:
template <typename ValueT, LtrT>
class C
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
然后,它只是一个在类与类型参数代替具体类型的物质,所以value并ltr声明如下(内部类模板定义的):
ValueT value;
LtrT ltr;
Run Code Online (Sandbox Code Playgroud)
为了使这个类模板更容易使用,您可以创建一些typedef(在类模板定义之外):
typedef C<int, char> CFoo;
typedef C<float, int> CBar;
Run Code Online (Sandbox Code Playgroud)
您还需要一种初始化成员变量的方法.你最好的办法是让构造函数接受初始化成员变量的参数(在类模板定义中):
C(const ValueT& initial_value, const LtrT& initial_ltr)
: value(initial_value), ltr(initial_ltr) { }
Run Code Online (Sandbox Code Playgroud)
由于您尝试使用单例,因此无法使用当前(损坏)实现,GetInstance()因为函数体静态需要在函数体中初始化.您可以通过将单例实例声明为静态类成员变量(在类模板定义内)来解决此问题:
C singleton;
Run Code Online (Sandbox Code Playgroud)
那么你需要在你的一个源文件中定义和初始化它; 您将需要为C您使用的每个实例化定义一个定义,因此对于您在此处使用的两个定义,您将需要:
template<> CFoo CFoo::singleton(0, 'a');
template<> CBar CBar::singleton(0.4, 2);
Run Code Online (Sandbox Code Playgroud)
当你把它们放在一起时,它看起来就像这样(为了简洁起见,我把它简化为只使用一种类型和值):
template <typename T>
struct S
{
public:
S(const T& initial_value) : value(initial_value) { }
const T& GetValue() const { return value; }
static const S& GetInstance() { return singleton; }
private:
// since it's a singleton, make it noncopyable
S(const S&);
void operator=(S);
T value;
static S singleton;
};
typedef S<int> SInt;
template<> SInt SInt::singleton(42);
int main()
{
int value = SInt::GetInstance().GetValue();
}
Run Code Online (Sandbox Code Playgroud)
最后,最重要的是,请考虑不使用单身人士.单身几乎总是一个坏主意.从你的剥离示例中无法分辨出你想要完成什么,但你一定要尝试找到其他方法来做到这一点.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |