Truy cập một thành viên trong một cấu trúc thông qua một biến trong C ++


10

Tôi có một cấu trúc với hai thành viên, ví dụ:

struct DataSet {
    int x;
    int y;
};

..., và tôi phải truy cập những thứ đó trong một phương thức, nhưng mỗi lần chỉ có một phương thức:

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);

Đầu ra tôi muốn có:

16
36

Tôi nên làm gì khi phải giải quyết vấn đề như thế này? Có một loại dữ liệu có thể truy cập một thành viên?


Điều duy nhất tôi có thể nghĩ là bạn có thể sử dụng số học con trỏ. Bạn có thể vượt qua với tư cách là "thành viên" cấu trúc so với phần đầu của cấu trúc. Điều này sẽ phụ thuộc vào kích thước của các thành viên. Với ints tôi nghĩ bạn có thể đảm bảo họ sẽ được căn chỉnh theo ranh giới từ, vì vậy bạn sẽ vượt qua dsm = 0để truy cập xdsm = 4truy cập y, sau đó bạn sẽ truy cập chúng như thế nào int val = int(*(&ds+dsm)).
ocket8888

1
@ ocket8888 c++có con trỏ thành viên, vì vậy không cần hack con trỏ tùy chỉnh để thực hiện công việc này.
siêu

@eerorika Bạn nói đúng. Trước đây tôi có hai chuỗi là thành viên, nhưng tôi đã thay đổi chúng thành int. Tôi đã quên xóa "std ::".
Adrian

Câu trả lời:


10

Có, bạn có thể sử dụng một con trỏ đến thành viên. Cú pháp của loại là TypeOfMember TypeOfStruct::*và để truy cập bạn làmstruct_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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.