【问题标题】:C++ class/struct conversion to void* pointer and reverseC++ 类/结构转换为 void* 指针和反向
【发布时间】:2022-01-17 05:24:27
【问题描述】:

我有一堂课:

class A
{
public:
   A (A& in) {} // How to write a constructor from void* ?
   int a;
   int b;
   const void* data() const { return static_cast<const void *>(this); }
};

我需要通过一个连接传递类数据,该连接需要一个void* 缓冲区并“返回”也void*。一个实例和一些函数:

  A a;
  void send(void* x);
  void receive(void* x);
  • 如何键入转换a 以将其作为参数发送到foo()?以下代码无效:

    foo(static_cast(a));

  • 那么,我怎样才能从 void* x 指针创建一个新对象?要实现什么构造函数和类型转换?

    无效* pA; 帕 = ... 一个 a_copy {pA};

  • 如果我有一个结构而不是一个类,会有什么区别?我在这里假设 POD 类。

我不想使用 c 风格的强制转换,而是使用 C++ 结构。

【问题讨论】:

    标签: c++11 casting


    【解决方案1】:

    如何键入转换 a 以将其作为参数发送到 foo()?以下代码无效:

    foo(static_cast<A&>(a));
    

    我假设您的意思是 send() 而不是 foo()?如果是这样,则您的代码无效,因为您将其转换为对A 的引用,而send() 需要指向void 的指针。所以:

    send(static_cast<void *>(&a));
    

    或者,因为您已经有一个为您进行强制转换的成员函数:

    send(a.data());
    

    那么,我怎样才能从 void* x 指针创建一个新对象?要实现什么构造函数和类型转换?

    如果您真的想这样做,那么您的构造函数应该再次将指向 void 的指针作为参数,而不是对另一个 A 的引用:

    class A
    {
    public:
       A(void* in) {...}
       ...
    };
    

    然后您可以使用std::memcpy() 将所有数据复制到类中

    A(void *in) {
        std::memcpy(this, in, sizeof *this);
    };
    

    当然,只有在 A 是 POD 类型时才应该这样做。

    如果我有 struct 而不是 class,会有什么区别?我在这里假设 POD 类。

    什么都没有。 structclass是一样的,只是struct默认为public,类默认为private

    【讨论】:

    • 感谢您的 cmets。 A(void *in) { std::memcpy(this, in, sizeof *this); }; 有没有办法在不使用 std::memcopy() 的情况下从 void* 指针构造新类?
    • 除了使用std::memmove()而不是std::memcpy(),没有。你只能使用它的原因是因为它是create an object 而不诉诸std::reinterpret_cast&lt;&gt;() 的唯一有效方法,而后者也是有问题的。考虑到你得到的指针可能不符合class A的对齐限制。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多