c ++, почему копия объекта не разрешает доступ к закрытой переменной оригинала? - PullRequest
3 голосов
/ 10 июля 2011

Например,

Number operator+(Number a, Number b) {

    return Number(a.x + b.x);


}

Может ли это вызвать "невозможность доступа к частному члену". Я понимаю, что если я не передам ссылку, то число a и номер b копируются в стек и используются в теле функции. Однако я не понимаю, почему они не разрешают доступ к закрытым членам оригиналов. Как я неправильно понимаю концепцию объекта? Кроме того, почему функция друга и члена не должна передаваться по ссылке?

Ответы [ 3 ]

8 голосов
/ 10 июля 2011

operator+ - это несвязанная функция, т. Е. Она не является членом Number, поэтому это правило не имеет неявного доступа к закрытым членам.

На правило не влияет передача вами Number объектов по значению или по ссылке. Защита доступа применяется к каждому доступу к Number объекту, даже если это ваша личная, основанная на стеке копия.

Есть как минимум три выхода:

  • объявить Number operator+(Number, Number) другом Number
  • добавить общедоступный метод получения для x, чтобы переменная была доступна.
  • реализует оператор += как член класса и реализует свободный оператор в терминах этого: return Number(a) += b;
3 голосов
/ 10 июля 2011

Вы определенно что-то не так поняли.«Передача по ссылке», «копирование в стек» и т. Д. Не имеют абсолютно никакого отношения к правилам доступа.

Приведенный выше код является ошибкой, поскольку оператор + не является членом Number и (предположительно) не являетсядруг номера тоже.Поэтому он не может получить доступ к частным пользователям.Вот и все, что нужно.

0 голосов
/ 10 июля 2011

Поскольку многие ответили, оператор + не является членом класса Number, это глобальная переменная. Рассмотрим функцию Show:

void Show(const Number& numberObj) // const, by-ref is IMMATERIAL 
{
   std::cout<< numberObj.x;
}

и метод Show:

class Number
{
private:
    int x;
public:
    void Show()
    {
       std::cout << x;
    }
};

Теперь, если вы замените Show любым перегруженным оператором, принимая 1 или 2 аргумента - только член класса может получить доступ к частным данным, а глобальная реализация - нет.

Для этого вам нужно сделать глобальный Show друг класса (в объявлении класса), а также любой глобально реализованный оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...