2011-07-15 58 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'呢? –

相关问题