【问题标题】:C++: friend function passing to non-friends [closed]C ++:传递给非朋友的朋友函数[关闭]
【发布时间】:2013-03-14 12:13:34
【问题描述】:

这不会破坏封装吗?

B.h:

class B{
    int x, y;
public:
    B() : x(1), y(1) {}
    B(const B& obj) : x(obj.x), y(obj.y) {}

    int getx();
    int gety();

    friend void pass_private_members(B&);
};

B.cpp

void non_friend_pass_private_members(int& x);

int B::getx(){
    return this->x;
}

int B::gety(){
    return this->y;
}

void pass_private_members(B& obj){
    non_friend_pass_private_members(obj.x);
}

void non_friend_pass_private_members(int& x){
    x++;
}

main.cpp

int main(){
    B obj;
    pass_private_members(obj);
    cout << obj.getx() << endl;
    return 0;
}

【问题讨论】:

  • 不,也不会从朋友函数的上下文中对 char * 成员调用 strcpy()。同样,它不是好友,但调用者。友谊授予与对象相同的特权。所以问问你自己:你能从你的objects成员函数中调用non_friend_pass_private_members()吗?
  • 不清楚你所说的“打破封装”是什么意思。
  • @VaughnCato 从非好友和非成员函数访问私有成员
  • 你必须在类中声明朋友。因此,您可以控制可以访问成员的确切内容。如果您选择传递实际成员,则与在课堂内传递相同。
  • @WhozCraig 我认为他的意思是从朋友函数访问私有变量会破坏封装规则(在这里猜测)

标签: c++ encapsulation friend access-control


【解决方案1】:

通过声明friend void pass_private_members(B&amp;),您是在告诉编译器您信任pass_private_members 来处理B 的私​​有成员。它对私有成员的作用与编译器无关。这与拥有一个调用non_friend_pass_private_members 的成员函数没有什么不同。

【讨论】:

  • 拥有friend 函数会破坏所有封装规则。问题是“它是否违反了封装规则”,因此您的答案在这方面并未反映“是”或“否”。
【解决方案2】:

是的

它确实违反了封装规则。但是 C++ 在某一点上打破了很多“纯粹的”OOPL 规则。

让我想起了我最喜欢的 C++ 名言:

C++,唯一可以让朋友访问你的隐私的语言!

【讨论】:

  • 啊,不过按照这个问题,如果你的朋友愿意,他们也可以让别人去做
  • 我认为你是对的,这就是他认为正在做的事情。我的评估是,在授予班级友谊时,您授予班级成员应拥有的所有权利。因此,根据他的猜想(以及您的回答,yours 也是)anything 未明确授予访问成员数据的友谊正在破坏封装。这将包括运行时库函数等,不仅可以从友元函数执行,还可以从 members 执行。我恭敬地不同意。您没有违反任何明确告知无需遵守的规则。
  • @WhozCraig 感谢您的洞察力。 :-)
  • 我是你的。你提出的观点很好。