exponenta event banner

Правило AUTOSAR C++ 14 A11-0-1

Тип не-POD должен быть определен как класс

Описание

Определение правила

Тип не-POD должен быть определен как класс.

Объяснение

Тип POD (простые старые данные) может быть заменен кодом C в двоичной форме и может быть безопасно скопирован с помощью std::memcpy функция. Скалярные типы, структуры и объединения в стиле C и массивы этих типов являются примерами типов POD. Однако язык C++ также позволяет создавать структуры и объединения, не являющиеся типами POD. Такие структуры и объединения могут предоставлять пользовательские конструкторы, иметь нестатические элементы данных с частным или защищенным управлением доступом, иметь интерфейс и реализовывать инвариант.

Разработчик программного обеспечения обычно ожидает, что объектно-ориентированные концепции, такие как инкапсуляция, будут реализованы с использованием классов. Кроме того, спецификатор класса по умолчанию вынуждает тип обеспечивать управление частным доступом для всех его членов и естественно подходит для реализации инкапсулированных типов. Таким образом, для создания легко читаемого и ремонтируемого кода определите тип, не являющийся типом POD, как класс вместо структуры или объединения.

Внедрение Polyspace

Средство проверки помечает структуру или объединение в коде, которое не является типом POD. Это относится к структурам и объединениям, созданным с помощью шаблонов.

Упрощенное описание типа POD на языке C++ см. в предыдущем разделе. Полную спецификацию типа POD см. в справочном руководстве по C++.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

#include <cstdint>
#include <limits>

class A // Compliant, non-POD type defined as class
{
    std::int32_t x; // Data member is private by default

  public:
    static constexpr std::int32_t maxValue = std::numeric_limits<std::int32_t>::max();
    A() : x(maxValue) {}
    explicit A(std::int32_t number) : x(number) {}

    std::int32_t GetX() const noexcept
    {
      return x;
    }
	
    void SetX(std::int32_t number) noexcept
    {
      x = number;
    }
};

struct B // Noncompliant, non-POD type defined as struct
{ 
  private:
    std::int32_t x;  // Must provide private access specifier for x member
	
  public:
    static constexpr std::int32_t maxValue = std::numeric_limits<std::int32_t>::max();
    B() : x(maxValue) {}
    explicit B(std::int32_t number) : x(number) {}

    std::int32_t GetX() const noexcept
    {
      return x;
    }
	
    void SetX(std::int32_t number) noexcept
    {
      x = number;
    }
};

Оба class A и struct B реализовать один и тот же тип, не связанный с POD. Этот тип имеет:

  • Нестатический элемент данных x имеет управление частным доступом.

  • Два пользовательских конструктора. Инициализируется конструктор по умолчанию x до максимального значения, int32 тип может хранить. Конструктор с одним параметром запрещает неявное преобразование.

  • Интерфейс, предоставляемый GetX и SetX для доступа и изменения состояния объекта.

Предпочтительно реализовать этот тип, который инкапсулирует его содержимое, как класс.

Определение class A соответствует этому правилу кодирования. Определение struct B нарушает это правило кодирования.

Проверить информацию

Группа: Управление доступом участников
Категория: Консультации, Автоматизированные
Представлен в R2020b