在C++朋友关键字允许class A指定class B作为其朋友.这允许Class B访问private/的protected成员class A.
我从来没有读过任何关于为什么这个被排除在C#(和VB.NET)之外的东西.早期StackOverflow问题的大多数答案似乎都说它是C++的一个有用部分,并且有充分的理由使用它.根据我的经验,我必须同意.
在我看来,另一个问题是如何friend在C#应用程序中执行类似的操作.虽然答案通常围绕嵌套类,但它看起来并不像使用friend关键字那么优雅.
最初的设计模式书在其示例中定期使用它.
总而言之,为什么friend缺少C#,以及在C#中模拟它的"最佳实践"方式(或方法)是什么?
(顺便说一句,该internal关键字不一样的东西,它可以让所有的整个组件来访问内部的阶级internal的成员,同时friend允许你给某一类的完全访问权限,以正好一个其他类)
在C++中,我经常将单元测试类作为我正在测试的类的朋友.我这样做是因为我有时觉得需要为私有方法编写单元测试,或者我想要访问某个私有成员,这样我就可以更轻松地设置对象的状态,以便我可以测试它.对我来说,这有助于保持封装和抽象,因为我没有修改类的公共接口或受保护的接口.
如果我购买第三方库,我不希望它的公共接口被一堆我不需要知道的公共方法污染,因为供应商想要进行单元测试!
我也不想担心一群受保护的成员,如果我从一个类继承,我不需要知道.
这就是我说它保留抽象和封装的原因.
在我的新工作中,他们不赞成使用朋友课,甚至进行单元测试.他们说因为班级不应该"知道"关于测试的任何内容,而且你不希望课程和测试的紧密耦合.
有人可以向我解释这些理由,以便我可以更好地理解吗?我只是不明白为什么使用朋友进行单元测试很糟糕.
可能重复:
你何时应该在C++中使用'friend'?
我正在刷我的C++(我是一名Java开发人员),我偶然发现了friend class我忘记的关键字.这是其中一个功能只是厨房水槽的一部分,还是有充分理由这样做而不仅仅是一个香草吸气剂?我理解它的区别在于它限制了谁可以访问数据,但我无法想到有必要的情况.
注意:我已经看到了类似的问题,但具体我问,这只是一个高级功能,除了让人们看到你的代码时会感到困惑,直到他们意识到你在做什么之后才会增加真正的价值?
我试图将一些代码从C#反向移植到C++以解决一个恼人的问题,并且想知道是否有人知道C#的'内部'相当于C++中的内容.
这是一个使用它的例子:
internal int InternalArray__ICollection_get_Count ()
{
return Length;
}
Run Code Online (Sandbox Code Playgroud) 我有两个课程,在一个方面紧密合作.它们都使用彼此的功能,这些功能应该仅由它们使用而不是由任何其他类使用.
可能重复:
你何时应该在C++中使用'friend'?
由于缺乏关于朋友课程的文档,我来到了绊脚石.大多数书籍只是简单地解释一下,例如C++摘录:完整参考:
__PRE__
坦率地说,我从未见过有经验的C++程序员编写的任何优秀代码中的朋友类.所以,这是我的问题列表.
1- Do Inherited Classes与基类有相同的朋友吗?例如,如果我将类foo声明为类库的朋友,那么class der(派生自base)也会将foo作为朋友吗?
2- 应该使用朋友类时的特殊情况是什么?
3-我正在创建一个winapi包装器,我想让WinHandle类成为Widget类的朋友(访问一些受保护的成员).推荐吗?或者我应该使用传统的Get/Set功能访问它们?
假设您有一个班级,他们的工作就是连接到远程服务器.我想抽象这个类来提供两个版本,一个通过UDP连接,另一个通过TCP连接.我想构建最精简的运行时代码,而不是使用多态,我正在考虑模板.这是我想象的,但我不确定这是最好的方法:
class udp {};
class tcp {};
template<class T,typename X>
class service
{
private:
// Make this private so this non specialized version can't be used
service();
};
template<typename X>
class service<udp, X>
{
private:
udp _udp;
X _x;
};
template<typename X>
class service<tcp, X>
{
private:
tcp _tcp;
X _x;
};
Run Code Online (Sandbox Code Playgroud)
因此最终的好处是T的通用性仍然可用,但设置UDP或TCP连接所需的非常不同的代码已经过专门化.我想你可以将它们放在一个类中,或者提供另一个类,它遵循一些纯虚拟接口来设置网络连接,比如IConnectionManager.
但这确实留下了通用T的代码问题,现在必须在两个专用版本中编写和维护,它们最终都是相同的.如何最好地解决这个问题?我有一种感觉,我认为这一切都错了.
目前我正在阅读一本书C++,它有一些练习。其中一个练习要求构建两个类,其中每个类都有一个用于另一个类的朋友方法。我目前的猜测是这样的:
#include <iostream>
using std::cout;
using std::endl;
class Y;
class X{
public:
void friend Y::f(X* x);
void g(Y* y){cout << "inside g(Y*)" << endl;}
};
class Y{
public:
void friend X::g(Y* y);
void f(X* x) {cout << "inside f(X*)" << endl;}
};
Run Code Online (Sandbox Code Playgroud)
但我的猜测无法编译,因为类X有void friend Y::f(X* x);方法声明。我怎样才能解决这个难题?请再给我一些猜测。
我有几个数组:
const string a_strs[] = {"cr=1", "ag=2", "gnd=U", "prl=12", "av=123", "sz=345", "rc=6", "pc=12345"};
const string b_strs[] = {"cr=2", "sz=345", "ag=10", "gnd=M", "prl=11", "rc=6", "cp=34", "cv=54", "av=654", "ct=77", "pc=12345"};
Run Code Online (Sandbox Code Playgroud)
然后我需要解析'='然后将值放在结构中.(rc键映射到结构中的fc键),其形式为:
struct predict_cache_key {
pck() :
av_id(0),
sz_id(0),
cr_id(0),
cp_id(0),
cv_id(0),
ct_id(0),
fc(0),
gnd(0),
ag(0),
pc(0),
prl_id(0)
{ }
int av_id;
int sz_id;
int cr_id;
int cp_id;
int cv_id;
int ct_id;
int fc;
char gnd;
int ag;
int pc;
long prl_id;
};
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是数组不是与struct字段顺序或顺序相同.因此,我需要检查每个,然后想出一个方案,将相同的结构放入结构中.
有什么帮助使用C或C++来解决上述问题?
我正在尝试编译这样的代码:
#include <iostream>
using namespace std;
class CPosition
{
private:
int itsX,itsY;
public:
void Show();
void Set(int,int);
};
void CPosition::Set(int a, int b)
{
itsX=a;
itsY=b;
}
void CPosition::Show()
{
cout << "x:" << itsX << " y:" << itsY << endl;
}
class CCube
{
friend class CPosition;
private:
CPosition Position;
};
main()
{
CCube cube1;
cube1.Position.Show();
cube1.Position.Set(2,3);
cube1.Position.Show();
}
Run Code Online (Sandbox Code Playgroud)
但是在函数main()中无法访问'CCube :: Position'3次.我希望在CPube之外声明类CPosition,以便将来可以在新类中使用它,例如CBall :)但是如何在不使用继承的情况下使其工作.可能吗 :)?
问候,PK
可能重复:
你何时应该在C++中使用'friend'?
我看到很多人推荐一个函数/类在这里成为另一个类的朋友,尽管还有其他选择.难道不应该在C++中谨慎使用朋友吗?在决定使用好友功能之前,我觉得必须考虑其他选项.欢迎提出意见/建议.
在C++中朋友函数/类的真正用途是什么?你能给出一个只有friend正确方法的例子吗?
谢谢
c++ ×12
friend ×9
oop ×5
c# ×2
class ×2
class-design ×2
.net ×1
c ×1
friend-class ×1
inheritance ×1
keyword ×1
parsing ×1
templates ×1
unit-testing ×1
visual-c++ ×1