返回二进制数据的通用方式,而无需原始指针

Generic way of returning binary data without raw pointers

本文关键字:原始 指针 方式 数据 二进制 返回      更新时间:2023-10-16

我有3个类似的类(psuedocode(:

class Parent {
    public:
        virtual void * getData(size_t & size) = 0;
};
class A : public Parent {
    public:
        void * getData(size_t & size) {
            size = sizeof(structA);
            structA * a = new structA();
            //fill er up
            return (void *) a;
        };
};
class B : public Parent {
    public:
        void * getData(size_t & size) {
            size = sizeof(structB);
            structB * b = new structB();
            //fill er up
            return (void *) b;
        };
};

structAstructB是我无法修改的POD C结构(供应商提供(,因此我无法创建父并返回polymorphic unique_ptr。例如。

我的问题是:有没有一种方法可以让A类和B级返回其struct数据,而无需使用原始指针,因为我拥有的约束?

您可以将智能指针用于数据,即使您不将其放入多态性包装器中,例如:

class Parent
{
public:
    using dataPtr = std::unique_ptr<void, void(*)(void*)>;
    virtual dataPtr getData(size_t & size) = 0;
};
class A : public Parent
{
public:
    dataPtr getData(size_t & size) override
    {
        size = sizeof(structA);
        dataPtr a(new structA, [](void *data){ delete static_cast<structA*>(data); });
        //fill er up
        return std::move(a);
    }
};
class B : public Parent
{
public:
    dataPtr getData(size_t & size) override
    {
        size = sizeof(structB);
        dataPtr b(new structB, [](void *data){ delete static_cast<structB*>(data); });
        //fill er up
        return std::move(b);
    }
};

或:

class Parent
{
public:
    using dataPtr = std::shared_ptr<void>;
    virtual dataPtr getData(size_t & size) = 0;
};
class A : public Parent
{
public:
    dataPtr getData(size_t & size) override
    {
        size = sizeof(structA);
        dataPtr a(new structA, [](void *data){ delete static_cast<structA*>(data); });
        //fill er up
        return a;
    }
};
class B : public Parent
{
public:
    dataPtr getData(size_t & size) override
    {
        size = sizeof(structB);
        dataPtr b(new structB, [](void *data){ delete static_cast<structB*>(data); });
        //fill er up
        return b;
    }
};

实时演示