AUTOSAR C++14 Rule A11-0-1

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

Описание

Управляйте определением

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

Объяснение

POD (Простые Данные) типом можно обменяться с кодом С в его двоичной форме и можно безопасно скопировать при помощи 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