C++ Доступ к приватному члену в классе друга

У меня есть 2 класса (firstClass и secondClass), который firstClass является другом secondClass и имеет частное вложенное unordered_map, к которому я хочу получить доступ в функции secondClass. Так что в основном код выглядит так:

    class secondClass;
    typedef unordered_map STable<unsigned, unordered_map<unsigned, double> > NESTED_MAP;


        class firstClass{
        friend class secondClass;
        void myfunc1(secondClass* sc){
            sc->myfunc2(&STable);
        }
        private:
            NESTED_MAP STable;
        };


        class secondClass{
        public:
            void myfunc2(NESTED_MAP* st){
            //Here I want to insert some elements in STable.
            //Something like:
            st[1][2]=0.5;
            }
        };
    int main(){
            firstClass  fco;
            secondClass sco;
            fco.myfunc1(&sco);
            return 0;

        }

Я знаю, что это должно быть тривиально, но я не знаю, как это решить. Любая идея? (Я изменил код и вопрос, чтобы сделать его более понятным)

1 ответ

Решение

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

Здесь в документации сказано:

Объявление друга появляется в теле класса и предоставляет функции или другому классу доступ к закрытым и защищенным членам класса, в котором появляется объявление друга.

Тем не менее, взглянув на ваш пример, я бы лучше поменял место, где нужно разместить ключевое слово friend, поскольку мне кажется, что myfunc2 не должен быть публичным.

Ниже приведен пример, в котором я применил вышеупомянутое предложение, и это показывает, как обращаться с частными членами из класса друзей:

#include<unordered_map>

using namespace std;

class firstClass;

class secondClass{
    friend class firstClass;

private:
    void myfunc2(unordered_map<unsigned,double>& map){
        map[1]=0.5;
    }
};

class firstClass{
public:
void myfunc1(secondClass* sc){
    // here firstClass is accessing a private member
    // of secondClass, for it's allowed to do that
    // being a friend
    sc->myfunc2(STable);
}
private:
    unordered_map<unsigned,double> STable;
};

int main(){
    firstClass  fco;
    secondClass sco;
    fco.myfunc1(&sco);
    return 0;
}
Другие вопросы по тегам