เข้าถึงสมาชิกใน struct ผ่านตัวแปรใน C ++


10

ฉันมีโครงสร้างที่มีสมาชิกสองคนตัวอย่างเช่น:

struct DataSet {
    int x;
    int y;
};

... และฉันต้องเข้าถึงวิธีดังกล่าว แต่จะทำได้ทีละหนึ่งเท่านั้น:

void foo(StructMember dsm) { // ("StructMember" does not exist)
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.dsm * ds.dsm << std::endl;
}
foo(x);
foo(y);

ผลลัพธ์ที่ฉันต้องการ:

16
36

ฉันควรทำอย่างไรเมื่อฉันต้องแก้ปัญหาเช่นนี้ มีประเภทข้อมูลที่สามารถเข้าถึงสมาชิกได้หรือไม่?


สิ่งเดียวที่ฉันนึกได้คือคุณสามารถใช้ตัวชี้เลขคณิต คุณสามารถส่งผ่านเป็นสมาชิก "struct" struct ที่สัมพันธ์กับจุดเริ่มต้นของโครงสร้าง นี้จะขึ้นอยู่กับขนาดของสมาชิก ด้วย ints ฉันคิดว่าคุณสามารถรับประกันว่าพวกเขาต้องการจะสอดคล้องกับขอบเขตของคำดังนั้นคุณจะผ่านdsm = 0ในการเข้าถึงxและdsm = 4การเข้าถึงแล้วคุณต้องการเข้าถึงพวกเขาเช่นy int val = int(*(&ds+dsm))
ocket8888

1
@ ocket8888 c++มีตัวชี้ไปยังสมาชิกดังนั้นไม่จำเป็นต้องแฮ็กตัวชี้ที่กำหนดเองเพื่อทำงานนี้
ซุปเปอร์

@eerorika คุณพูดถูก ก่อนหน้านี้ฉันมีสองสายในฐานะสมาชิก แต่ฉันเปลี่ยนเป็น int ฉันลืมลบ "std ::"
เอเดรียน

คำตอบ:


10

ใช่คุณสามารถใช้ตัวชี้ไปยังสมาชิก ไวยากรณ์สำหรับประเภทคือTypeOfMember TypeOfStruct::*และการเข้าถึงที่คุณทำstruct_variable.*pointer_variable

using StructMember = int DataSet::*;  // Pointer to a member of `DataSet` of type `int`

void foo(StructMember dsm) {
    DataSet ds;
    ds.x = 4;
    ds.y = 6;

    std::cout << ds.*dsm * ds.*dsm << std::endl;
}

int main() {
    foo(&DataSet::x);
    foo(&DataSet::y);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.