簡體   English   中英

將指向一個派生類的指針傳遞給另一個派生類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM