2013-05-07 111 views
0

我有一些類在相同的文件中按順序聲明,但是,我希望它們互相引用。但是,類只能由上面的類聲明。Can類可以相互引用嗎?

我可以做到這一點,將它們分成不同的.h文件,並根據需要將它們相互對應起來?或者可以這樣做,同時保持它們在同一個文件中>

或者這是不好的做法? (具體來說,我有一個類A的實例需要跟蹤不同類類的B類的多個實例,它可能試圖與A類以不特定順序進行交互;我需要保留反饋具體到B類正試圖跟一個實例A級...)

+0

你說的是[tag:observer-pattern]嗎? – Johnsyweb 2013-05-07 18:34:35

+0

爲什麼是...是的,我認爲我很可能...... – user1833028 2013-05-07 19:26:06

+0

然後你需要閱讀這個:http://www.boost.org/doc/libs/release/doc/html/signals2.html – Johnsyweb 2013-05-07 19:28:00

回答

5

您可以轉發聲明類和它們在文件中定義後來他們:

class A; 

class B 
{ 
    // As pointed out by syam this will have to be an A* or A& not just of type A. 
    // If this line were: 
    // A myA 
    // The compiler gives error: field ‘myA’ has incomplete type 
    A* myA; 
}; 

class A {}; 

如果在任何點您想通過B中的方法訪問A中的方法或屬性,那麼您必須確保那些方法是在A的定義之後定義的。

class A; 

class B 
{ 
    A& myA; 
    int getAValue(void); // Can't use myA.value here as value is not declared yet. 
}; 

class A 
{ 
public: 
    int value; 
}; 

int B::getAValue(void) {return myA.value;} 
6

只要通過「是指」你的意思是爲指針,這應該工作:

class Foo; 

class Bar { 
    Foo* p; 
}; 

class Foo { 
    Bar* p; 
}; 
+2

引用也很好。 – syam 2013-05-07 18:32:01

+0

@syam:你說得對。 – 2013-05-07 18:59:35

+0

我嘗試將類Foo(即,this)的引用傳遞給類Bar中的子例程 - 這是允許的嗎,先生? – user1833028 2013-05-07 19:51:53

0

你甚至可以引入一個自我指涉的指針:

class Foo { 
    Foo* parent; 
}; 
0

我會做這樣的事情:

class A; 

class B { 
private: 
    A *parent; 
public: 
    B() { 
     this->parent = 0; 
    } 
    B(A *parent) { 
     this->parent = parent; 
    } 
    void erase(); 
}; 

class A { 
private: 
    std::vector<B> members; 
public: 
    void add(const B &x) { members.push_back(x); } 
    B *getArray() { 
     B *rv = new B[members.size()]; 
     for(int i=0;i<members.size();++i) 
      rv[i] = members[i]; 
     return rv; 
    } 
    void remove(B *member) { 
     for(std::vector<B>::iterator i = members.begin(); i != members.end(); ++i) { 
      if(&(*i) == member) { 
       members.erase(i); 
       break; 
      } 
     } 
    } 
}; 

void B::erase() { 
    if(parent) 
     parent->remove(this); 
} 

要點:

  • 我已經聲明B先讓B可以與A的實例一起工作。
  • 我已經向前宣佈了A,你gh,所以編譯器知道這是一個有效的類。這允許B保留指向B實例的指針。
  • 然而,在引用A的B中的任何方法需要在之後出現的A的定義。否則,將得到error: invalid use of incomplete type ‘struct A’或類似的結果。