【问题标题】:Cast object pointer to char array将对象指针转换为 char 数组
【发布时间】:2012-05-03 06:04:53
【问题描述】:
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

但它根本不起作用。

【问题讨论】:

  • reinterpret_cast 应该可以工作。
  • 重新解释演员表应用非常危险。但我已经这样做了。无法解决问题。完全没有。
  • ns3::NetDevice::GetChannel()的返回类型是什么?
  • codevirtual Ptr GetChannel (void) const =0
  • @alee-sindhu:那么Ptr 是什么?如果没有它的定义,我们只能猜测如何将其转换为原始指针。

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


【解决方案1】:

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

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

您的Ptr&lt;Channel&gt; 必须有重载的运算符,它返回保留的指针:

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

private:
  T* _p;
};

【讨论】:

  • 这与手头的问题完全无关。
  • 只有当这个 Ptr 东西可以转换为 void* 时才有效。我们没有足够的信息来告诉我们。
  • 此外,该标准确实保证reinterpret_cast 可以将任何对象指针类型转换为任何其他对象指针类型并返回,给出原始值;你的双重施法既不安全也不比单一的reinterpret_cast更便携。
【解决方案2】:

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::Ptrhere 记录的模板,那么您可以使用以下方法获取原始指针:

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

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多