คำถามติดแท็ก function-pointers

ตัวชี้ฟังก์ชันคือตัวชี้ไปยังฟังก์ชันซึ่งสามารถเก็บไว้ในตัวแปรได้ ช่วยให้สามารถเลือกเวลาทำงานได้ว่าจะเรียกใช้ฟังก์ชันใด

10
เรียกใช้เมธอดคลาส C ++ ผ่านตัวชี้ฟังก์ชัน
ฉันจะรับฟังก์ชันพอยน์เตอร์สำหรับฟังก์ชันสมาชิกคลาสได้อย่างไรและในภายหลังเรียกฟังก์ชันสมาชิกนั้นด้วยอ็อบเจ็กต์เฉพาะ ฉันต้องการเขียน: class Dog : Animal { Dog (); void bark (); } … Dog* pDog = new Dog (); BarkFunction pBark = &Dog::bark; (*pBark) (pDog); … นอกจากนี้ถ้าเป็นไปได้ฉันต้องการเรียกใช้ตัวสร้างผ่านตัวชี้ด้วย: NewAnimalFunction pNew = &Dog::Dog; Animal* pAnimal = (*pNew)(); เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นวิธีใดที่ควรทำ

8
แลมด้า C ++ พร้อมแคปเจอร์เป็นตัวชี้ฟังก์ชัน
ฉันกำลังเล่นกับ C ++ lambdas และการแปลงโดยนัยเป็นฟังก์ชันพอยน์เตอร์ ตัวอย่างเริ่มต้นของฉันใช้เป็นคำเรียกกลับสำหรับฟังก์ชัน ftw สิ่งนี้ได้ผลตามที่คาดไว้ #include <ftw.h> #include <iostream> using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -> int { cout << fpath << endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } …

7
ตัวชี้ฟังก์ชันไปยังฟังก์ชันสมาชิก
ฉันต้องการตั้งค่าตัวชี้ฟังก์ชันเป็นสมาชิกของคลาสที่เป็นตัวชี้ไปยังฟังก์ชันอื่นในคลาสเดียวกัน เหตุผลที่ฉันทำมันซับซ้อน ในตัวอย่างนี้ฉันต้องการให้เอาต์พุตเป็น "1" class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; a.x = a.f; printf("%d\n",a.x()) } แต่สิ่งนี้ล้มเหลวในการรวบรวม ทำไม?

7
การส่งตัวชี้ฟังก์ชันไปยังประเภทอื่น
สมมติว่าฉันมีฟังก์ชันที่ยอมรับvoid (*)(void*)ตัวชี้ฟังก์ชันเพื่อใช้เป็นการโทรกลับ: void do_stuff(void (*callback_fp)(void*), void* callback_arg); ตอนนี้ถ้าฉันมีฟังก์ชันเช่นนี้: void my_callback_function(struct my_struct* arg); ฉันสามารถทำได้อย่างปลอดภัยหรือไม่? do_stuff((void (*)(void*)) &my_callback_function, NULL); ฉันได้ดูคำถามนี้แล้วและฉันได้ดูมาตรฐาน C บางอย่างซึ่งบอกว่าคุณสามารถส่งเป็น 'ตัวชี้ฟังก์ชันที่เข้ากันได้' แต่ฉันไม่พบคำจำกัดความว่า 'ตัวชี้ฟังก์ชันที่เข้ากันได้' หมายถึงอะไร

4
ความหมายของ int (*) (int *) = 5 (หรือค่าจำนวนเต็ม)
ฉันคิดไม่ออก: int main() { int (*) (int *) = 5; return 0; } การมอบหมายข้างต้นรวบรวมด้วย g ++ c ++ 11 ฉันรู้ว่านั่นint (*) (int *)เป็นตัวชี้ไปยังฟังก์ชันที่ยอมรับ(int *)เป็นอาร์กิวเมนต์และส่งกลับค่า int แต่ฉันไม่เข้าใจว่าคุณจะเทียบเคียงเป็น 5 ได้อย่างไรในตอนแรกฉันคิดว่ามันเป็นฟังก์ชันที่คืนค่า 5 อย่างต่อเนื่อง (จากการเรียนรู้ล่าสุดของฉันใน F # น่าจะเป็นฮ่าฮ่า) จากนั้นฉันก็คิดสั้น ๆ ว่าตัวชี้ฟังก์ชันชี้ไปที่ตำแหน่งหน่วยความจำ 5 แต่ไม่ได้ผลชัดเจนและไม่มีค่าฐานสิบหก คิดว่าอาจเป็นเพราะฟังก์ชันส่งคืน int และการกำหนด int ก็โอเค (อย่างใด) ฉันก็ลองสิ่งนี้ด้วย: int * (*) (int …

4
อะไร ((เป็นโมฆะ (*) ()) buf) (); หมายความว่าอย่างไร
ฉันกำลังแก้ไขปัญหาการแสวงหาผลประโยชน์แบบไบนารีบน picoCTF และพบกับโค้ดชิ้นนี้: ((void (*)())buf)(); ที่bufเป็นอาร์เรย์ตัวอักษร ฉันแก้ไขความท้าทาย แต่ดูเหมือนจะไม่เข้าใจว่ามันทำอะไรอยู่ ฉันดูที่กระทู้นี้แต่ฉันไม่สามารถทำให้มันออกมาได้ อะไร((void (*)())buf)();หมายถึง?

4
เป็นโมฆะ * ฟังก์ชั่น () ตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับเป็นโมฆะ *?
void *function()ฉันสับสนเกี่ยวกับความหมายของ มันเป็นตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับมาvoid*? ฉันมักจะใช้มันในโครงสร้างข้อมูลเป็นฟังก์ชั่นซ้ำเรียกคืนตัวชี้ แต่เมื่อฉันเห็นรหัสใน multithreading ( pthread) มีการประกาศฟังก์ชั่นเดียวกัน ตอนนี้ฉันสับสนว่าอะไรคือความแตกต่างระหว่างพวกเขา

2
มาโครแลมบ์ดาสร้างแลมบ์ดาได้อย่างไร
ฉันพบรหัสชิ้นนี้ใน GitHub แต่ไม่เข้าใจ: #define lambda(ret_type, _body) ({ ret_type _ _body _; }) แล้ว: int (*max)(int, int) = lambda(int, (int x, int y) { return x > y ? x : y; }); int max_value = max(1, 2); // max_value is 2 ขีดล่างทำในสิ่งใด#defineและมันคืนตัวชี้ฟังก์ชันได้อย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.