メインコンテンツ

AUTOSAR C++14 Rule A11-0-1

A non-POD type should be defined as class

説明

ルール定義

A non-POD type should be defined as class.

根拠

POD (Plain Old Data) 型は C コードとバイナリ形式で交換可能であり、std::memcpy 関数を使用して安全にコピーできます。スカラー型、C スタイルの構造体と共用体、およびそれらの型の配列はすべて POD 型の例です。一方、C++ 言語では非 POD 型の構造体と共用体も作成できます。このような構成要素と共用体では、カスタム定義コンストラクターの提供、プライベートまたは保護アクセス制御の非静的データ メンバーの保持、インターフェイスの保持、および不変の実装ができます。

ソフトウェア開発者は通常、クラスの使用によって実装されるカプセル化などのオブジェクト指向の概念を必要とします。さらに、クラス指定子は型が既定ですべてのメンバーにプライベート アクセス制御を提供するよう強制します。これはカプセル化された型の実装にそのまま適しています。それで、読み取りやすく保守しやすいコードを作成するには、構造体や共用体ではなくクラスとして非 POD 型を定義します。

Polyspace 実装

チェッカーはコード内の構造体または共用体が POD 型ではないことを示すフラグを設定します。これには、テンプレートを使用してインスタンス化される構造体と共用体も含まれます。

C++ 言語の POD 型の簡単な説明については、前の節を参照してください。POD 型の詳細な仕様については、C++ リファレンス マニュアルを参照してください。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#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 Astruct B は両方とも同じ非 POD 型を実装します。この型には次のものが含まれています。

  • プライベート アクセス制御の非静的データ メンバー x

  • 2 つのユーザー定義コンストラクター。既定のコンストラクターは、xint32 型が格納できる最大値に初期化します。1 つのパラメーターを取るコンストラクターでは暗黙的な変換を禁止します。

  • オブジェクトの状態にアクセスし変更するための GetX メソッドと SetX メソッドで提供されるインターフェイス。

コンテンツをカプセル化するこの型をクラスとして実装するのは望ましい方法です。

class A の定義はこのコーディング ルールに準拠しています。struct B の定義はこのコーディング ルールに違反します。

チェック情報

グループ: メンバー アクセス制御
カテゴリ: Advisory、Automated

バージョン履歴

R2020b で導入