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++;
}
实际上是这么访问的: