доступ к члену без установщика получателя в c ++ - PullRequest
0 голосов
/ 01 ноября 2019

Я использую английский. Надеюсь, вы понимаете.

Как мы можем получить доступ к личному члену без получателя? Я не могу этого понять.

Когда мы узнали о C ++, к частному, общедоступному, защищенному, приватному члену или функции можно получить доступ в области видимости класса.

class TestClass {
public:
   TestClass() {
     testMem = 10;
   }

   void testFunction() {
     cout << testMem << endl;
   }
private:
   int testMem;
}

но я действительно запутался, когда увидел этот код.


class B {
public:
    B() {
          testNumber = 10;
        }

        void printMember() {
          cout << testNumber << endl;
        }

private:
    int testNumber;
}

class Money {
public:
    Money();
        bool operator < (Money& amount, B& b) const {
           // this code doesn't make any error
           // why same type member can access their private member directly without getter and setter?
           amount.cents = 10;
           amount.dollors = 10;

           // this Code make a error
           // b.testNumber = 10;

           // below
           // compare code
        } 

private:
    int dollars;
    int cents;
};

я действительно запутался ... почему параметр Money & amount может получить доступ к своему приватному члену без получения и получениясеттер? Но класс B не может получить доступ к своему личному члену без добытчика. как..? почему? ..

1 Ответ

0 голосов
/ 01 ноября 2019

Строка 25: b.testNumber = 10;

Этот код генерирует ошибку, поскольку класс Money пытается получить прямой доступ к элементу личных данных другого класса.

Доступ к закрытым элементам данных может получить только сам класс. Вы можете решить эту проблему, сделав функцию в B для изменения элемента данных, а затем вызвать эту функцию, чтобы изменить его.

Пример:

class B {
public:
    B() {
          testNumber = 10;
        }

        void changeMember(int newData)
        {
            testNumber = newData;
        }

        void printMember() {
          cout << testNumber << endl;
        }

private:
    int testNumber;
}

class Money {
    friend class B;
public:
    Money();
        bool operator < (Money& amount, B& b) const {
           // this code doesn't make any error
           amount.cents = 10;
           amount.dollars = 10;

           // this Code make a error
           b.changeMember(10);

           // below
           // compare code
        } 

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