【问题标题】:Passing arrays as reference arguments in function在函数中传递数组作为参考参数
【发布时间】:2012-01-17 22:26:02
【问题描述】:

我正在尝试将两个多维数组作为参考参数传递给 C++ 中的函数。

原型是这样写的:

void func(char (&foo)[4][4], char (&bar)[4][4]);

我的问题是第二个参数没有作为参考参数传递,但第一个参数可以。如果我改变它们的位置——所以 (&foo)[4][4] 是第二个,反之亦然—— foo 不会作为引用传递,但 bar 会。

但是,如果我添加第三个参数,第二个参数将作为引用传递。

如何在不添加另一个无用参数的情况下解决此问题?

【问题讨论】:

  • “它没有作为参考传递”是什么意思?
  • 显示您的呼叫代码。我很确定错误就在那里。
  • 它还有什么被传递的?复制 ?在c ++中没有办法。即使您认为自己传递的是副本,C++ 也会将数组作为引用传递。
  • 请发布一些演示问题的实际代码(请参阅sscce.org)。
  • 发布整个相关的事情并展示您无法更改的内容。我很确定这个函数能够改变它的调用者记忆。

标签: c++ arrays arguments


【解决方案1】:

尝试通过使用 typedef 来最小化众所周知的脚的大小:

typedef char charray44[4][4];

void foo(charray44 & one, charray44 & two);

这应该可以按预期工作;如果没有,您应该能够设置一个简单的测试工具来找出您在代码中的哪里(其他)犯了错误。

【讨论】:

    【解决方案2】:

    作为 Xeos 解决方案的补充,解决此问题的更好方法可能是封装数组并通过引用传递新对象。

    class matrix{
         std::vector<char> values;
         size_t x_sz, y_sz;
    public:
         matrix(size_t x, size_t y) : values(x*y), x_sx(x), y_sz(y) {}
    
         char& get_at(size_t x, size_t y) 
         { return values[y*x_sz+x]; }
    
         const char& get_at(size_t x, size_t y) const
         { return values[y*x_sz+x]; }
     };
    

    然后你可以传递给类似的函数。

       void f(const matrix& a);
    

    【讨论】:

      【解决方案3】:
      void foo(char (&one)[4][4], char (&two)[4][4]){
      }
      
      int main(){
          char one[4][4];
          char two[4][4];
          foo(one, two);
      }
      

      在 MSVC、GCC 和 Clang 上编译良好。您的问题出在其他地方。

      【讨论】:

        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 2019-11-29
        • 2014-03-05
        • 2019-12-28
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多