友元类如何访问嵌套类的私有成员

How a friend class can access a private member of a nested class?

本文关键字:嵌套 成员 访问 何访问 友元      更新时间:2023-10-16

请考虑以下示例:

class SIP{
    public:
        friend std::ostream& operator<<(std::ostream& os, const SIP& c);
    private:
        class BusStop;
        std::vector<BusStop*> mbusStops;
};
class SIP::BusStop{
    private:
        struct BusInfo;
        std::vector<BusInfo*> mbusStopTerminal;
};
struct SIP::BusStop::BusInfo{
    std::string from;
    std::string to;
};
std::ostream& operator<<(std::ostream &os, const SIP &c) {
    for (std::vector<SIP::BusStop*>::const_iterator it = c.mbusStops.begin(); 
         it != c.mbusStops.end(); it++){
        for (std::vector<SIP::BusStop::BusInfo*>::const_iterator it2 = mbusStopTerminal.begin(); 
             it2 != mbusStopTerminal.end(); it2++){
        }
    }
    return os;
}

它不会编译,因为 BusInfo 结构是私有的。默认情况下,友元类无法访问嵌套类的私有成员。在这种情况下我该怎么办?有什么解决方法吗?

您可以向SIP添加一个停止打印功能:

class SIP{
    public:
        friend std::ostream& operator<<(std::ostream& os, const SIP& c);
    private:
        void printStops(std::ostream& os);
        class BusStop;
        std::vector<BusStop*> mbusStops;
};
std::ostream& operator<<(std::ostream &os, const SIP &c) {
    c.printStops(os);
    return os;
}

或者你可以一直添加运算符:

class SIP{
    public:
        friend std::ostream& operator<<(std::ostream& os, const SIP& c);
    private:
        class BusStop;
        std::vector<BusStop*> mbusStops;
};
class SIP::BusStop{
    private:
        friend std::ostream& operator<<(std::ostream& os, const BusStop& c);
        struct BusInfo;
        std::vector<BusInfo*> mbusStopTerminal;
};
struct SIP::BusStop::BusInfo{
    std::string from;
    std::string to;
};
std::ostream& operator<<(std::ostream &os, const SIP::BusStop::BusInfo &i)
{
   // Whatever
}
std::ostream& operator<<(std::ostream &os, const SIP::BusStop &c)
{
    for (std::vector<SIP::BusStop::BusInfo*>::const_iterator it = mbusStopTerminal.begin(); 
         it != mbusStopTerminal.end(); it++){
        os << **it;
    }   
}
std::ostream& operator<<(std::ostream &os, const SIP &c) {
    for (std::vector<SIP::BusStop*>::const_iterator it = c.mbusStops.begin(); 
         it != c.mbusStops.end(); it++){
        os << **it;
    }
    return os;
}

或适合您的代码的任意方法组合。