我有一个类来解析一个矩阵,将结果保存在数组成员中:
class Parser
{
...
double matrix_[4][4];
};
Run Code Online (Sandbox Code Playgroud)
这个类的用户需要调用一个API函数(例如,我无法控制的函数,所以我不能只是改变它的界面以使事情更容易工作),如下所示:
void api_func(const double matrix[4][4]);
Run Code Online (Sandbox Code Playgroud)
我让调用者将数组结果传递给函数的唯一方法是将成员公开:
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
Run Code Online (Sandbox Code Playgroud)
这是做事的唯一方法吗?我对这样声明的多维数组的不灵活性感到震惊.我认为matrix_基本上和a一样double**,我可以(安全地)在两者之间施放.事实证明,我甚至找不到一种不安全的方式在事物之间施放.假设我在Parser课程中添加了一个访问者:
void* Parser::getMatrix()
{
return (void*)matrix_;
}
Run Code Online (Sandbox Code Playgroud)
这将编译,但我不能使用它,因为似乎没有办法转回到怪人数组类型:
// 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
Run Code Online (Sandbox Code Playgroud)
错误是:
错误C2440:'type cast':无法从'void*'转换为'const double [4] [4]'
......有一个有趣的附录:
虽然存在对引用或指向数组的指针的转换,但是没有对数组类型的转换
我无法确定如何转换为引用或指向数组的指针,尽管它可能对我没有帮助.
可以肯定的是,在这一点上,这个问题纯粹是学术性的,因为void*演员阵容几乎不比一个班级成员离开公众更清晰!
Sho*_*og9 16
这是一个很好,干净的方式:
class Parser
{
public:
typedef double matrix[4][4];
// ...
const matrix& getMatrix() const
{
return matrix_;
}
// ...
private:
matrix matrix_;
};
Run Code Online (Sandbox Code Playgroud)
现在您正在使用描述性类型名称而不是数组,但由于它是一个typedef编译器仍然允许将其传递给采用基类型的不可更改的API函数.
试试这个.它在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;
}
Run Code Online (Sandbox Code Playgroud)