帮助程序结构可将数据成员公开

时间:2018-07-08 10:43:14

标签: c++ oop non-member-functions

所以我正在尝试使用辅助方法构造一个类,即:

class Type{
    int a, b, c;

    friend auto helper(auto);
    friend auto test_helper(auto);
    /* couples test with implement */

public:
    void method(){
        helper(this);
    }
};

但是如果我们要测试helper,则使helper成为一个朋友函数会使测试与实现耦合起来。

所以我想将helper设为免费功能,即:

auto helper(int&,int&,int&);
auto test_helper(int&,int&,int&);

class Type{
    int a, b, c;
public:
    void method(){
        helper(a,b,c);
    }
};

但是,当数据成员很多时,这会使代码变得更加乏味。因此,我想出了一个构想,将辅助数据的成员确切为Type,但所有数据成员都是公开的,这样我们就可以简单地传递此类{{1 }},也许像这样:

HelperType

是否有任何优雅的方法来构造这样的struct HelperType{ int a, b, c; }; auto helper(HelperType* a); auto test_helper(HelperType* a); void Type::method(){ helper(static_cast<HelperType*>(this)); } 结构?例如通用包装器还是具有继承性?

1 个答案:

答案 0 :(得分:0)

我没有从HelperType创建Type的简单解决方案(只有想到的事情涉及大量的元编程或宏用法)。但是,使用Type继承从HelperType构建private会很简单。来自Derived class (cppreference.com)

  

当某个类使用私有成员访问说明符从某个基类派生时,该基类的所有公共成员和受保护成员都可以作为派生类的私有成员进行访问。

// Could be renamed "TypePrivateMembers" or "TypeData"
struct HelperType{
    int a, b, c;
};

auto helper(HelperType* a);

class Type : private HelperType {
public:
    // a,b,c can be accessed in Type class scope.

    void method(){
        helper(this);
    }
};

Live demo

但是,仍然来自cppreference(重点是我):

  

私有继承也可以用于实现组成关系(基类子对象是派生类对象的实现细节)。 使用成员提供更好的封装,通常是首选,除非派生类需要访问基础的受保护成员(包括构造函数),需要覆盖基础的虚拟成员,需要构建基础在某些其他基础子对象之前和之后销毁,需要共享虚拟基础或需要控制虚拟基础的构建。 [...]

这是反复发生的composition over inheritance辩论。这个问题已经在StackOverflow上被问过很多次了,下面是有关该主题的一些有趣的链接(通常针对该特定情况):