باستخدام فئة مجردة لتنفيذ مجموعة من عناصر الفئة المشتقة

StackOverflow https://stackoverflow.com/questions/1591269

سؤال

يجب أن أفعل ذلك لمحاضرة C ++ الأساسية في جامعتي ، لذلك فقط لأكون واضحًا: كنت سأستخدم STL إذا سمح لي بذلك.

المشكلة: لدي فصل يسمى "شكل 3D" الذي استخلصت منه الفصول "Cube" و "Sphere". الآن يجب أن أقوم بتنفيذ "form3d_stack" ، وهو ما يعني أن يكون قادرًا على عقد كائنات من أنواع "Cube" و "Sphere". لقد استخدمت المصفوفات لهذا وعملت بشكل جيد عندما حاولت القيام بذلك مع كومة من ints. حاولت أن أفعل ذلك مثل:

شكل 3d_stack.cpp:

15    // more stuff
16    
17        shape3d_stack::shape3d_stack (unsigned size) :
18         array_ (NULL),
19         count_ (0),
20         size_  (size)
21        { array_ = new shape3d[size]; }
22    
23    // more stuff

لكن لسوء الحظ ، يخبرني المترجم:

g++ -Wall -O2 -pedantic -I../../UnitTest++/src/ -c shape3d_stack.cpp -o shape3d_stack.o
shape3d_stack.cpp: In constructor ‘shape3d_stack::shape3d_stack(unsigned int)’:
shape3d_stack.cpp:21: error: cannot allocate an object of abstract type ‘shape3d’
shape3d.hpp:10: note:   because the following virtual functions are pure within ‘shape3d’:
shape3d.hpp:16: note:  virtual double shape3d::area() const
shape3d.hpp:17: note:  virtual double shape3d::volume() const

أعتقد أن هذا يجب أن يكون نوعًا من خطأ في التصميم القبيح الناجم عن نفسي. فكيف سيكون الطريقة الصحيحة لاستخدام جميع أنواع الكائنات المستمدة من "شكل 3D" مع مجموعتي؟

هل كانت مفيدة؟

المحلول

لا يمكنك إنشاء كائنات من فئات مجردة.
من المحتمل أن ترغب في إنشاء مجموعة من المؤشرات إلى الفصل التجريدي ، وهو أمر مسموح به ، وملء مثيلات مشتقة:

// declaration somewhere:
shape3d** array_;

// initalization later:
array_ = new shape3d*[size];

// fill later, triangle is derived from shape3d:
array_[0] = new triangle;

نصائح أخرى

الخط

array_ = new shape3d[size];

يخصص مجموعة من الكائنات الشكل 3D. لا مكعبات ، وليس كرات ، فقط شكل قديم عادي 3d. لكن لا يمكن إنشاء كائن واحد الشكل 3D ، لأنه مجردة.

بشكل عام ، لاستخدام تعدد الأشكال والوظائف الافتراضية ، تحتاج إلى استخدام عدم التوجيه: المؤشرات و/أو المراجع ، وليس الكائنات الحرفية. قد يشير شكل 3d* إلى مكعب أو إلى كرة ، ولكن الشكل 3D هو دائمًا شكل 3D ، وليس فئة فرعية من شكل 3D.

حيث shape3d هو فئة أساسية مجردة ، ربما تريد أن تخزن مكدتك shape3d, ، بدلا من الكائنات الفعلية.

لا يمكنك إنشاء مجموعة جديدة من الفصل التجريدي. ما يمكنك فعله هو إعلان ذلك كمجموعة من المؤشرات ، ثم في وقت لاحق عندما تعرف أي نوع من الشكل ، يمكنك تخصيص كائنات الفئة المشتقة من اختيارك.

بدلاً من كومة من الكائنات ، تحتاج إلى إنشاء كومة من المؤشرات للكائنات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top