Tôi có một lớp học để phân tích một ma trận mà giữ kết quả trong một thành viên mảng:Làm thế nào để đối phó với mảng (được khai báo trên ngăn xếp) trong C++?
class Parser
{
...
double matrix_[4][4];
};
Người dùng của lớp này cần gọi một hàm API (như trong, một chức năng tôi không kiểm soát được, vì vậy Tôi không thể thay đổi giao diện của nó để làm cho mọi thứ hoạt động dễ dàng hơn) trông giống như sau:
void api_func(const double matrix[4][4]);
Cách duy nhất tôi đã đưa ra cho người gọi để chuyển mảng kết quả đến hàm bằng cách tạo thành viên công khai:
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
Đây có phải là cách duy nhất để làm việc không? Tôi kinh ngạc bởi cách mảng đa chiều không linh hoạt được khai báo như thế này. Tôi nghĩ rằng matrix_
về cơ bản sẽ giống như double**
và tôi có thể truyền (an toàn) giữa hai thiết bị. Khi nó quay ra, tôi thậm chí không thể tìm thấy không an toàn cách để phân phát giữa mọi thứ. Nói rằng tôi thêm một accessor đến lớp Parser
:
void* Parser::getMatrix()
{
return (void*)matrix_;
}
này sẽ biên dịch, nhưng tôi không thể sử dụng nó, vì có vẻ không phải là một cách để cast lại kiểu mảng lập dị:
// 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
lỗi này là:
lỗi C2440: 'loại dàn diễn viên': không thể chuyển đổi từ 'void *' thành 'const double [4] [4]
... với một phụ lục hấp dẫn:
Không có chuyển đổi các loại mảng, mặc dù có chuyển đổi tài liệu tham khảo hoặc gợi ý cho các mảng
tôi không thể xác định làm thế nào để đúc để một tham chiếu hoặc con trỏ đến mảng hoặc, mặc dù nó có thể sẽ không giúp tôi ở đây. Để chắc chắn, vào thời điểm này vấn đề hoàn toàn là học thuật, vì các phôi void*
khó có thể sạch hơn một thành viên lớp duy nhất được công khai!
Đánh bại tôi. :-) – Andrew
vì tôi đã sử dụng tên loại ngắn hơn. Hãy suy nghĩ của tất cả các thời gian bạn lãng phí gõ thêm năm ký tự ... ;-p – Shog9
Và ông mở rộng "// ..." s là tốt ... Tuy nhiên tôi cảm thấy tôi nên chấp nhận đầu tiên. Xin lỗi Andrew! – Owen