النوع struct في السي بلاس بلاس | ++C

الكلمة struct في C++

في الدروس السابقة, كنا نتعامل دائماً مع أنواع بيانات بسيطة فمثلاً كنا نقوم بتعريف متغير نوعه int و هذا المتغير كنا نضع فيه قيمة واحدة فقط.
الأنواع البسيطة مفيدة جداً و سنتعامل معها دائماً و لكن في حالات معينة لا بد لنا من تعريف أنواع جديدة.

كمثال بسيط, إذا كنا ننوي إرسال معلومات مجموعة من المنتجات و كل منتج يملك المعلومات التالية: إسم المنتج, تاريخ إنتاجه, سعره و مكوناته.
هنا سيكون خيار ممتاز أن ننشئ نوع جديد يمثل المنتج, أي نوع فيه المعلومات الأساسية التي لا بد أن يمتلكها أي منتج.
و عندها أي منتج جديد نريد تعريفه, نجعله نسخة منه.

الكلمة struct تستخدم لتعريف نوع جديد و هذا النوع يمكنه أن يحتوي على مجموعة من القيم من أي نوع كانت بشكل مرتب و سهل التعامل معها.
على الأغلب, ستجد النوع الجديد الذي يتم تعريفه بواسطة الكلمة struct يستخدم لهذا الغرض فقط.
و لكن عليك معرفة أنه يمكنه أن يحتوي على أي شيء آخر, مثل دوال خاصة به و حتى struct آخر و سترى ذلك لاحقاً في الأمثلة.


مصطلحات حول النوع struct في السي بلاس بلاس

أي نوع جديد تعرّفه بواسطة الكلمة struct يقال له Structure.
أي نسخة تنشئها من النوع الجديد الذي قمت بتعريفه يقال لها كائن ( Object ) منه.

تعريف struct جديد في C++

إذا كنت ستقوم بتعريف النوع الجديد بواسطة الكلمة struct فيجب أن تتبع الأسلوب التالي.

struct struct_name {
&nbsp &nbsp member_definition;
&nbsp &nbsp member_definition;
&nbsp &nbsp member_definition;
&nbsp &nbsp ..
} object_names;
  • struct_name: &nbsp مكانها نضع الإسم الذي سنعطيه للنوع الجديد.

  • member_definition: &nbsp هنا يمكنك تمرير إسم و نوع أي شيء تنوي جعل النوع الجديد يملكه.

  • object_names: &nbsp إذا أردت إنشاء كائن (نسخة) من النوع الجديد مباشرةً عند تعريفه, فأي إسم تضعه هنا سيتم إعتباره كائن منه.

الآن عليك معرفة أنه يمكنك تعريف struct في أي مكان تريده, فمثلاً يمكنك تعريفه في ملف خاص, خارج الدالة main() و حتى بداخلها إن أردت.


في المثال التالي, قمنا بتعريف نوع جديد إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.

مثال

      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };
    

إنشاء كائن من struct في C++

هناك عدة طرق يمكن اتباعها لإنشاء كائنات من struct و يمكنك اتباع أي طريقة تريد منها.


في المثال التالي قمنا بإنشاء struct إسمه Book و من ثم إنشاء كائن منه.

المثال الأول إنشاء كائن من  struct في السي بلاس بلاس

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // book إسمه Book هنا قمنا بإنشاء كائن من
      struct Book book;
    

في المثال التالي قمنا بإنشاء struct إسمه Book و إنشاء كائن منه بشكل مباشر.
إذاً, هذا المثال هو نفس المثال الأول بالضبط و لكن الكود مكتوب فيه بشكل مختصر فقط.

المثال الثاني

      // book يحتوي على 4 متغيرات. و من ثم قمنا بإنشاء كائن منه إسمه Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      } book;
    

في المثال التالي قمنا بإنشاء struct إسمه Book و من ثم إنشاء ثلاث كائنات منه.

المثال الثالث

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // book3 و الثالث إسمه book2 الثاني إسمه ,book1 الأول إسمه ,Book هنا بإنشاء ثلاث كائنات من
      struct Book book1;
      struct Book book2;
      struct Book book3;
    

في المثال التالي قمنا بإنشاء struct إسمه Book و من ثم إنشاء ثلاث كائنات منه.
إذاً, هذا المثال هو نفس المثال الثالث بالضبط و لكن الكود مكتوب فيه بشكل مختصر فقط.

المثال الرابع

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // book3 و الثالث إسمه book2 الثاني إسمه ,book1 الأول إسمه ,Book هنا بإنشاء ثلاث كائنات من
      struct Book book1, book2, book3;
    

