当前位置:  开发笔记 > 编程语言 > 正文

如何处理C++中的数组(在堆栈上声明)?

如何解决《如何处理C++中的数组(在堆栈上声明)?》经验,为你挑选了2个好方法。

我有一个类来解析一个矩阵,将结果保存在数组成员中:

class Parser
{
  ...
  double matrix_[4][4];
};

这个类的用户需要调用一个API函数(例如,我无法控制的函数,所以我不能只是改变它的界面以使事情更容易工作),如下所示:

void api_func(const double matrix[4][4]);

我让调用者将数组结果传递给函数的唯一方法是将成员公开:

void myfunc()
{
  Parser parser;
  ...
  api_func(parser.matrix_);
}

这是做事的唯一方法吗?我对这样声明的多维数组的不灵活性感到震惊.我认为matrix_基本上和a一样double**,我可以(安全地)在两者之间施放.事实证明,我甚至找不到一种不安全的方式在事物之间施放.假设我在Parser课程中添加了一个访问者:

void* Parser::getMatrix()
{
  return (void*)matrix_;
}

这将编译,但我不能使用它,因为似乎没有办法转回到怪人数组类型:

  // A smorgasbord of syntax errors...
  api_func((double[][])parser.getMatrix());
  api_func((double[4][4])parser.getMatrix());
  api_func((double**)parser.getMatrix()); // cast works but it's to the wrong type

错误是:

错误C2440:'type cast':无法从'void*'转换为'const double [4] [4]'

......有一个有趣的附录:

虽然存在对引用或指向数组的指针的转换,但是没有对数组类型的转换

我无法确定如何转换为引用或指向数组的指针,尽管它可能对我没有帮助.

可以肯定的是,在这一点上,这个问题纯粹是学术性的,因为void*演员阵容几乎不比一个班级成员离开公众更清晰!



1> Shog9..:

这是一个很好,干净的方式:

class Parser
{
public:
   typedef double matrix[4][4];

   // ...

   const matrix& getMatrix() const
   {
      return matrix_;
   }

   // ...

private:
  matrix matrix_;
};

现在您正在使用描述性类型名称而不是数组,但由于它是一个typedef编译器仍然允许将其传递给采用基类型的不可更改的API函数.



2> Andrew..:

试试这个.它在gcc 4.1.3上完全编译:

typedef double FourSquare[4][4];

class Parser
{
  private:
    double matrix_[4][4];

  public:
    Parser()
    {
        for(int i=0; i<4; i++)
          for(int j=0; j<4; j++)
            matrix_[i][j] = i*j;
    }

  public:
    const FourSquare& GetMatrix()
    {
        return matrix_;
    }
};

void api_func( const double matrix[4][4] )
{
}

int main( int argc, char** argv )
{
    Parser parser;
    api_func( parser.GetMatrix() );
    return 0;
}

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有