【问题标题】:C++ class interface to pass-through to another member variable传递给另一个成员变量的 C++ 类接口
【发布时间】:2013-08-15 02:34:34
【问题描述】:

假设我有一个类 Param 定义如下:

class Param {
public:
    std::vector<double> lb;
    std::vector<double> mid;
    std::vector<double> ub;
    int level;
};

该类的目的是定义下限和上限(分别为lbub)以及不同参数的中点估计值。假设对于给定的对象,lbmidub 具有相同数量的元素。

现在,如果level&lt;0,我想使用lb 估计。如果level==0,我想使用mid 估计。否则(如果level&gt;0),我想使用ub 估计值。

我的问题是:我怎样才能创建一个单独的成员函数(或类似于引用成员变量的东西),它会根据值自动“传递”给适当的成员 std::vector&lt;double&gt; level?

例如,如果我有一个函数

void f(const std::vector&lt;double&gt;&amp; X);

void g(std::vector&lt;double&gt;&amp; X);

我希望能够做这样的事情:

Param myParam;
// set values of myParam.lb, myParam.mid, and myParam.ub, and myParam.level
f(myParam.__?__);
g(myParam.__?__);

【问题讨论】:

  • 为什么level 还是Param 的成员?
  • @ChrisCulter 因为我可能想更改我正在使用的参数估计值,而 level 反映了我正在使用的估计值。 (也许我误解了你的问题......)
  • 显然我不知道上下文,但它似乎不需要是与数据相关的持久状态。它可以只是使用Param 的任何代码中的局部变量吗?
  • @ChrisCulter 绝对可以。但是Params有20到30个,它们的不同组合一次使用不同的levels。上下文是各种Params组成一个数学模型,我需要对模型的参数进行敏感性分析。

标签: c++ class reference


【解决方案1】:

您可以将演员表操作符添加到您的班级:

class Param {
    //...

    operator std::vector<double>& () {
        if( level < 0 ) return lb;
        if( level > 0 ) return ub;
        return mid;
    }

    operator const std::vector<double>& () const {
        if( level < 0 ) return lb;
        if( level > 0 ) return ub;
        return mid;
    }
};

现在你可以这样调用:

f(myParam);
g(myParam);

【讨论】:

  • 太棒了!那么代码中的return 语句是否会在内存中创建返回项目的另一个副本?
  • 不,他们正在返回参考资料。
  • 不,它们返回一个引用,因为这是我们要转换的类型。请注意转换运算符中的&amp;
  • 啊,现在我明白了。非常感谢。
  • 是的,它仍然可以工作,即使返回值为外部人员提供了对私有成员的引用。该类仍然控制着私有成员,你不能直接从外部访问它们,但如果它乐意让外部人员直接引用它们,那没关系。
【解决方案2】:

很简单。

std::vector< double > & getBound() {
    if ( level < 0 ) return lb;
    if ( level == 0 ) return mid;
    return ub;
}

如有必要,添加一个const 重载,返回一个const &amp; 引用。

我建议不要做任何比这更棘手的事情。如果你想从一个对象中获取一些东西,提到一个函数通常比定义一个尽管没有被命名却自动调用的函数更好。

(注意:我是三个多小时前提交的,但连接困难延迟了它,因此冗余。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多