为什么不用嵌套结构分离函数和数据?

时间:2014-10-24 14:39:22

标签: c++ struct nested

我经常考虑在toString-methods,初始化列表中避免“遗忘成员变量”...... 此外,我经常看到对象本身的逻辑(数据使用和操作)与纯数据关注(初始化,获取/设置,复制的构造函数,rval-copy,bla)相混淆。

如果涉及到具有大量方法和成员变量的真正大类,那就会让人感到困惑。

那又是什么原因,为什么程序员不会将所有变量放在一个嵌套的结构中,它只进行数据处理并提取商业逻辑?

我想象

class NestedStructTesting
{
public:
    typedef struct TData
    {
    private:
        int var1;
        float var2;
    public:

        int getVar1(){return var1;};
        void setvar1(int value){var1 = value;};
        int getVar2(){return var2;};
        void setvar2(int value){var2 = value;};     

        TData()
        {
            var1 = 0;
            var2 = 0;
        }
    };
    TData Data;


    NestedStructTesting(void)
        : Data()
    {
    };


};

可能有外线通话,如:     NestedStructTesting st;     st.Data.setvar1()

(我没有任何在大项目中使用它的经验,因为我没有建立一个,但是)

2 个答案:

答案 0 :(得分:0)

因为如果你处于这种情况,那么你很可能需要创建另一个类来分割你的大班级正在做的大量工作。 在这种情况下,您也很可能将该内部类放在其自己的.hpp/.cpp文件中。

如果您认为类的逻辑足够接近以至于它们最好位于相同的文件中,或者只是因为您在整体设计中填充得更清洁,则可以使用内部类。

AFAIK嵌套类只有一个限制,就是你cannot forward declare them in every case

更一般地说,除非你有一个类似MVC的模式,否则你不希望将数据与逻辑分开,但是你宁愿把小块数据与它们相应的小逻辑分组,这是最简单的一个。有效的方法来做OOP。事实上,在框架设计之外,许多开发人员选择了一个分离单元,它不一定是代码的性质/类型(数据/逻辑/其他),而是它的大小,无论好坏:)

答案 1 :(得分:0)

该模式已经存在,它被称为PIMPL习语,它隐藏了所有类数据。

有了它,您可以将公共方法与仅存在于.cpp内的私有方法和数据分开。

作为一个例子,所有的Qt框架都是用这个习惯用法构建的,所以你永远不会(可能会夸大,但你明白了)在他们提供的数百个头文件中看到任何私有类变量,只是公共(和虚拟保护的方法。

PIMPL习惯用法的其他好处是它简化了二进制兼容性,使类接口更清晰(通过从头文件中删除私有和非虚拟受保护成员),减少编译时间(通过从中删除#includes)头文件)并将接口与实现分开(通过隐藏实现因变量和方法,通常是私有的)