C++类:所有数据成员只需要一个getter/setter吗?

3

我尝试通过一些面向对象编程来练习C++,因此有了这样的类:

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

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

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();
}

这是可能的,或者有其他功能吗?

3
不要这样做。将它们公开。建议阅读Bjarne本人对此的评论。如果成员本身可以是公共的,那么在C++中使用getter/setter是不符合惯用法的。 - lorro
1
将成员放入数组或std::array中。然后一个带有索引参数的getter和setter就可以工作了。 - john
2
@john std::tuple<> 是不同的类,但是这可能会起作用。 - lorro
@JackLee 同时建议查看 https://en.cppreference.com/w/cpp/language/structured_binding - lorro
1
看起来你感染了“getter/setter-itis”病。如果你认为你需要它们,那么你所处的抽象层次是错误的。 - molbdnilo
显示剩余2条评论
4个回答

0

假设你的“模板获取器/设置器”将会执行一些不仅仅是返回引用/赋值的操作,那么我们可以使用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


0
实际上,不可能这样做,而且为所有数据都设置getter和setter是一个糟糕的想法。如果您这样做,为什么要将其放在protected中,直接放在public中即可。我也很确定您希望它们是private而不是protected,但我没有足够的信息。
在进行面向对象编程时,您不希望类的用户完全控制您的数据,您只想通过函数公开类的行为。将数据保持为private,然后不编写setter。或者将它们设置为public并不编写setter。
当然,有时候拥有一些setter是好的,但我是以一般目的来说的。

1
对于非递归的聚合类型,这是可能的 - 但我们在同一阵营,当您应该简单地公开成员时,请不要编写getter/setter。 - lorro

0

尝试将它们设为公共的,或者你应该为每个变量编写setter和getter方法以提高安全性。


0

你可以使用友元函数和类来实现这种功能。它们可用于此类任务。您可以在要与之交友的类中声明友元类或函数,例如:

friend class_name; 我建议您阅读本文


由于您当前的回答写得不清楚,请进行[编辑]以添加其他细节,以帮助其他人理解如何回答所提出的问题。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接