C++ 类函数分组

Posted

技术标签:

【中文标题】C++ 类函数分组【英文标题】:C++ Class functions into groups 【发布时间】:2020-05-11 15:41:21 【问题描述】:

我只是来询问是否有任何方法可以将 C++ 中的类函数分组到不同的“子组”中。 (SerialPort 函数、DataManagement 函数、加密函数……

我想使用对象从某个“组”中调用该函数(我不知道如何调用它) 例如,保存当前 bool 将是 obj.save()save() 位于名为 DataManagement 的组中)或 obj.send()send() 位于名为 SerialPort 的组中)。 我只是想知道这是否可能,只对类函数进行分组

【问题讨论】:

如果调用函数不需要命名组,那么这些组的目的是什么? 如果你想把一个类的方法分成几组,那么这个类做的太多了。一个类应该只做一件事 听起来你需要一个 SerialPort 类、一个 DataManagement 类和一个 EncryptionStream 类 请阅读the single responsibility principle。 C++ 是怪诞的模块化。您可以定义一个类,然后花费接下来的一百个文件来实现所有的点点滴滴。也就是说,上面的cmets是完全正确的。如果您发现自己这样做了,那么您可能还有其他应该首先解决的设计问题。 【参考方案1】:

您可以通过为每个组创建一个单独的类并对其进行多重继承来做到这一点

class MultiResponsible : public SerialPort, DataManagement, Encryption 
...

这样你就走上了单一职责原则的道路。

【讨论】:

谢谢!仅使用派生类创建对象是否正确?我的意思是,每个类别中只有函数(SerialPort、DataManagement、...).. 所以没有必要创建它们的对象。 这些函数将没有任何数据可以使用,每个函数都需要访问它们的相关数据,这可以在它们的构造函数中完成,或者它们可以自己包含相关数据并且只共享一些数据.【参考方案2】:

这是一个相当晚的答案,但我认为它可能会帮助其他想知道同样事情的人:“我可以[逻辑上]对类方法进行分组吗?” - 答案是是的 -但是-您不会绕过代码复制并为每个子组存储一个指针; 该解决方案利用结构将所需的函数分组在其中,这些函数在初始化时将指针指向托管类。最好的是:这可以嵌套。

这是一个代码示例:

#include <iostream>
#include <string>

using namespace std;

class Super 
    int super_store_;
public:
    Super(int super_store) : super_store_(super_store) ;
protected:
    void report(const std::string& caller)  cout << caller <<endl; ;
    int add_super_store(int i)  return i+super_store_;;
    int subt_super_store(int i)  return i-super_store_;;
public:
    struct subgrouped0 
        Super* intern_;
        explicit subgrouped0(Super* super) : intern_(super) ;
        void call_report() intern_->report("subgrouped0");;
        int my_special_fkt(int i) return intern_->add_super_store(i);;
     subgrouped0this;

    /// here is the other subcat
    struct subcat0 
        Super* intern_;
        explicit subcat0(Super* super) : intern_(super) ;
        void call_report() intern_->report("subcat0");;
        int my_exclusive_fkt(int i) return intern_->subt_super_store(i);;
        struct subcat1 
            Super *intern_;
            explicit subcat1(Super *super) : intern_(super) ;
            void call_report()  intern_->report("subcat1"); ;
            int my_nested_fkt(int i)  return intern_->subt_super_store(i); ;
        subcat1this->intern_;
     subcat0this;
;

这使您可以编写以下代码:

int main(int argc, char *argv[]) 
    Super super(4);

    super.subgrouped0.call_report();
    super.subgrouped0.my_special_fkt(0);

    super.subcat0.call_report();
    super.subcat0.my_exclusive_fkt(1);

    super.subcat0.subcat1.call_report();
    super.subcat0.subcat1.my_nested_fkt(1);
    return 0;

【讨论】:

【参考方案3】:

我同意早期的 cmets 关于分班的观点。但如果你确定不想这样做,那么试试这个:

在一个标题中声明你的类,比如megatron.h

class Megatron 
// module A methods
public:
    void draw();

// module B methods
public:
    void send();

...
;

然后拆分文件A和文件B中的实现。

文件megatron_a.cpp

#include "megatron.h"

void Megatron::draw() 

文件megatron_b.cpp

#include "megatron.h"

void Megatron::send() 

只要您遵守一个定义规则,链接器就会为您解决这个问题。如果“模块”类不共享状态,请进行多重继承。

C++ 允许你这样做,但我强烈建议你考虑拆分你的班级。也许您真正需要的是命名空间?

干杯!

【讨论】:

您好!谢谢您的回复。我正在阅读很多关于命名空间的内容,这是我最初的解决方案,但我发现它们不能与我想保存()或发送()的类对象一起使用。所以这是阻止我使用命名空间的唯一原因。无论如何,感谢您的出色回答! :)

以上是关于C++ 类函数分组的主要内容,如果未能解决你的问题,请参考以下文章

spoon中的分组groupby在哪里

C++入门C++ 函数模板&类模板

是否有一个总括术语来对“从头开始”构造函数进行分组,将它们与复制和移动构造函数区分开来?

使用 C++ 类成员函数作为 C 回调函数

C++ 类成员函数地址

C++点滴----关于类常成员函数