autoMsg简易版
#include<stdio.h>
#include<new>
using namespace std;
template<typename T>
struct AutoMsg final
{
AutoMsg()
{
pointer = new (nothrow) T;
}
~AutoMsg()
{
if(pointer!=nullptr)
{
delete pointer;
}
}
//将拷贝构造函数和拷贝赋值运算符禁止,防止出现多个指针指向同一个内存的问题
AutoMsg(const AutoMsg&) = delete;
AutoMsg& operator = (const AutoMsg&) = delete;
T *getPointer() const
{
return pointer;
}
private:
T *pointer = nullptr;
};
struct English
{
int* score;
};
struct Math
{
int* score;
};
struct Chinese
{
int* score;
};
struct Student
{
union
{
void *value;
Chinese chinese;
Math math;
English english;
} u;
};
struct EnglishNew : English
{
EnglishNew()
{
printf("%d, EnglishNew::EnglishNew()\n", __LINE__);
English::score = score;
}
private:
int score[10];
};
struct MathNew : Math
{
MathNew()
{
printf("%d, MathNew::MathNew()\n", __LINE__);
Math::score = score;
}
private:
int score[10];
};
struct ChineseNew : Chinese
{
ChineseNew()
{
printf("line[%d], ChineseNew::ChineseNew()\n", __LINE__);
Chinese::score = score;
}
private:
int score[10];
};
struct StudentNew : Student
{
StudentNew()
{
printf("line[%u] StudentNew: StudentNew()\n", __LINE__);
Student::u.value = &u;
}
private:
union PersonInfo
{
PersonInfo()
{
printf("line[%u] PersonInfo: PersonInfo()\n", __LINE__);
};
~PersonInfo(){};
ChineseNew chinese;
MathNew math;
EnglishNew english;
} u;
};
int main()
{
AutoMsg<StudentNew> msg;
Student &XiaoMing = *(msg.getPointer());
new (XiaoMing.u.value) ChineseNew;
printf("XiaoMing.u.chinese.score.addr[%p].\n", XiaoMing.u.chinese.score);
printf("XiaoMing.u.math.score.addr[%p].\n", XiaoMing.u.math.score);
printf("XiaoMing.u.english.score.addr[%p].\n", XiaoMing.u.english.score);
return 0;
}
程序输出是:
line[99] PersonInfo: PersonInfo()
line[91] StudentNew: StudentNew()
line[80], ChineseNew::ChineseNew()
XiaoMing.u.chinese.score.addr[0xe94eb8].
XiaoMing.u.math.score.addr[0xe94eb8].
XiaoMing.u.english.score.addr[0xe94eb8].