Trong C++, không thể khởi tạo thành viên mảng trong danh sách khởi tạo, do đó các đối tượng thành viên phải có các hàm tạo mặc định và chúng nên được khởi tạo đúng cách trong hàm tạo. Có cách nào khác (hợp lý) cho việc này ngoài việc không sử dụng mảng không?Bất kỳ giải pháp nào cho việc khởi tạo mảng thành viên không tĩnh?
[Bất kỳ thứ gì có thể được khởi tạo chỉ sử dụng danh sách khởi tạo trong ứng dụng của chúng tôi là thích hợp hơn khi sử dụng hàm tạo, vì dữ liệu đó có thể được phân bổ và khởi tạo bởi trình biên dịch và trình liên kết và mỗi chu kỳ xung nhịp CPU, ngay cả trước main
. Tuy nhiên, không phải lúc nào cũng có thể có một hàm tạo mặc định cho mọi lớp, và bên cạnh đó, khởi tạo lại dữ liệu một lần nữa trong hàm tạo thay vì đánh bại mục đích.]
Ví dụ: Tôi muốn có một cái gì đó như thế này (nhưng điều này không làm việc):
class OtherClass {
private:
int data;
public:
OtherClass(int i) : data(i) {}; // No default constructor!
};
class Foo {
private:
OtherClass inst[3]; // Array size fixed and known ahead of time.
public:
Foo(...)
: inst[0](0), inst[1](1), inst[2](2)
{};
};
Cách giải quyết duy nhất tôi biết là không cho mảng một:
class Foo {
private:
OtherClass inst0;
OtherClass inst1;
OtherClass inst2;
OtherClass *inst[3];
public:
Foo(...)
: inst0(0), inst1(1), inst2(2) {
inst[0]=&inst0;
inst[1]=&inst1;
inst[2]=&inst2;
};
};
Sửa: Cần nhấn mạnh rằng OtherClass
không có hàm tạo mặc định và rất mong muốn người liên kết có thể phân bổ bất kỳ bộ nhớ nào cần thiết (một hoặc nhiều phiên bản tĩnh của Foo
sẽ được tạo), sử dụng heap về cơ bản là verboten. Tôi đã cập nhật các ví dụ ở trên để làm nổi bật điểm đầu tiên.
Đừng quên thêm "#include" cho vị trí mới :) –
Drealmer
Tôi sẽ phải kiểm tra hiệu suất của vị trí mới trên nền tảng của mình, nhưng nếu không, điều này có vẻ là giải pháp làm việc, mặc dù có thể không dễ hiểu đồng nghiệp của tôi. :-) –
Tôi đã chọn câu trả lời này, mặc dù tôi có thể sẽ giữ phiên bản của riêng mình trong thực tế, vì tôi nghĩ nó dễ đọc hơn và nhanh hơn, mặc dù nó sử dụng thêm bộ nhớ cho mảng con trỏ tiện lợi. –