exponenta event banner

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