exponenta event banner

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 имеет класс friend anotherClass, когда вы меняете представитель данных myClass, вы должны найти все образцы его использования в представителе функциях anotherClass.

Реализация Polyspace

Средство проверки правил помечает все виды использования friend ключевое слово.

Шашка соответствует спецификациям AUTOSAR C++ 14 релиза 18-03 (март 2018 года). Однако выпуск 18-10 и более поздние релизы AUTOSAR C++ 14 допускают исключение для таких операторов сравнения, как 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. Наличие этой функции друга нарушает правило.

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

Группа: Управление доступом представителей
Категория: Необходимый, Автоматизированный
Введенный в R2019a