Sử dụng một initialize()
phương thức cho một lớp là trái với nguyên tắc của một hàm tạo của lớp, tức là một khi một thể hiện của lớp đã được xây dựng , nó sẽ " sẵn sàng để sử dụng ".
Theo đề xuất của câu trả lời của Ignacio, cú pháp vị trí C ++ tốt hơn nhiều cho mục đích của bạn.
Tuy nhiên, với các thư viện Arduino, cú pháp vị trí không được hỗ trợ "ngoài luồng", do đó bạn phải tự thực hiện nó; đừng sợ, điều đó khá đơn giản:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
Cú pháp vị trí có thể là một con thú phức tạp trong C ++, nhưng với mục đích cụ thể của bạn, việc sử dụng nó có thể khá đơn giản:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
Sự khác biệt với mã hiện tại của bạn foo
là bây giờ là một con trỏ, do đó, bất kỳ lệnh gọi phương thức nào cũng sẽ sử dụng ->
thay vì .
.
Nếu bạn hoàn toàn muốn tiếp tục sử dụng foo
như một ví dụ và không phải là một con trỏ, thì bạn có thể làm điều đó (nhưng tôi không khuyên nó như được giải thích sau) bằng cách sử dụng một tham chiếu thay thế:
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Vấn đề với mã này, là bạn không thể biết liệu foo
đã được xây dựng với một thể hiện thực FOOOBJ
hay chưa; bằng cách sử dụng một con trỏ, bạn luôn có thể kiểm tra xem nó có 0
hay không.
Sử dụng cú pháp vị trí, bạn phải lưu ý rằng bạn không thể delete
lấy foo
ví dụ ở trên. Nếu bạn muốn hủy foo
(nghĩa là đảm bảo rằng hàm hủy của nó được gọi), thì bạn phải gọi hàm hủy một cách rõ ràng:
foo->~FOOOBJ();
FOOOBJ
là một đối tượng OneWire, sử dụng thư viện của Jim Studt (v2.2). Tôi nhận được tin nhắnerror: no matching function for call to 'operator new(unsigned int, byte [14])'
trongnew
cuộc gọi. Có vẻ như avr-g ++ có thể không hiểu cú pháp.