الوصول للأشياء الموجودة بداخل كائن من struct في C++

للوصول لقيم المتغيرات الموجودة فيه, نستخدم العامل . أي النقطة العادية.


مصطلحات تقنية

العامل . يقال له Member Operator لأنه يسمح لنا بالوصول لأي شيء ( Member ) موجود في الكائن.


في المثال التالي, قمنا بتعريف struct إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بإنشاء كائنين منه و من ثم إعطاء كل واحد قيم خاصة به.

مثال

main.cpp
      #include <iostream>

      using namespace std;

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      int main()
      {
      // book2 و الثاني إسمه book1 الأول إسمه ,Book هنا قمنا بتعريف كائنين من
      struct Book book1;
      struct Book book2;

      // book1 هنا قمنا بإعطاء قيم لمتغيرات الكائن
      book1.title = "C++ for beginners";
      book1.author = "Mhamad Harmush";
      book1.price = 9.99;
      book1.numberOfPages = 420;

      // book2 هنا قمنا بإعطاء قيم لمتغيرات الكائن
      book2.title = "Network 1";
      book2.author = "Nadine Masri";
      book2.price = 22.49;
      book2.numberOfPages = 310;

      // book1 هنا قمنا بعرض قيم الكائن
      cout << "Book 1 ----------- \n";
      cout << "Title: " << book1.title << "\n";
      cout << "Author: " << book1.author << "\n";
      cout << "Price: " << book1.price << "$\n";
      cout << "Number of pages: " << book1.numberOfPages << "\n\n";

      // book2 هنا قمنا بعرض قيم الكائن
      cout << "Book 2 ----------- \n";
      cout << "Title: " << book2.title << "\n";
      cout << "Author: " << book2.author << "\n";
      cout << "Price: " << book2.price << "$\n";
      cout << "Number of pages: " << book2.numberOfPages;

      return 0;
      }
    

سنحصل على النتيجة التالية عند التشغيل.

      Book 1 -----------
      Title: C++ for beginners
      Author: Mhamad Harmush
      Price: 9.99$
      Number of pages: 420

      Book 2 -----------
      Title: Network 1
      Author: Nadine Masri
      Price: 22.49$
      Number of pages: 310
    

أمثلة شاملة على النوع struct في السي بلاس بلاس

C++ تعريف دالة تأخذ باراميتر نوعه struct

في المثال التالي, قمنا بتعريف struct إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها كائن نوعه Book فتقوم بطباعة قيمه بشكل مرتب.

في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمريره للدالة printInfo() حتى تقوم بطباعة قيمه.

مثال

main.cpp
      #include <iostream>

      using namespace std;

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها كائن من printInfo هنا قمنا بتعريف دالة إسمها
      void printInfo(struct Book book)
      {
      cout << "Title: " << book.title << "\n";
      cout << "Author: " << book.author << "\n";
      cout << "Price: " << book.price << "$\n";
      cout << "Number of pages: " << book.numberOfPages << "\n";
      }

      // main() هنا قمنا بتعريف الدالة
      int main()
      {
      // book إسمه Book هنا قمنا بتعريف كائن من
      struct Book book;

      // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
      book.title = "C++ for beginners";
      book.author = "Mhamad Harmush";
      book.price = 9.99;
      book.numberOfPages = 420;

      // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير الكائن printInfo() هنا قمنا باستدعاء الدالة
      printInfo(book);

      return 0;
      }
    

سنحصل على النتيجة التالية عند التشغيل.

      Title: C++ for beginners
      Author: Mhamad Harmush
      Price: 9.99$
      Number of pages: 420
    

C++ تعريف دالة بداخل struct

في المثال التالي, قمنا بتعريف struct إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
كما أننا قمنا بوضع دالة إسمها printInfo بداخل الـstruct عند استدعاءها من أي كائن ننشئه منه تقوم بطباعة قيمه بشكل مرتب.

في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم إستدعاء الدالة printInfo() منه حتى تقوم بطباعة قيمه.

مثال

main.cpp
      #include <iostream>

      using namespace std;

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;

      // تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاء من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
      void printInfo()
      {
      cout << "Title: " << title << "\n";
      cout << "Author: " << author << "\n";
      cout << "Price: " << price << "$\n";
      cout << "Number of pages: " << numberOfPages << "\n";
      }
      };

      // main() هنا قمنا بتعريف الدالة
      int main()
      {
      // book إسمه Book هنا قمنا بتعريف كائن من
      struct Book book;

      // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
      book.title = "C++ for beginners";
      book.author = "Mhamad Harmush";
      book.price = 9.99;
      book.numberOfPages = 420;

      // حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
      book.printInfo();

      return 0;
      }
    

