Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;:为什么不在作文中使用friend?_C++_Oop_Object - Fatal编程技术网

C++ c++;:为什么不在作文中使用friend?

C++ c++;:为什么不在作文中使用friend?,c++,oop,object,C++,Oop,Object,我是一个试图学习如何正确编码的计算物理学家。到目前为止,我已经编写了几个程序,但下面的规范示例不断出现,我不确定如何处理它。假设我有两个对象的组合,比如 class node { int position; }; class lattice { vector <node*> nodes; double distance (node*,node*); }; 类节点 { 内部位置; }; 类格 { 向量节点; 双距离(节点*,节点*); }; 现在,这将不起

我是一个试图学习如何正确编码的计算物理学家。到目前为止,我已经编写了几个程序,但下面的规范示例不断出现,我不确定如何处理它。假设我有两个对象的组合,比如

class node
{
    int position;
};

class lattice
{
    vector <node*> nodes;
    double distance (node*,node*);
};
类节点
{
内部位置;
};
类格
{
向量节点;
双距离(节点*,节点*);
};
现在,这将不起作用,因为
位置
节点
的私有成员。我知道有两种方法可以解决这个问题:要么创建一个访问器,比如
getpos(){return position}
,要么让lattice成为
节点的
朋友

第二种解决方案对我来说似乎容易多了。然而,我的印象是,这被认为是一种稍微糟糕的做法,人们通常应该坚持使用访问者,避免使用
朋友
。我的问题是:什么时候我应该使用访问器,什么时候我应该在这样的组合中使用友谊


还有一个额外的问题一直困扰着我一段时间:为什么组合首先比子类更受欢迎?根据我的理解,HAS-A助记符论证了这一点,但是,对我来说,把晶格想象成一个有一个叫做node的对象似乎更直观。那将是对象内部的一个对象,例如子类?

如果您只对特定类而不是所有类授予访问权限,那么Friend更适合。如果定义
getpos(){return position}
,则位置信息将通过该getter方法公开访问。另一方面,如果使用friend关键字,则只有lattice类才能访问位置信息。因此,这完全取决于您的设计决策,无论您是否希望公开访问这些信息。

如果您只授予特定类而不是所有类的访问权限,那么Friend更适合您。如果定义
getpos(){return position}
,则位置信息将通过该getter方法公开访问。另一方面,如果使用friend关键字,则只有lattice类才能访问位置信息。因此,这完全取决于您的设计决策,无论您是否希望公开访问信息。

您做了一个“”,这是一个如何不执行OOP的教科书示例,因为更改
位置
不会更改节点中的任何其他内容。即使改变位置会改变
节点
中的某些内容,我也会重新考虑结构,以避免复杂性并提高编译器优化代码的能力

<>我看到C++和java程序员经常这样做。 根据一种心理模板分类。当我要求他们 在解释他们的设计时,他们经常坚持认为这是某种 “标准形式”指所有基本项和复合项(即。 非容器)类本应使用,但它们无法使用 解释它完成了什么。他们有时声称我们需要 获取和设置函数,因为成员数据是私有的 当然,成员数据必须是私有的,这样才能进行更改 不影响其他程序

应改为:

struct node
{
    int position;
};
您制作了一个“”,这是一个如何不执行OOP的教科书示例,因为更改
位置不会更改节点中的任何其他内容。即使改变位置会改变
节点
中的某些内容,我也会重新考虑结构,以避免复杂性并提高编译器优化代码的能力

<>我看到C++和java程序员经常这样做。 根据一种心理模板分类。当我要求他们 在解释他们的设计时,他们经常坚持认为这是某种 “标准形式”指所有基本项和复合项(即。 非容器)类本应使用,但它们无法使用 解释它完成了什么。他们有时声称我们需要 获取和设置函数,因为成员数据是私有的 当然,成员数据必须是私有的,这样才能进行更改 不影响其他程序

应改为:

struct node
{
    int position;
};

并非所有类都必须有私有数据成员。如果您打算创建一个新的数据类型,那么,
position
仅仅作为公共成员可能是完全合理的。例如,如果您正在创建一种类型的“3D向量”,那么它本质上就是一个3元组的数字数据类型。隐藏其数据成员对它没有好处,因为其构造函数和访问器方法的自由度不低于其内部状态,并且没有任何内部状态可以被视为无效

template<class T>
struct Vector3 {
    T x;
    T y;
    T z;
};
模板
结构向量3{
tx;
T y;
tz;
};
编写这样的代码是完全可以接受的——加上各种操作符和其他函数的重载,用于规范化、获取幅值等等

如果一个节点没有非法的位置值,但晶格中没有两个节点不能具有相同的位置或其他约束,则
节点
具有公共成员
位置
,而
晶格
具有私有成员
节点
可能是有意义的

通常,当您像
Vector3
示例一样构造“”时,在创建产品类型时,使用
struct
(或
class
public
),即在其他现有类型之间使用逻辑and,在创建和类型时使用
std::variant
,即现有类型之间的逻辑OR。(为了完整性起见,函数类型将取代逻辑含义。)

正如您所说,当关系是“has-a”关系时,组合优先于继承。我认为,当您试图扩展或链接某些遗留代码时,最好使用继承。它以前也被用作一个贫穷的国家
class A: public B {};
class lattice {
    int x;
    node n;
    int y;
};