繁体   English   中英

C++ class:所有数据成员的一个getter/setter?

[英]C++ class: one getter/setter for all data members?

我尝试通过一些 OOP 练习 C++,因此有这样的 class:

class Obj
{
protected:
    cls1 class1;
    cls2 class2;
    ......
    clsn classn;
}

我想我真的需要protected这些成员。 那么问题就变成了其他函数如何调用 class 数据成员来检索/修改其值。 一种常见的解决方案是通过 getter/setter 函数。 但是为每个成员编写每个 getter 和 setter 会很麻烦。 那么,我可以用模板实现一个统一的 getter/setter 成员 function 吗?

class Obj
{
    template<typename T> int get_stats(){
        ...
        // maybe using is_same_v<T,cls1> to get what class of data member I attempt to access
        // thus confirm the data member to access? 
    };
    template<typename T> void add_stats();
}

这可能吗,或者有其他一些功能吗?

实际上,不,不可能这样做,为所有数据设置一个 getter 和一个 setter 将是一个糟糕的主意。 如果你这样做了,为什么还要把它放在protected中,把它放在public中。 我也很确定您希望它们是private的而不是protected的。 但我没有足够的信息。

When doing OOP, you don't want that the user of your class have full control of your data, you only want to expose behavior of your class through function. 将您的数据private ,然后不要编写设置器。 或者将它们公开,不要编写 setter。

当然有时候,有一些二传手很好,但我说的是通用的

尝试将它们公开,或者您应该为每个变量创建一个 setter 和 getter,这是为了安全起见

您可以使用友元函数和类。 我建议你阅读这篇文章

假设您的“模板获取器/设置器”将做的不仅仅是返回引用/分配,那么我们可以使用boost::pfr库做一些事情。

template<typename T>
T & get() { 
    auto & value = std::get<T>(boost::pfr::structure_tie(*this)); 
    /* do stuff */ 
    return value; 
}

template<typename T>
const T & get() const { 
    auto & value = std::get<T>(boost::pfr::structure_tie(*this)); 
    /* do stuff */ 
    return value; 
}

template<typename T>
void set(const T & value) {
    auto & member = std::get<T>(boost::pfr::structure_tie(*this));
    /* do stuff */ 
    member = value; 
}

如果您在/* do stuff */中没有做任何事情,那么您不妨将这些成员设为public

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM