2011-07-15 57 views
1

我可以使用像這樣的方法doSomething;首先將指向A類的指針賦給b的void *成員?這是使用void *成員指針的正確方法嗎?

class A 
{ 
    public: 
     A(int); 
     int m_x; 
     int doSomething(){}; 
}; 

class B 
{ 
    public: 
     void* m_y; 
}; 

#include "x.h" 
using namespace std; 

A::A(int x) 
{ 
    m_x = x; 
} 

int main() 
{ 
    //create 2 pointers to A and B 
    B *b; 
    A *a; 

    b = new B(); 
    a = new A(15); 

    b->m_y = a;   

    ((A*)b->m_y)->doSomething(); 

    delete a; 
    delete b; 

    return 0; 
} 
+3

也許你可以,但爲什麼你應該扔掉打字並強迫自己投擲*無處不在*,基本上在你使用它的地方打開未定義行爲的可能性? – delnan

回答

5

保持從void*

遠爲什麼不能有一個指針AB(甚至,B擁有的A實例),或者B持有智能指針的A一個實例 - 有這麼多其他更好辦事方式。

+2

我不控制B的類定義,這就是爲什麼我不能使用A指針或智能指針。 – liegebeest

+0

..hmm ..如果它完全不在你的控制範圍之內(比如某些第三方的東西),那麼reinterpret_cast無法避免 - 如果它是你公司的其他人(團體等) - 用板球棒繞過去(不是說我'引誘暴力頭腦你!);) – Nim

+0

:)謝謝,我可能會提出,但不是與板球棒;) – liegebeest

2

是的,這在技術上是正確的,但它也是無用的。

如果你知道你會在m_y存儲A*,那麼爲什麼不給它那種類型?如果您事先不知道要存儲何種確切類型,請使用繼承和多態性(virtual),這是太多更安全。

編輯:好的,這是連接到遺留代碼。然後static_cast是最清晰,最明確的演員表演方式。但是,這與您所做的完全相同。

+0

「由reinterpret_cast執行的映射是實現定義的。」 [5.2.10.3]。使用static_cast從'void *'轉換爲其原始/可兼容指針類型。這是由標準明確定義的。 –

3

是的,你可以,雖然你不應該使用C風格的演員。更好地利用static_cast

(static_cast<A*>(b->m_y))->doSomething(); 
+2

noooo ..不建議像這樣的人看起來是一個初學者... – Nim

+0

@Nim:我的第一反應是說與其他答案相同的東西,但後來,由於某種原因,我決定發佈這個 - 不知道那裏發生了什麼。 –

+0

即使來自void *的static_cast在這裏工作得很好,我也會推薦reinterpret_cast而不是static_cast。 Reinterpret_cast是一個有點可疑的跡象。通過void *總是很腥。 reinterpret_cast是留給未來維護者的一個很好的路標。 –

0

號有使用void*指針不正確的方法。

+0

雖然我瞭解情緒,但這不是問題的答案。在與傳統代碼連接時,有時需要使用'void *'。 –

+0

+1,爲了抵消,「否」是正確的答案,最後一點是額外的情緒 - 這也是正確的。 – Nim

+0

沒有正確的方法?那麼'operator new'和'operator delete'呢? –

相關問題