64,642
社区成员
发帖
与我相关
我的任务
分享
//主程序:
#include <iostream>
#include <string>
template< typename T>
class Tester
{
public:
T Member();
virtual T VirtualMember();
static T StaticMember();
};
Tester<std::string> * GetTester1();
Tester<std::string> * GetTester2();
void Test1();
void Test2();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "\nCall Test1:\n";
Test1();
std::cout << "\nCall Test2:\n";
Test2();
std::cout << "\nCall GetTester1:\n";
Tester<std::string> * t = GetTester1();
t->Member();
t->VirtualMember();
t->StaticMember();
std::cout << "\nCall GetTester2:\n";
t = GetTester2();
t->Member();
t->VirtualMember();
t->StaticMember();
return 0;
}
//运行结果:
Call Test1:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call Test2:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call GetTester1:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call GetTester2:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
:
//test1.cpp:
#include <iostream>
#include <string>
template< typename T>
class Tester
{
public:
T Member();
virtual T VirtualMember();
static T StaticMember();
};
template <typename T>
T Tester<T>::Member()
{
static T nothing;
std::cout << "Tester::Member() in Test1.cpp\n";
return nothing;
}
template <typename T>
T Tester<T>::VirtualMember()
{
static T nothing;
std::cout << "Tester::Member() in Test1.cpp\n";
return nothing;
}
template <typename T>
T Tester<T>::StaticMember()
{
static T nothing;
std::cout << "Tester::Member() in Test1.cpp\n";
return nothing;
}
Tester<std::string> * GetTester1()
{
return new Tester<std::string>;
}
void Test1()
{
Tester<std::string> t;
t.Member();
t.VirtualMember();
t.StaticMember();
}
//Test2.cpp
#include <iostream>
#include <string>
template< typename T>
class Tester
{
public:
T Member();
virtual T VirtualMember();
static T StaticMember();
};
template <typename T>
T Tester<T>::Member()
{
static T nothing;
std::cout << "Tester::Member() in Test2.cpp\n";
return nothing;
}
template <typename T>
T Tester<T>::VirtualMember()
{
static T nothing;
std::cout << "Tester::Member() in Test2.cpp\n";
return nothing;
}
template <typename T>
T Tester<T>::StaticMember()
{
static T nothing;
std::cout << "Tester::Member() in Test2.cpp\n";
return nothing;
}
Tester<std::string> * GetTester2()
{
return new Tester<std::string>;
}
void Test2()
{
Tester<std::string> t;
t.Member();
t.VirtualMember();
t.StaticMember();
}
//主程序:
#include <iostream>
#include <string>
template< typename T>
class Tester
{
public:
T Member();
virtual T VirtualMember();
static T StaticMember();
};
Tester<std::string> * GetTester1();
Tester<std::string> * GetTester2();
void Test1();
void Test2();
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "\nCall Test1:\n";
Test1();
std::cout << "\nCall Test2:\n";
Test2();
std::cout << "\nCall GetTester1:\n";
Tester<std::string> * t = GetTester1();
t->Member();
t->VirtualMember();
t->StaticMember();
std::cout << "\nCall GetTester1:\n";
t = GetTester1();
t->Member();
t->VirtualMember();
t->StaticMember();
return 0;
}
//运行结果:
Call Test1:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call Test2:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call GetTester1:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Call GetTester1:
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
Tester::Member() in Test1.cpp
所以,大家如果要写一个只在某一个cpp文件中使用的“辅助类”,一定不要忘记把它们放在匿名namespace中,不要以为只放在cpp中就不会被别人使用,要当心因为重名而被合并。上面的代码中,如果在test1.cpp和test2.cpp中把类声明及定义都放在匿名namespace中,就会出现链接错误。
#pragma once
#include <stdio.h>
template<typename T>
class Test
{
public:
static T val;
public:
static void Fun(){}
static void show(){
printf("%x\n",&val);
}
void Fun2(){}
};
template<typename T>
T Test<T>::val=1
放在不同的文件中编译,调用,打印出的地址,都是一样,
ExampleSingleton second( ExampleSingleton::Instance());
Singleton<ExampleSingleton> third(ExampleSingleton::Instance());
因此,应该在Singleton的声明中加上:
private:
Singleton( Singleton<T> const & );