[英]Passing a pointer to one derived class to another
我還在學習c ++的基礎知識,但我目前正在研究一個使用派生類和虛方法的項目。 所以情況是:我有一個ClassA
class ClassA
{
public:
virtual void action();
};
並且有兩個派生類B和C:
#include "ClassA.h"
class ClassB: public ClassA
{
public:
virtual void action();
int valueB;
};
-
#include "ClassA.h"
class ClassC: public ClassA
{
public:
virtual void action();
int valueC;
};
我想在ClassC中傳遞指向ClassB對象的指針作為action()的參數,所以我可以這樣做:
void ClassC::action(ClassB * ptr)
{
cout << "The value is: " << ptr->valueB;
}
但是我找不到一種有效的方法。 所有的對象指針都存儲在一個
vector<ClassA *> objects
哪里
objects[0]=new ClassC();
objects[1]=new ClassB();
如果我嘗試類似的東西
objects[0]->action(object[1])
然后我需要我在ClassA中的虛方法有一個參數ClassB *。 然后一個程序識別我試過的類型要么包括整個ClassB.h(壞主意,它創建一個包含或東西的“循環”)或使用前向聲明類ClassB; (我收到有關無效使用不完整類型的錯誤)。 所以我現在卡住了。 我希望一切都清楚,但如果需要,我當然可以提供更多的數據。
當你需要轉發聲明它是因為你不能包含該類的整個定義。 在這種情況下,如果你轉發聲明ClassB
,編譯器不知道它的成員屬性valueB
,那就是你得到一個不完整的類型錯誤的原因。 要解決這個問題,你必須考慮以下代碼:
//ClassA.h
class ClassB;
class ClassA
{
virtual void action(ClassB* ptr);
}
//ClassA.cpp
#include "ClassB.h"
void ClassA::action(ClassB* ptr) { ... }
所以你基本上使用頭來聲明虛方法並轉發聲明ClassB
,但你在ClassA.cpp
定義它,這樣在源文件中你可以包含ClassB.h
沒有問題,也沒有循環依賴的風險。
我注意到你的ClassC虛函數被聲明為不帶參數:
virtual void action();
但是您使用參數定義派生類函數。
void ClassC::action(ClassB * ptr)
聲明和定義必須匹配。 將聲明更改為:
virtual void action(ClassB *);
嗯。 但是你必須在ClassC聲明之前包括ClassB ......
#include "ClassB.h"
或轉發聲明ClassB。 這是對編譯器的承諾,以便稍后正確聲明和定義該類。 插入此行的好地方就在ClassC聲明之前。
class ClassB;
您可以將action
(在所有類中)定義為:
virtual void action(ClassA * ptr); // or ClassB *
然后,您可以傳遞ClassA的任何實例或從ClassA派生。 所有派生類都可以包含帶有#include "ClassA.h"
ClassA,如果你在頭文件中提供Sentinel,因為它在c ++中很常見:
#ifndef ClassAH
#define ClassAH
...
#endif
所以,標題只會被包含一次......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.