cuốn sách gpt4 ai đã làm

Có cách nào để chuyển các hàm từ object-c++ sang c++ tiêu chuẩn không?

In lại Tác giả: Walker 123 Thời gian cập nhật: 27-11-2023 23:53:57 26 4
mua khóa gpt4 Nike

Tôi muốn chuyển con trỏ hàm object-c++ sang c++ tiêu chuẩn để tôi có thể gọi các phương thức object-c trên C++.

Đây là những gì tôi muốn đạt được:

// Bên C++
lớp CppSide
{
công cộng:
void(*TestFunction)();
};

// phía mục tiêu-c++
@interface InteropController : GLKViewController{
}
-(void) PickFile; //Tôi muốn chuyển địa chỉ PickFile cho TestFunction
@kết thúc

Đây là những gì tôi đã làm nhưng nó không hoạt động

Bộ điều khiển InteropController* = [[InteropController phân bổ] init];
CppSide* cppSide = CppSide mới();
cppSide->TestFunction = [phương thức điều khiểnForSelector:@selector(PickFile:)];
cppSide->TestFunction(); //EXC_BADccess(code=1, address=0x2d)

tôi phải làm gì?

câu trả lời hay nhất

Cách dễ dàng và lười biếng là truyền std::function gọi mã objC (ví dụ: sử dụng lambda).

Tuy nhiên, những gì bạn có là một con trỏ hàm C thô. Bạn sẽ cần phải viết hàm C (hoặc sử dụng lambda không thu thập):

cppSide->TestFunction = [](){ ... Mã ObjC tại đây ...};

Tuy nhiên, bạn không thể tham chiếu phạm vi gốc ở đó - chỉ phạm vi toàn cầu.

Nếu bạn có thể thay đổi nó thay vì sử dụng std::function, bạn sẽ linh hoạt hơn:

cppSide->TestFunction = [=](){[bộ điều khiển PickFile: ... ];};

Nếu vì lý do nào đó bạn không thể thay đổi kiểu con trỏ hàm, hãy cân nhắc việc thay đổi nó để nó yêu cầu ít nhất một con trỏ dữ liệu:

lớp CppSide
{
công cộng:
void(*TestFunction)(void *data);
};

Sau đó bạn có thể làm:

cppSide->TestFunction = [](void *data) {
Bộ điều khiển InteropController* = static_cast(data);
[bộ điều khiển PickFile: ... ];
}

Sau đó, người gọi con trỏ hàm cần phải chuyển một Bộ điều khiển một cách rõ ràng.

Về c++ - có cách nào để chuyển các hàm từ object-c++ sang c++ tiêu chuẩn không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/44017426/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress