簡體   English   中英

C ++ / Qt對象到向量和返回對象

[英]C++/Qt Object to Vector & Back to Object

簡單地說,我無法從Vector中的對象調用非繼承方法。

我正在使用Qt Creator 2.7.0據我所知還沒有使用完整的C ++ 11(?) - 我不確定這是否是造成以下問題的原因(雖然我很確定這是我的不是IDE /編譯器):

我有3個類繼承自基類,每個類都有一個額外的原語/ getter / setter。

簡單地說,我的課程看起來像:

class A 
{
  public:
    virtual std::string getName() = 0 ;
    virtual void setName(std::string) = 0 ;
    virtual int getNumber() ;
    virtual void setNumber(int) ;
  protected:
    std::string name ;
    int number ;
}

class B : public A
{
  public:
    std::string getName() ;
    void setName(std::string) ;
    int getNumber() ;
    void setNumber(int) ;

    std::string getEmail() ;
    void setEmail(std::string) ;
  protected:
    std::string email ;
}

在我的主要我有一個指針向量,即:

std::vector<A*> contacts ;

//Add Pointers to Vector
A *a ;
B *b ;
contacts.push_back(a) ;
contacts.push_back(b) ;

然后我檢查對象類類型 ,以確保它是類B類。

if (dynamic_cast<B*>(contacts.at(1)) != NULL) //nullptr not working in Qt yet
{

我可以訪問A類的getter和setter,但不能訪問B:

std::string name = contacts.at(1)->getName() ; //Works

std::string email = contacts.at(1)->getEmail() ; //Compiler Error: 'class A' has 
                                                 //no member named 'getEmail'

}

錯誤('類A'沒有名為'getEmail'的成員)在編譯時發生,而不是在運行時發生。

我不能看到它是對象切片,因為這應該是多態的,我應該使用某種類型的C ++ Casting嗎?

任何幫助或踢正確的方向將不勝感激,謝謝。

您需要使用dynamic_cast來獲取指向派生類型的指針。 你實際上並沒有這樣做,你在A*上調用B方法:

contacts.at(1)->getEmail() ; // look, no dynamic_cast

你需要做相同的事情:

B* b = dynamic_cast<B*>(contacts.at(1));
std::string email = b ? b->getEmail() : "N/A";

聯系人屬於A類,它是基類。 你必須在派生的一個上執行操作。

而不是contacts.at(1)->getName使用vector<B*> b->getName

希望這清除:)

您的contacts矢量包含A *。 C ++在編譯時驗證類型,因此在執行代碼時沒有問題。 由於contacts是A *類型,因此只能調用A類方法。 在你的情況下,你想在一個可能是B的objct上cll一個B方法! C ++確定它是A ,但它可能是C (如果C類繼承自A)。 你想要做的是在向量中獲取B對象的實例並將其轉換為B,這樣你就可以調用方法: B* b = dynamic_cast<B*>(contacts.at(1)); noyw用b來做你想做的事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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