我有一些類在相同的文件中按順序聲明,但是,我希望它們互相引用。但是,類只能由上面的類聲明。Can類可以相互引用嗎?
我可以做到這一點,將它們分成不同的.h文件,並根據需要將它們相互對應起來?或者可以這樣做,同時保持它們在同一個文件中>
或者這是不好的做法? (具體來說,我有一個類A的實例需要跟蹤不同類類的B類的多個實例,它可能試圖與A類以不特定順序進行交互;我需要保留反饋具體到B類正試圖跟一個實例A級...)
我有一些類在相同的文件中按順序聲明,但是,我希望它們互相引用。但是,類只能由上面的類聲明。Can類可以相互引用嗎?
我可以做到這一點,將它們分成不同的.h文件,並根據需要將它們相互對應起來?或者可以這樣做,同時保持它們在同一個文件中>
或者這是不好的做法? (具體來說,我有一個類A的實例需要跟蹤不同類類的B類的多個實例,它可能試圖與A類以不特定順序進行交互;我需要保留反饋具體到B類正試圖跟一個實例A級...)
您可以轉發聲明類和它們在文件中定義後來他們:
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;}
只要通過「是指」你的意思是爲指針,這應該工作:
class Foo;
class Bar {
Foo* p;
};
class Foo {
Bar* p;
};
引用也很好。 – syam 2013-05-07 18:32:01
@syam:你說得對。 – 2013-05-07 18:59:35
我嘗試將類Foo(即,this)的引用傳遞給類Bar中的子例程 - 這是允許的嗎,先生? – user1833028 2013-05-07 19:51:53
您可以使用前置聲明。
你甚至可以引入一個自我指涉的指針:
class Foo {
Foo* parent;
};
我會做這樣的事情:
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);
}
要點:
error: invalid use of incomplete type ‘struct A’
或類似的結果。
你說的是[tag:observer-pattern]嗎? – Johnsyweb 2013-05-07 18:34:35
爲什麼是...是的,我認爲我很可能...... – user1833028 2013-05-07 19:26:06
然後你需要閱讀這個:http://www.boost.org/doc/libs/release/doc/html/signals2.html – Johnsyweb 2013-05-07 19:28:00