访问' has-a'其他成员的关系

时间:2015-01-05 23:53:23

标签: c++ inheritance

我有一个课程(作文)(有一个关系)如下:

class AP是一个包含class A对象的更大的类。 AP也有state个变量作为其成员。

问题:我可以在其他作曲成员中访问AP's member 'state'吗? (即在A类型的对象内部)?

这是代码

class A {
 int i;
 public:
  void set(int x)
  { i = x; }

  int get()
  { return i; }

  void process()
  {
    cout << ::this->get() << endl; //// how to access AP's state variable here ?
  }
};


class AP
{
  A a;
  int state;

 public:
  void process() 
  {     a.process();   }

  void set()
  { state = 1; }

  int get()
  { return state; }
};



/// AP contains (or owns an object of type A)
/// I need to access AP's state value in object of type A (which is ap's member)

int main()
{ 
 AP ap;  //
 ap.set(); // set state value for AP
 cout << " get " << ap.get() << endl;  // get state value for AP


 ap.process(); /// calls a.process --> this must access ap's state value    


return 0;
}

有可能的解决方案,例如:

  1. 将引用传递给自身,然后访问该值。

  2. 只需在process()函数中传递state的值即可。 (ap.process(state)

  3. 但我想知道我是否可以直接访问其他具有合成(has-a)的成员的类的成员变量[请参阅class A::process()方法。

2 个答案:

答案 0 :(得分:1)

您要问的是&#34;我可以使用&#39; is-a&#39;用&#39; has-a&#39;设计的对象的概念。概念&#34;

简短回答 ,没有。

答案很长 : 有时,但只有它是静止的。否则,&#39; A&#39;无法访问“AP&#39;”的非静态成员没有背景。

class A {
public:
    int p;
    void process() {
        p = AP::as; /* static object, okay! */
        p = AP::ap; /* compiler error, where's the instantiated AP to go along with it??? */
    }
};
class AP {
public:
    int ap;
    A a;
    static int as;
};

&#34;静态&#34;修饰符将指定的对象放在单个实例中。请记住,当您开始使用线程时:所有线程都使用引入数据竞争的相同的实例!例证:{+ 1}}在c ++ 11之前;关于来自errno和线程的头痛,有很多谷歌参考。因为errno只有一个实例,所以AP::as确切知道在哪里找到它(甚至可能是第一个访问它的人)。

但由于A没有静态修饰符,因此它必须具有AP::ap实例化的实例。如上所示访问它将导致编译器错误,因为编译器不知道在哪里找到AP对象。它需要一个AP::ap。因此,您可以在此处为已经实例化的AP 提供参考AP(或者您决定提供实例化{{}的其他方式例如通过引用或指针等等。

所有这一切都是因为,鉴于存在零,一个或多个 AP obj; p = obj.ap;个对象(AP的想法,你究竟是哪一个你想要的吗?例如:

AP

&#34;具有-A&#34;与&#34;完全不同的概念是-a&#34;概念(实际上&#34; has-a&#34;概念是 NOT 继承,因为你已经标记了这个问题!)。

答案 1 :(得分:0)

您可以为其父AP提供一个const引用,但如果您只是希望A :: process()使用parent.state作为输入,那么最简单的解决方案是将其作为输入状态!

class A {
  void process(int state);
};

class AP {
  A a;
  int state;
 public:
  void process() {a.process(state);}
};