将对象指针转换为char数组

时间:2012-04-22 09:31:26

标签: c++ inheritance casting polymorphism ns-3

unsigned char *check = NULL;
check = (dynamic_cast<unsigned char *>( ns3::NetDevice::GetChannel() ));

这就是我想要的。但错误是:

error: cannot dynamic_cast ‘ns3::NetDevice::GetChannel() const()’ (of type ‘class       ns3::Ptr<ns3::Channel>’) to type ‘unsigned char*’ (target is not pointer or reference to class)

我也尝试过:

reinterpret_cast

但它根本不起作用。

2 个答案:

答案 0 :(得分:1)

ns3::NetDevice::GetChannel()的返回类型是某种自定义智能指针;在没有看到它的定义的情况下,我们只能猜测如何将其转换为原始指针。

也许它实现了一个转换运算符operator T*(),虽然这通常被认为是一个坏主意,因为它使意外的转换太容易被偶然发生。在这种情况下,您可以这样做:

void * check = ns3::NetDevice::GetChannel();

否则,它可能有一个转换为原始指针的成员函数。标准智能指针通常称为get()

void * check = ns3::NetDevice::GetChannel().get();

如果它没有提供,并且你确实想要获得一个原始指针,那么你可以取消引用它并获取指向解除引用对象的指针(假设它支持退化;否则,调用它有点奇怪一个指针):

void * check = &*ns3::NetDevice::GetChannel();

获得void *后,您可以使用static_cast将其更改为unsigned char *,如果这是您想要的。小心你用它做什么,因为弄乱对象的字节很容易导致不确定的行为。

更新:如果ns3::Ptr是记录的模板here,那么您可以使用以下命令获取原始指针:

void * check = PeekPointer(ns3::NetDevice::GetChannel());

答案 1 :(得分:0)

最好使用两个static_cast代替reiterpret_cast。因为标准不保证不同的指针具有相同的大小。但是,该标准确保void*具有足够的大小以适合指向任何数据类型的指针(指向函数的指针除外)。

unsigned char *check = NULL;
check = static_cast<unsigned char*>(static_cast<void*>(ns3::NetDevice::GetChannel()));

您的Ptr<Channel>必须重载运算符,它返回保持指针:

template<typename T>
class Ptr
{
public:
  operator T*() {return _p;}

private:
  T* _p;
};