C++ 将对象指针强制转换为字符数组

C++ 将对象指针强制转换为字符数组,c++,inheritance,casting,polymorphism,ns-3,C++,Inheritance,Casting,Polymorphism,Ns 3,但是它根本不起作用。最好使用两个static\u cast而不是reiterpret\u cast。因为标准不保证不同的指针具有相同的大小。但是,该标准确实保证void*有足够的大小来容纳指向任何数据类型的指针(指向函数的指针除外) 无符号字符*check=NULL; check=static_cast(static_cast(ns3::NetDevice::GetChannel()); 您的Ptr必须具有重载运算符,该运算符返回保留的指针: unsigned char *check = NU

但是它根本不起作用。

最好使用两个
static\u cast
而不是
reiterpret\u cast
。因为标准不保证不同的指针具有相同的大小。但是,该标准确实保证
void*
有足够的大小来容纳指向任何数据类型的指针(指向函数的指针除外)

无符号字符*check=NULL;
check=static_cast(static_cast(ns3::NetDevice::GetChannel());
您的
Ptr
必须具有重载运算符,该运算符返回保留的指针:

unsigned char *check = NULL;
check = static_cast<unsigned char*>(static_cast<void*>(ns3::NetDevice::GetChannel()));
模板
类Ptr
{
公众:
运算符T*(){return\u p;}
私人:
T*\u p;
};

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

也许它实现了一个转换操作符,
操作符T*()
,尽管这通常被认为是一个坏主意,因为它使得意外的转换太容易意外地完成。在这种情况下,您可以执行以下操作:

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

private:
  T* _p;
};
否则,它可能有一个成员函数来转换为原始指针。标准智能指针通常将其称为
get()

如果它不提供该功能,并且您确实希望获得一个原始指针,那么您可以取消对它的引用,并获取一个指向被取消引用对象的指针(假设它支持取消引用;否则,将其称为指针有点奇怪):

一旦你有了一个
void*
,你可以使用
static\u cast
把它改成
无符号字符*
,如果你想要的话。使用它时要小心,因为混淆对象的字节很容易导致未定义的行为

更新:如果
ns3::Ptr
已记录模板,则可以使用以下方法获取原始指针:

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

reinterpret\u cast
应该有效。应用reinterpret cast非常危险。但我已经做到了。无法解决这个问题。可以。ns3::NetDevice::GetChannel()的返回类型是什么?
code
virtual PtrGetChannel(void)const=0@alee-辛杜:那么什么是
Ptr
?如果没有这个定义,我们只能猜测如何将一个指针转换为原始指针。这与手头的问题完全无关。只有当这个
Ptr
东西可以转换为
void*
时,这才有效。我们没有足够的信息来说明。此外,该标准确实保证
reinterpret\u cast
可以将任何对象指针类型转换为任何其他对象指针类型,并返回原始值;您的双铸既不比单铸更安全,也不比单铸更便携。
unsigned char *check = NULL;
check = static_cast<unsigned char*>(static_cast<void*>(ns3::NetDevice::GetChannel()));
template<typename T>
class Ptr
{
public:
  operator T*() {return _p;}

private:
  T* _p;
};
void * check = ns3::NetDevice::GetChannel();
void * check = ns3::NetDevice::GetChannel().get();
void * check = &*ns3::NetDevice::GetChannel();
void * check = PeekPointer(ns3::NetDevice::GetChannel());