模版 在代码里有几个 副本的问题
类模版中的静态变量和静态成员函数和普通函数的问题
template<typename T>
class Test
{
T val;
public:
static void Fun(){}
void Fun2(){}
};
Test<int> obj1;
obj1.Fun();
obj1.Fun2();
Test<int>obj2;
obj2.Fun();
obj2.Fun();
问题1: 对于普通函数,Fun2在代码里有几个副本?
是否是共用的? 因为都是用int去实例化!!1
如果不是同一种类型实例化,又该如何?
问题2:
对于 静态函数 Fun而言, 对于同一种类型有几个副本, 不同的类型又有几个?
[解决办法]
楼主只要把相应的概念对普通的类理解透彻,然后再记住类模板实例化以后就变成普通的类,就应该能够推理出它们在类模板情况下的性质了。
[解决办法]
楼主只要把相应的概念对普通的类理解透彻,然后再记住类模板实例化以后就变成普通的类,就应该能够推理出它们在类模板情况下的性质了。 在用相同模板参数进行实例化时,如果函数足够简单,并且:在类定义内定义或有inline声明或编译器进行了优化,这时函数就是内联函数,会直接把代码插入到调用处,但取地址的话是同一个地址。如果函数不能内联,那就只有一个。
当用不同模板参数进行实例化时,每个实例生成一个“副本”。
静态成员函数与非静态成员函数都一样,事实上普通成员函数只是比静态成员函数多了一个隐含的参数——this。
参考 第15楼
http://bbs.csdn.net/topics/390485405?page=1#post-394797026
这个帖子,我简答的说一下,是一个单例类, 一个友元模版类, 模版类有getinstance函数,
单例类的构造,拷贝等函数均是私有的。
代码为:
模版类
template <class T> class Singleton
{
protected:
Singleton(){}
public:
static T& Instance()
{
static T instance;
return instance;
}
};
目标单例类
class ExampleSingleton //: public Singleton<ExampleSingleton>
{
// so that Singleton<ExampleSingleton> can access the
// protected constructor
friend class Singleton<ExampleSingleton>; //注意友原
protected:
ExampleSingleton(){}
public:
// This class's real functionalities
void Write(){printf("Hello, World!");}
};
Singleton<ExampleSingleton>::Instance().Write();
每一个使用Singleton<ExampleSingleton>的地方都可能会生成一个Instance()
因为Singleton<ExampleSingleton>和ExampleSingleton毫无关系;
这带颜色的文字,是一个网友说的, 我问其什么原因,其回答:
C++的静态变量或者静态函数,和模板一起,就会让单例模式失去作用,因为可以在每个实现的地方实例化模板;
那么静态变量或者静态函数,就会在同一个程序里有又多个版本,因为静态变量或者静态函数是内部连接的,同一程序可以出现多个同名变量或者函数假设这个程序分成N个部分编译,每一份都分别实例化模板的话,就会有N个单例的实例,关键是模板是使用时实例化的,除非预先实例化,并编译好模板,否则,就会出现多份的单例的实例。
所以就会出现这种递归定义的情况,用来解决这个问题。
也就说, 其认为我提供的这种友元写法,是有漏洞的, 如何解决呢?
采用递归定义即可解决。
根本原因是: ]C++的静态变量或者静态函数,和模板一起,就会让单例模式失去作用,因为可以在每个实现的地方实例化模板;有多个副本。
所以,我才发这个帖子