C++ 在自足程序中使用“friend”?

C++ 在自足程序中使用“friend”?,c++,class,encapsulation,friend,C++,Class,Encapsulation,Friend,我有一个大型的、独立的环境模型。在这个模型中,我有一个名为cell的大类,它包含许多~100个向量和两个向量,这些向量和向量共同决定了单元格在许多属性中的当前状态。这些属性由不同的环境和生物过程以及其他类别(包含过程特定的功能/方法)更改。我很想让这些进程类成为cell类的20多个好友类,这样我就不必编写近200个get/set函数 它还将使我的代码更简单,更易于阅读: 单元格->变量A=单元格->变量A*someInput/SomeOtherInput vs 单元格->设置变量单元格->获取变

我有一个大型的、独立的环境模型。在这个模型中,我有一个名为cell的大类,它包含许多~100个向量和两个向量,这些向量和向量共同决定了单元格在许多属性中的当前状态。这些属性由不同的环境和生物过程以及其他类别(包含过程特定的功能/方法)更改。我很想让这些进程类成为cell类的20多个好友类,这样我就不必编写近200个get/set函数

它还将使我的代码更简单,更易于阅读:

单元格->变量A=单元格->变量A*someInput/SomeOtherInput

vs

单元格->设置变量单元格->获取变量*someInput/someOtherInput

有充分的理由反对这样做吗?我也应该考虑把数据成员全部公开吗?
该模型是一个自包含的应用程序-我不与其他人共享代码来使用/耦合任何东西。

我不确定您的类概念是否是您应该遵循的方式。您应该使数据更具可读性和紧凑性。无论如何,要回答您的问题:当您希望将来更改实现时,请使用私有成员和getter/setter函数。它们还帮助您调试断点和/或验证值。当您希望隐藏实现并合并功能时,请选择和。你绝对应该让你的类更抽象。例如,my_vector.copyABCDATA from other_vector比my_vector.member=other_vector.member好得多

如果你不关心这些论点,你可以使用公共成员

顺便说一句,您还可以使用宏为类自动创建getter/setter函数

#define MEMBER(datatype, name) \
    private: \
        datatype name; \
    public: \
        datatype get ## name() const { return name; }

class Foo
{
  MEMBER(int, abc)
  MEMBER(char, blub)
};

int main()
{
  Foo f;
  int val = f.getabc();
  return 0;
}

你做错了。类的目的是隔离逻辑,以便您可以遍历所有逻辑。这是从函数到全局函数的一个进步

如果您有200个不同的参数,则不应将它们固定在200个不同的变量中。关联容器的存在是有原因的。枚举的存在是有原因的

class Cell {
    public: 
        enum class ParameterType { Param1, Param2, };

        double getParameter(ParameterType type) { return variables.at(type); }
        void setParameter(ParameterType type, double value) { variables[type] = value; }

    private:
        std::map<ParameterType, double> variables;
};
get/set的100个在哪里?做一个紧凑的设计,事情是可读的

你不想交朋友的原因是出于可维护性的原因。这与不使用globals的原因相同。如果你改变了内部的工作方式,你就不想破坏课堂之外的东西

#define MEMBER(datatype, name) \
    private: \
        datatype name; \
    public: \
        datatype get ## name() const { return name; }

class Foo
{
  MEMBER(int, abc)
  MEMBER(char, blub)
};

int main()
{
  Foo f;
  int val = f.getabc();
  return 0;
}

提示:如果您的类声明长度超过了一个大约几页,您需要将其拆分。

如果您有20多个好友,这与公开数据成员有什么区别?否则,根据经验,当您有诸如cell->setVariableAcell->getVariableA之类的代码时。。。你还没有找到正确的抽象概念。你的目标应该是像cell->do\u something或cell->connect\u toneighbor这样的东西。作为细胞定义的一部分,你的细胞类维护什么样的不变量?如果没有,那么就把它变成一个结构,让你的进程进入城镇。这些过程是否独立于细胞或其一部分的概念?它们是作为单独的实体从cell中分离出来的吗?@Boperson,cell->Do_有什么意味着我将操作cell的方法移动到cell类中?我的解释正确吗?在这一点上,类之外的唯一东西将是改变状态变量的函数的外部强制输入。我不知道你的用例,但是改变单元格的状态应该由单元格本身来管理,作为对环境输入的一种反应。如果我考虑一个真实的单元格,它的状态不是由另一个单元格执行cell->setSodiumLevel42决定的,而是由另一个单元格触发某个事件决定的。一个程序可以通过做单元格> TrimGrutEXTX来模拟这个过程。你如何使用C++中的宏?我添加了一个GETTER函数的例子。请记住,在处理像向量这样大的数据结构时,应该考虑使用引用或指针。你自己决定吧。请记住,这些宏会使您失去正确调试代码的能力,因为断点在其中不起作用。@否定投票者:请您评论一下这个答案有什么问题,或者如何改进它?对我来说,这个答案非常有效,并且很好地提示OP如何重组他的类。现在被我提了起来。