在自包含程序中使用`friend`?

时间:2015-09-02 22:35:35

标签: c++ class encapsulation friend

我有一个庞大的,独立的环境模型。在模型中,我有一个名为cell的大型类,它包含许多(~100)vectorsdoubles,它们共同决定了许多属性中cell的当前状态。这些属性由不同的环境和生物过程(其他classes)改变,其中包含过程特定的功能/方法。我很想在cell类中创建所有这些流程类(20+)的朋友类,这样我就不必编写近200个get / set函数。

它还允许我的代码更简单易读:

cell->variableA = (cell->variableA * someInput)/(somOtherInput)

VS

cell->setVariableA(cell->getVariableA * someInput)/(someOtherInput)

有没有坚实的理由反对这样做?我是否应该只考虑将数据成员公开?

该模型是一个自包含的应用程序 - 我不与其他人共享代码以使用/耦合任何内容。

2 个答案:

答案 0 :(得分:0)

我不确定你的班级概念是否应该遵循。您应该使您的数据更具可读性和紧凑性。无论如何,要回答你的问题:当你想要在将来改变实现时,使用私有成员和getter / setter函数。它们还可以帮助您使用断点和/或验证值进行调试。如果要隐藏实现并组合功能,请首选encapsulationabstraction。你绝对应该让你的课程更抽象。例如。 my_vector.copyAbcDataFrom(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;
}

答案 1 :(得分: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;
};

获取/设置100的位置在哪里?设计紧凑,可读。

您不想交朋友的原因是出于可维护性原因。这与您不使用全局变量的原因相同。如果你改变了内部的工作方式,你就不希望在课堂之外破坏它。

提示:如果您的班级声明超过几页,则需要将其拆分。