【问题标题】:What happens when Classes that are friends have same name member variables当作为朋友的类具有相同名称的成员变量时会发生什么
【发布时间】:2016-04-14 14:48:56
【问题描述】:

在 C++ 中,当我有以下情况时会发生什么

class House
{
public:
    House();
    ~House();

private:
    int* m_peopleInside;

friend class Room;
}; 

然后在 House 的构造函数中设置这个

m_peopleInside = new int[5];
m_peopleInside[4] = 2;

class Room
{
public:
    Room();
    ~Room();

    Update();

private:
    int* m_peopleInside;
}; 

然后在 Room.Update() 我使用 m_peopleInside 这样的东西。

&m_peopleInside[4];

据我了解,朋友类将允许 Room 类访问 House 类的私有成员。那么将使用哪个 m_peopleInside 呢?

我应该补充一点,在这种情况下,m_peopleInside 被用作一个数组。

【问题讨论】:

  • 这取决于你如何使用m_peopleInside。请显示一些示例代码。

标签: c++ oop friend


【解决方案1】:

这是一个实例变量。所以它需要一个实例来执行。如果没有提供实例,则它与this->m_peopleInside 相同,这意味着它指的是调用函数的实例。因此,例如,如果这是您的函数:

void Room::Update() {
    // these two are the same, they null the member of the Room object
    m_peopleInside = nullptr;
    this->m_peopleInside = nullptr;

    House h;
    // should be pretty obvious what this does
    h.m_peopleInside = nullptr;
}

【讨论】:

  • 您好,感谢您的回复。我理解你的回答,但它会根据它的使用方式而改变吗?我在问题中的示例中添加了更多内容。
  • @unknownSPY:如果你在它的左边放置一个不同的对象,它会改变,使用成员访问运算符 (.)。我完全不清楚您认为它如何访问 House 成员变量(没有命名House 对象)。 您希望它访问哪个 House 对象的成员?
  • 非常好的问题。我可以PM你吗?我有一些代码要写,但与问题并不完全相关,而且很难将其放在评论中。
  • @unknownSPY:不。在新帖子中提出一个新问题。
【解决方案2】:

据我了解,friend 类将允许 Room 类访问 House 类的私有成员。

没错。

那么将使用哪个m_peopleInside

要访问House 对象的m_peopleInside 成员,您需要House 类型的对象或指针。

Room::update()中,如果你简单地使用m_peopleInside,它将是Room的成员变量,而不是House

【讨论】:

  • 您好,感谢您的回复。我理解你的回答,但它会根据它的使用方式而改变吗?我在问题中的示例中添加了更多内容。
  • 是的。如果没有House 对象,任何在Room::update 中使用m_peopleInside 都将是Room 的成员变量,而不是House
【解决方案3】:

当您在“Room.Update()”中使用“m_peopleInside”时,您肯定会使用“Room”的数据成员。您对“朋友”类的理解不是那么正确。为了清楚起见,假设您在“Room”类的方法之一中拥有来自“House”类的对象“x”,例如“Update()”。那么,以下代码在此是正确的方法:

cout << x.m_peopleInside;

虽然 "m_peopleInside" 在 "House" 中是私有的,但它可以从 Room 的方法中访问,因为 "House" 类声明 "Room" 是他的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多