【问题标题】:Default reference argument in C++C++ 中的默认引用参数
【发布时间】:2017-03-22 14:47:52
【问题描述】:

我有课mizer:

class mizer {
  ...
  public:
    ...
    void getDeviation( vector<double>&, vector<int>& )
...
};

实现:

void mizer::getDeviation( vector<double>& best_mass, vector<int>& best_comb ){
   ...
}

但有时我不想提供第二个参数best_comb。所以我想设置默认值什么的:

void mizer::getDeviation( ..., vector<int>& best_comb = default )

我试过了:

static vector<int> def();
...
void mizer::getDeviation( ..., vector<int>& best_comb = def )

但它不起作用:

/minimizer/mizer.C:69:69: error: 
non-const lvalue reference to   type 'vector<int>'  cannot bind to a value of unrelated type 'vector<int> ()'double mizer::getDeviation( vector<double>&  best_mass, vector<int>& best_comb=def ){

如何设置默认的vector引用变量?

【问题讨论】:

  • static vector&lt;int&gt; def(); def 中是一个函数,而不是一个向量。请参阅“最令人头疼的解析”。
  • @nwp 这与最麻烦的解析没有关系,因为该语法(带括号)只能用于声明成员函数,而不是成员变量。
  • @nwp。谢谢你。对不起我的愚蠢。我知道它应该有效。

标签: c++ class reference


【解决方案1】:

static vector&lt;int&gt; def(); 声明了一个静态函数def,它返回一个vector&lt;int&gt;。请改用static vector&lt;int&gt; def{};static vector&lt;int&gt; def;

【讨论】:

    【解决方案2】:

    函数重载怎么样?

    你可以创建一个只接受一个参数的重载函数,然后使用一个空的虚拟向量来调用两个参数的函数。

    【讨论】:

      【解决方案3】:

      你可以使用方法重载,就像@Someprogrammerdude 建议的那样:

      class mizer {
        ...
        public:
          ...
          void getDeviation( vector<double>& );
          void getDeviation( vector<double>&, vector<int>& );
          ...
      };
      
      void mizer::getDeviation( vector<double>& best_mass )
      {
         vector<int> ignored; 
         getDeviation( best_mass, ignored );
      }
      
      void mizer::getDeviation( vector<double>& best_mass, vector<int>& best_comb )
      {
         ...
      }
      

      mizer m;
      vector<double> mass;
      m.getDeviation( mass );
      

      mizer m;
      vector<double> mass;
      vector<int> comb;
      m.getDeviation( mass, comb );
      

      但这仍然会为best_comb 的内容分配内存,即使调用者不想要它。

      或者,您可以使可选参数成为指针而不是引用:

      class mizer {
        ...
        public:
          ...
          void getDeviation( vector<double>&, vector<int>* = nullptr );
          ...
      };
      
      void mizer::getDeviation( vector<double>& best_mass, vector<int>* best_comb )
      {
         ...
         if (best_comb) best_comb->push_back(...);
         ...
      }
      

      mizer m;
      vector<double> mass;
      m.getDeviation( mass );
      

      mizer m;
      vector<double> mass;
      vector<int> comb;
      m.getDeviation( mass, &comb );
      

      现在没有为best_comb 的内容分配内存,除非调用者需要它。

      【讨论】:

        【解决方案4】:

        您的函数 def() 可能总是返回相同的值。

        所以,我认为您需要使用“#define”作为默认和参考向量。

        【讨论】:

        • 我一开始以为是“一些程序员老兄”,但是,你问矢量参考值?
        猜你喜欢
        • 2021-08-17
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2015-10-27
        相关资源
        最近更新 更多