سنحصل على النتيجة التالية عند التشغيل.

      Title: C++ for beginners
      Author: Mhamad Harmush
      Price: 9.99$
      Number of pages: 420
    

C++ تعريف دالة تأخذ باراميتر نوعه مؤشر لـ struct

للوصول للأشياء الموجودة في مؤشر لـ struct نستخدم العامل -> و ليس العامل . المعتاد.


في المثال التالي, قمنا بتعريف struct إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
بعدها قمنا بتعريف دالة إسمها printInfo عند استدعاءها نمرر لها عنوان كائن من Book موجود في الذاكرة فتقوم بطباعة قيمه بشكل مرتب.

في الأخير قمنا بإنشاء كائن من Book و إعطاؤه قيم, و من ثم تمرير عنوانه في الذاكرة للدالة printInfo() حتى تقوم بطباعة قيمه.

مثال

main.cpp
      #include <iostream>

      using namespace std;

      // يحتوي على 4 متغيرات Book إسمه struct هنا قمنا بتعريف
      struct Book {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // فتقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها نمرر لها عنوان كائن من printInfo هنا قمنا بتعريف دالة إسمها
      void printInfo(struct Book* book)
      {
      cout << "Title: " << book->title << "\n";
      cout << "Author: " << book->author << "\n";
      cout << "Price: " << book->price << "$\n";
      cout << "Number of pages: " << book->numberOfPages << "\n";
      }

      // main() هنا قمنا بتعريف الدالة
      int main()
      {
      // book إسمه Book هنا قمنا بتعريف كائن من
      struct Book book;

      // book هنا قمنا بإعطاء قيم لمتغيرات الكائن
      book.title = "C++ for beginners";
      book.author = "Mhamad Harmush";
      book.price = 9.99;
      book.numberOfPages = 420;

      // لها حتى تقوم بطباعة القيم الموجودة فيه book و تمرير عنوان الكائن printInfo() هنا قمنا باستدعاء الدالة
      printInfo(&book);

      return 0;
      }
    

سنحصل على النتيجة التالية عند التشغيل.

      Title: C++ for beginners
      Author: Mhamad Harmush
      Price: 9.99$
      Number of pages: 420
    

C++ وضع إسم مختصر للـ struct بواسطة الكلمة typedef

في الأمثلة السابقة, لاحظنا أنه كلما أردنا إنشاء كائن من Book كان لا بد لنا من أن نكتب struct Book.
إذا أردت إختصار هاتين الكلمتين بكلمة واحدة فقط, يمكنك وضع إسم مختصر للنوع Book لحظة تعريفه و عندها يمكنك استخدامه كلما أردت إنشاء كائن منه.


في المثال التالي قمنا بإنشاء struct و أعطيناه Book كإسم مختصر بالإعتماد على الكلمة typedef.
بعدها قمنا بإنشاء ثلاث كائنات منه باستخدام الإسم المختصر الذي وضعناه له.

مثال

      // كإسم مختصر و وضعنا فيه 4 متغيرات Book أعطيناه الكلمة struct هنا قمنا بتعريف
      typedef struct {
      string title;
      string author;
      double price;
      int numberOfPages;
      } Book;

      // book3 و الثالث إسمه book2 الثاني إسمه ,book1 الأول إسمه ,Book هنا بإنشاء ثلاث كائنات من
      Book book1, book2, book3;
    

C++ وضع إسم مختصر للـ struct بواسطة الكلمة using

في الأمثلة السابقة, لاحظنا أنه كلما أردنا إنشاء كائن من Book كان لا بد لنا من أن نكتب struct Book.
إذا أردت إختصار هاتين الكلمتين بكلمة واحدة فقط, يمكنك وضع إسم مختصر للنوع Book لحظة تعريفه و عندها يمكنك استخدامه كلما أردت إنشاء كائن منه.


في المثال التالي قمنا بإنشاء struct و أعطيناه Book كإسم مختصر بالإعتماد على الكلمة using.
بعدها قمنا بإنشاء ثلاث كائنات منه باستخدام الإسم المختصر الذي وضعناه له.

مثال

      // كإسم مختصر و وضعنا فيه 4 متغيرات Book أعطيناه الكلمة struct هنا قمنا بتعريف
      using Book = struct {
      string title;
      string author;
      double price;
      int numberOfPages;
      };

      // book3 و الثالث إسمه book2 الثاني إسمه ,book1 الأول إسمه ,Book هنا بإنشاء ثلاث كائنات من
      Book book1, book2, book3;