Lammps设计模式分析

lammps设计模式分析

问题:为什么main函数中,对son->daughterPlus的调用可以改变daughter中的值?

#include <iostream>


class Pointers
{
public:
    class Son *&son;
    class Daughter *&daughter;
    Pointers(class Father *father);
    virtual ~Pointers(){}
};

class Son:protected Pointers
{
public:
    Son(Father *father):Pointers(father){}
    ~Son(){}
    void daughterPlus();
};

class Daughter:protected Pointers
{
public:
    long a;

    Daughter(Father *father):Pointers(father){a=0;}
    ~Daughter(){}
};

void Son::daughterPlus(){
    daughter->a++;
}

class Father
{
public:
    Son *son;
    Daughter *daughter;
    Father(){
        son=new Son(this);
        daughter=new Daughter(this);
    }

    ~Father();
};

Pointers::Pointers(class Father *father): son(father->son),daughter(father->daughter){}

int main(){

    Father *f=new Father();
    // output:0
    std::cout<<f->daughter->a<<std::endl;
    f->son->daughterPlus();
    // output:1
    std::cout<<f->daughter->a<<std::endl;
    return 0;

}


先看pointer类,这个类声明的时候还没有后面的类,所以他的子类成员变量定义的时候要加class,也可以先声明了后面再定义,这么写:

class Son;
class Daughter;
class Father;
class Pointers
{
public:
    Son *&son;
    Daughter *&daughter;
    Pointers(Father *father);
    virtual ~Pointers(){}
};

然后仔细看这个son跟daughter,继承于pointer,pointer里面放着的正是它们两个的指针引用,所以在son的函数里面可以直接调用daughter的变量。也就是说,son里面有两个指针的引用,一个指向自己,另一个指向daughter,同理daughter也是。


结构图

在这里插入图片描述


执行

为什么son可以调用daughterPlus()可以将daughter里面的变量a++?

    f->son->daughterPlus();
    //f->son没问题,f里面有son这个指针
    //son->daughterPlus()也没问题,daughterPlus是son的一个成员函数

问题在daughterPlus()里面:

class Son:protected Pointers
{
public:
    Son(Father *father):Pointers(father){}
    ~Son(){}
    void daughterPlus();
};
void Son::daughterPlus(){
    daughter->a++;
}

实际上是这么访问的:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值