相关疑难解决方法(0)

为什么C#不提供C++风格的"朋友"关键字?

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++ oop design-patterns friend

205
推荐指数
10
解决办法
6万
查看次数

将单元测试作为正在测试的类的朋友有什么问题?

在C++中,我经常将单元测试类作为我正在测试的类的朋友.我这样做是因为我有时觉得需要为私有方法编写单元测试,或者我想要访问某个私有成员,这样我就可以更轻松地设置对象的状态,以便我可以测试它.对我来说,这有助于保持封装和抽象,因为我没有修改类的公共接口或受保护的接口.

如果我购买第三方库,我不希望它的公共接口被一堆我不需要知道的公共方法污染,因为供应商想要进行单元测试!

我也不想担心一群受保护的成员,如果我从一个类继承,我不需要知道.

这就是我说它保留抽象和封装的原因.

在我的新工作中,他们不赞成使用朋友课,甚至进行单元测试.他们说因为班级不应该"知道"关于测试的任何内容,而且你不希望课程和测试的紧密耦合.

有人可以向我解释这些理由,以便我可以更好地理解吗?我只是不明白为什么使用朋友进行单元测试很糟糕.

c++ oop unit-testing encapsulation friend

54
推荐指数
5
解决办法
2万
查看次数

何时在C++中使用友元类

可能重复:
你何时应该在C++中使用'friend'?

我正在刷我的C++(我是一名Java开发人员),我偶然发现了friend class我忘记的关键字.这是其中一个功能只是厨房水槽的一部分,还是有充分理由这样做而不仅仅是一个香草吸气剂?我理解它的区别在于它限制了谁可以访问数据,但我无法想到有必要的情况.

注意:我已经看到了类似的问题,但具体我问,这只是一个高级功能,除了让人们看到你的代码时会感到困惑,直到他们意识到你在做什么之后才会增加真正的价值?

c++ friend keyword

38
推荐指数
4
解决办法
3万
查看次数

C++相当于C#的内部

我试图将一些代码从C#反向移植到C++以解决一个恼人的问题,并且想知道是否有人知道C#的'内部'相当于C++中的内容.

这是一个使用它的例子:

internal int InternalArray__ICollection_get_Count ()
        {
            return Length;
        }
Run Code Online (Sandbox Code Playgroud)

.net c# c++ visual-c++

19
推荐指数
2
解决办法
1万
查看次数

C++:使用朋友类而不是编写getter/setter的糟糕做法?

我有两个课程,在一个方面紧密合作.它们都使用彼此的功能,这些功能应该仅由它们使用而不是由任何其他类使用.

  • 如果我让这两个类成为朋友,这样他们可以直接访问和操作彼此的成员变量,而不使用任何getter/setter函数,这是不好的做法吗?

c++ oop design-patterns class-design friend

10
推荐指数
2
解决办法
7798
查看次数

你什么时候应该使用朋友课?

可能重复:
你何时应该在C++中使用'friend'?

由于缺乏关于朋友课程的文档,我来到了绊脚石.大多数书籍只是简单地解释一下,例如C++摘录:完整参考:

__PRE__

坦率地说,我从未见过有经验的C++程序员编写的任何优秀代码中的朋友类.所以,这是我的问题列表.

1- Do Inherited Classes与基类有相同的朋友吗?例如,如果我将类foo声明为类库的朋友,那么class der(派生自base)也会将foo作为朋友吗?

2- 应该使用朋友类时的特殊情况是什么?

3-我正在创建一个winapi包装器,我想让WinHandle类成为Widget类的朋友(访问一些受保护的成员).推荐吗?或者我应该使用传统的Get/Set功能访问它们?

c++ oop class-design class friend

9
推荐指数
2
解决办法
2万
查看次数

部分类模板专业化是这个设计问题的答案吗?

假设您有一个班级,他们的工作就是连接到远程服务器.我想抽象这个类来提供两个版本,一个通过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++ oop templates specialization

7
推荐指数
2
解决办法
3865
查看次数

C++ 中带有友元方法的两个类

目前我正在阅读一本书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)

但我的猜测无法编译,因为类Xvoid friend Y::f(X* x);方法声明。我怎样才能解决这个难题?请再给我一些猜测。

c++ friend friend-class

5
推荐指数
1
解决办法
1361
查看次数

使用数组初始化struct

我有几个数组:

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++来解决上述问题?

c c++ parsing

4
推荐指数
1
解决办法
2361
查看次数

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++ inheritance class friend

3
推荐指数
1
解决办法
2279
查看次数

c ++中的朋友类/功能

可能重复:
你何时应该在C++中使用'friend'?

我看到很多人推荐一个函数/类在这里成为另一个类的朋友,尽管还有其他选择.难道不应该在C++中谨慎使用朋友吗?在决定使用好友功能之前,我觉得必须考虑其他选项.欢迎提出意见/建议.

c++ friend

1
推荐指数
1
解决办法
3558
查看次数

C++的朋友函数/类使用?

在C++中朋友函数/类的真正用途是什么?你能给出一个只有friend正确方法的例子吗?

谢谢

c++ encapsulation information-hiding friend

1
推荐指数
1
解决办法
1274
查看次数