我有一个类来解析一个矩阵,将结果保存在数组成员中:
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*
演员阵容几乎不比一个班级成员离开公众更清晰!
这是一个很好,干净的方式:
class Parser { public: typedef double matrix[4][4]; // ... const matrix& getMatrix() const { return matrix_; } // ... private: matrix matrix_; };
现在您正在使用描述性类型名称而不是数组,但由于它是一个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; }