RAII: autoMsg在带union时使用placement new的实现

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].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到程攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值