メインコンテンツ

AUTOSAR C++14 Rule A11-3-1

フレンド宣言を使用してはなりません。

説明

ルール定義

フレンド宣言を使用してはなりません。

根拠

関数をクラスのフレンドとして宣言して、クラスのスコープ外にあるクラスのプライベート メンバーにアクセスします。

class A
{
  int data;
  public:
    // operator+ can access private members of class A such as data
    friend A const operator+(A const& lhs, A const& rhs);
};
フレンド関数やフレンド クラスは、データのカプセル化を阻害します。クラス メソッド以外を使用してクラスのプライベート メンバーにアクセスできるようになってしまいます。

フレンド関数を含むコードは保守が難しくなる可能性があります。たとえば、クラス myClass にフレンド クラス anotherClass がある場合、myClass のデータ メンバーを変更するときに、anotherClass のメンバー関数でそのデータ メンバーを使用しているすべてのインスタンスを見つける必要があります。

Polyspace 実装

ルール チェッカーでは、friend キーワードのすべての使用にフラグを設定します。

チェッカーは、AUTOSAR C++ 14 リリース 18-03 (2018 年 3 月) の仕様に従います。ただし、AUTOSAR C++14 の 18-10 以降のリリースでは、operator== などの比較演算子の例外を許可しています。ルール チェッカーが比較演算子の使用にフラグを設定する場合は、結果を正当化するコメントを追加します。詳細は、以下を参照してください。

トラブルシューティング

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

すべて展開する

class myClass
{ 
    int data;
public:
    myClass& operator+=(myClass const& oth);
    friend myClass const operator+(myClass const& lhs, // Noncompliant: Use of friend keyword
                                   myClass const& rhs);

};

operator+ はクラス myClass のフレンド関数であり、そのクラスのプライベート メンバー data にアクセスできます。このフレンド関数が存在するためルールに違反します。

チェック情報

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

バージョン履歴

R2019a で導入