Если класс C ++ имеет динамическое распределение c в методе класса, но не имеет конструктора / деструктора или каких-либо нестатических c членов, является ли он по-прежнему типом POD? - PullRequest
0 голосов
/ 26 февраля 2020

Предположим, у меня есть следующий класс:

class A
{
    public:
        int index;
        int init(int type);
}

int A::init(int type)
{
    Interface* interface = SelectInterface(type);
    int index = interface->get_index(type);
    delete interface;
}

И затем у меня есть следующий интерфейс:

// ----------- INTERFACES -------------- //

class Interface
{
    virtual int get_index() = 0;
}

// This is the interface factory
Interface* SelectInterface(int type)
{
    if (type == 0)
    { 
        return new InterfaceA();
    }
    else if (type == 1)
    {
        return new InterfaceB();
    }

    return null;
}

class InterfaceA :: public Interface
{
    InterfaceA();
    int get_index();
} 

int InterfaceA::get_index()
{
    return 5;
}

class InterfaceB :: public Interface
{
    InterfaceB();
    int get_index();
} 

int InterfaceB::get_index()
{
    return 6;
}

В классе A нет конструкторов или деструкторов, или нет stati c члены данных. Однако класс A динамически выделяет объект и затем удаляет его в методе класса.

Является ли класс A по-прежнему типом POD (обычные старые данные)?

1 Ответ

1 голос
/ 26 февраля 2020

Не имеет значения, что выполняет функция-член init или нет. Это не влияет на то, является ли A типом POD или нет (в вашем примере это так).

POD - это старая вещь, которая устарела в C ++ 20, вы, вероятно, захотите проверить стандартное расположение.

Вы можете проверить это при написании кода

#include <type_traits>
static_assert(std::is_pod<A>::value, "");
static_assert(std::is_standard_layout<A>::value, "");

или C ++ 17 и выше

#include <type_traits>
static_assert(std::is_pod_v<A>);
static_assert(std::is_standard_layout_v<A>);
...