我有一个类来解析将结果保存在数组成员中的矩阵:
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:“类型转换”:无法从“void *”转换为“const double [4][4]”
...带有一个有趣的附录:
没有对数组类型的转换,尽管有对引用或指向数组的指针的转换
我也无法确定如何转换为引用或指向数组的指针,尽管它在这里可能对我没有帮助。
可以肯定的是,在这一点上,这件事纯粹是学术性的,因为void*
演员阵容几乎不比一个公开的班级成员更干净!