【问题标题】:C++: Create a getter using a struct of constant referencesC ++:使用常量引用结构创建getter
【发布时间】:2021-04-19 09:22:56
【问题描述】:

假设我有以下课程

class Foo {
public:
    // ...
private:
    std::unordered_map<std::string, int> param1;
    std::vector<int> param2;
    // And other complex data types
};    

并且想从外部函数访问其实例的私有成员,我是否可以定义一个常量引用结构来一次传递它们,而不是为每个对象创建一个 getter 并传递一个“动物园”参数?

struct params_t {
    const std::unordered_map<std::string, int> &param1;
    const std::vector<int> &param2;
};

params_t Foo::get_params() { return params_t{param1, param2}; }

void bar()
{
    // Initialize an instance of Foo
    params_t params = foo.get_params();
    // Do something with params
}

这被认为是一种好习惯吗?因为就我而言,我的需求是特定的:我一次需要所有参数,而且我经常需要它们,所以我的目标是效率和低内存使用,而不是代码风格。

【问题讨论】:

  • Foo 内嵌套params_t 似乎是解决这个特定问题的最佳做法。
  • 你可以声明一个“友元函数”,所以这个函数可以访问类的所有成员。

标签: c++ c++14


【解决方案1】:

在我看来,这是一种代码异味,但只要您可以保证 params_t 的生命周期将比它所来自的 Foo 寿命长,那么它可能不是一个大问题。不过,几个 getter 调用的开销可能会非常小,如果编译器不完全优化对它们的调用,我会感到惊讶。

另外几个选项是只返回一个引用元组,或者类似:

class Foo
{
private:
    struct params_t { ... };
public:
    params_t get_params() const { ... }
};

这将使消费者更难存储params_t(因为它是Foo 的私有成员),或者甚至可能只是将params_t 设为值结构(如果参数总是一起使用):

struct params_t {
    std::unordered_map<std::string, int> param1;
    std::vector<int> param2;
};

Foo 可以存储。然后get_params() 将返回const&amp; params_t。这么多选择!可能取决于任何代码审查者或个人偏好,因为他们可能都编译成几乎相同的代码。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多