【问题标题】:C++ Accessing a private member in a friend classC ++访问朋友类中的私有成员
【发布时间】:2015-11-22 22:13:30
【问题描述】:

我有 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;

        }

我知道它应该是微不足道的,但我不知道如何解决它。 任何的想法? (我更改了代码和问题以使其更清楚)

【问题讨论】:

  • 如果一个类在另一个类中,您将如何访问公共数据成员?
  • 我没明白你的意思。
  • @Hakim 让第二类成为朋友意味着您可以像访问public 成员一样访问其private 成员。

标签: c++ private-members friend-class


【解决方案1】:

友元类可以访问任何私有成员,因此您可以简单地调用方法和修改属性,就像它们是公共的一样。

Here 文档,上面写着:

友元声明出现在类主体中,并授予函数或其他类访问友元声明所在类的私有和受保护成员的权限。

也就是说,通过查看您的示例,我宁愿更改放置 friend 关键字的位置,因为在我看来 myfunc2 不应该公开

它遵循我应用上述建议的示例,并展示了如何处理来自朋友类的 private 成员:

#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;
}

【讨论】:

  • 非常感谢skypjack。由于我太累了,我完全忽略了这一点。它有效。
猜你喜欢
  • 2021-08-16
  • 2015-11-24
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多