gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:24:39 25 4
gpt4 key购买 nike

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

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

这个类的用户需要调用一个 API 函数(比如,一个我无法控制的函数,所以我不能只是改变它的接口(interface)来让事情更容易工作),看起来像这样:

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

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

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

这是唯一的做事方式吗?我对像这样声明的多维数组是多么不灵活感到震惊。我认为 matrix_ 本质上与 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

错误是:

error C2440: 'type cast' : cannot convert from 'void *' to 'const double [4][4]'

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

There are no conversions to array types, although there are conversions to references or pointers to arrays

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

可以肯定的是,在这一点上这件事纯粹是学术性的,因为 void* 强制转换几乎不比公开的单个类成员更干净!

最佳答案

这是一个很好、干净的方法:

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

// ...

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

// ...

private:
matrix matrix_;
};

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

关于c++ - 如何在 C++ 中处理数组(在堆栈上声明)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com