将对象指针转换为字符数组

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

但它根本不起作用。


1
reinterpret_cast 应该可以工作。 - sth
1
reinterpret_cast是一种非常危险的类型转换,但我已经使用它了。完全无法解决问题。 - Khizar Ali
ns3::NetDevice::GetChannel() 的返回类型是什么? - DumbCoder
代码virtual Ptr<Channel> GetChannel(void) const = 0 - Khizar Ali
@alee-sindhu:那么Ptr是什么?如果没有定义,我们只能猜测如何将其转换为原始指针。 - Mike Seymour
2个回答

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这里记录的模板,则可以使用以下方式获取原始指针:
void * check = PeekPointer(ns3::NetDevice::GetChannel());

0

最好使用两个 static_cast 而不是 reinterpret_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;
};

这与手头的问题完全无关。 - Puppy
1
只有当这个“Ptr”东西可以转换为“void*”时,它才能正常工作。我们没有足够的信息来判断。 - Mike Seymour
1
此外,标准确保reinterpret_cast可以将任何对象指针类型转换为任何其他对象指针类型,并返回原始值;您的双重转换既不比单个reinterpret_cast更安全,也不更具可移植性。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接