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

আমাকে যখন এই জাতীয় সমস্যার সমাধান করতে হবে তখন আমার কী করা উচিত? এমন কোনও ডাটা টাইপ রয়েছে যা কোনও সদস্যকে অ্যাক্সেস করতে পারে?


আমি ভাবতে পারি কেবলমাত্র আপনি পয়েন্টার পাটিগণিত ব্যবহার করতে পারেন। আপনি কাঠামোর শুরুর তুলনায় স্ট্রাক্ট "সদস্য" হিসাবে একটি অফসেট হিসাবে পাস করতে পারেন। এটি সদস্যদের আকারের উপর নির্ভর করবে। Ints সঙ্গে আমি মনে করি আপনি নিশ্চিত করতে পারে না তারা শব্দ গণ্ডি সারিবদ্ধ করা চাই, তাই আপনি পাস চাই dsm = 0অ্যাক্সেস করতে xএবং dsm = 4অ্যাক্সেস করতে y, তাহলে আপনি তাদের মত অ্যাক্সেস চাই int val = int(*(&ds+dsm))
ket8888

1
@ ket8888 c++এর পয়েন্টার-থেকে-সদস্য রয়েছে, তাই এই কাজটি করার জন্য কাস্টম পয়েন্টার হ্যাকের প্রয়োজন নেই।
সুপার

আপনি ঠিক বলেছেন ঠিক আছে। পূর্বে সদস্য হিসাবে আমার কাছে দুটি স্ট্রিং ছিল, তবে আমি সেগুলিকে ইনট এর মধ্যে পরিবর্তন করেছি। আমি "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.