2013-05-18 16 views
0

我有一個類,Player,其中成員變量Creature *character它將指向Elf : public Creature派生類。如何從另一個類中的私人指針指向的類獲取私有信息?

我想聲明一個Player對象,然後讓它的一個成員指向Elf並獲取信息。

我知道數據成員應該是私人的,但是這是一個特殊情況,還是我如何從我的main函數中獲得Elf成員的信息?

void Player::set_character(Creature &c) 
{ 
    character = &c; 
} 

... 
Player me; 
Elf me_elf; 
me.set_character(me_elf); 
+0

看起來沒問題。你能發表一個能夠再現問題的最小例子嗎? – juanchopanza

+0

你發佈的代碼看起來是正確的,我懷疑還有其他一些失敗的部分。運行時錯誤究竟是什麼,你可以製作一個http://sscce.org/ –

+0

我現在可能已經開始工作了,我希望我知道我剛剛做了什麼。對不起,現在我只需要知道如何訪問'Elf'時,指針是私人的,假設我想保持私有。 – Leonardo

回答

2

您可以通過的Player公共方法做到這一點:如果你有一個「有」關係

class Creature 
{ 
public: 
    virtual void hello() const = 0; 
}; 

class Player{ 
public: 
    void hello() const { charatcer->hello(); } 
    // other methods as before 
private: 
    Creature* character; 
}; 
+0

所以這段代碼的作品,但只有當我擦除'= 0;'部分。否則,它會給出錯誤「無法分配抽象類型'Creature'的對象」,因爲虛擬函數在'Creature'中是純粹的:然後它在末尾轉到具有'= 0;'的函數。這發生在我的構造函數內的派生類,如'Elf:public Creature'。你爲什麼在這裏使用'= 0;'? – Leonardo

+0

@Leonardo在'Creature'中使'void hello()成爲純粹的虛擬方法。我假設'Creature'是一個基類,一切都將在派生類型中實現。如果你想實例化'Creature',刪除'= 0'並添加一個實現。 – juanchopanza

1

,你將不得不使用包裝函數來訪問數據。

如果你有一個「是」的關係,如果數據是「受保護的」,你將能夠訪問數據。沒有任何其他麻煩。已保護允許派生類訪問數據。

+0

確實,我確信保護會起作用,但這會破壞私人的目的。 – Leonardo

+0

@Leonardo保護不會在這裏工作。 – juanchopanza

+1

'protected'的全部要點是它允許相關的類,但不允許與訪問成員無關的類。這完全取決於你想要達到的目標。 「public」,「protected」和「private」之間的區別是因爲不同類型的設計需要不同級別的訪問。 [這就是爲什麼我們需要一個更完整的例子和一個正確的公式化問題 - 當涉及到真正重要的東西時,回收是很好的 - 計算機的位和字節無論如何都被回收] –

相關問題