النمذجة الطبقة المناسبة باستخدام ج and و كونست

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

  •  21-12-2019
  •  | 
  •  

سؤال

اسمحوا لي أن أفضل أن أتطور في الغالب في ج # وأن تطوير ج which الذي قمت به لم يستفد بشكل كامل من لغة ج fully.أحاول الآن استخدام اللغة كما كان مقصودا وأنا أسحب شعري بإعلانات ثابتة في الحجج التي تم تمريرها.في الماضي لم أكن استخدامها أو اختراق طريقي إلى جعلها تعمل مع المحكمة الخاصة بلبنان.

أفهم أنني سأقوم بإنشاء الوظيفة التالية عندما أريد استخدام س للقراءة فقط في الوظيفة:

void foo(const MyClass* o);

حتى هنا هي مشكلتي...الكود أولا:

#include <iostream>
#include <string>

using namespace std;

///////////////////////////////////////////////////////////
// Classes are defined in the one file for an easy post.

///////////////////////////////////////////////////////////

class ClassA {
private: // member variables
    string m_name;

public: // constructors
    ClassA(const string& name = "") : m_name{name} {}
    virtual ~ClassA() { }

public: // accessors
    const string& name() const { return m_name; }
    void setName(const string& value) { m_name = value; }   
};

class ClassB {
private: // member variables
    string m_name;
    ClassA m_child;

public: // constructors
    ClassB(const string& name = "") : m_name{name} {}
    virtual ~ClassB() { }

public: // accessors
    const string& name() const { return m_name; }
    void setName(const string& value) { m_name = value; }

    ClassA* child() { return &m_child; }
    void setChild(const ClassA* value) { m_child = *value; }
};

///////////////////////////////////////////////////////////
// Protoptypes are not used to save space for the post.

void doSomethingA(const ClassA* o) {
   cout << "name = " << o->name() << endl << endl;
}

void doSomethingB(const ClassB* o) {
   cout << "name = " << o->name() << endl << endl;
   doSomethingA(o->child());
}

///////////////////////////////////////////////////////////

int main(int argc, char** argv) {
    ClassA a { "My Class A" };
    ClassB b { "My Class B" };


    b.setChild(&a);
    b.child()->setName("My New Name");
    doSomethingB(&b);
    return 0;
}

في الرئيسي () المترجم (ز version الإصدار 4.7.2) يحجم في دوسوميثينغب:

doSomethingA(o->child());

مع خطأ:تمرير 'كونست كلاس ب' كما ' هذه ' حجة ' كلاسا * كلاس ب:: الطفل ()' المرتجع التصفيات [- إفبيرميسيف]

الآن أنا تمرير فصولي إلى وظائف كمؤشرات.أخطط دائما لاستخدام المؤشرات لأن لدي مشكلة في خيارات المرجع / المؤشر.أنا اختيار واحد ، مؤشرات ، والتمسك بها.لذلك دوسوميثينغا و دوسوميثينغب أريد أن يكون كونست أن أقول مبرمج أن فئتها لا يتم تغييرها.ولكن أريد فقط نسخة واحدة من الطفل () التي أريد استخدامها في بعض الأحيان "للقراءة فقط" وأحيانا أخرى تسمح للمستخدم لتغيير البيانات داخل الكائن الطفل (وليس أفضل طريقة ، وأنا منح ذلك ، ولكن هناك بعض حالات الاستخدام حيث أحتاج هذا).حتى أنني حاولت:

doSomethingA(const_cast<const ClassA*>(o->child()));

لكن هذا لم ينجح.

في الماضي أزلت الإعلانات كونست في وظائف لجعل شيء من هذا القبيل العمل ولكن الآن أريد أن استخدام ج proper السليم.مساعدة من فضلك.

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

المحلول

كنت تحاول الوصول إلى وظيفة غير كونست ضد كائن كونست.تحتاج إلى جعل وظيفة const :

const ClassA* child() const { return &m_child; }

يمكنك أيضا توفير نسخة كونست وغير كونست:

ClassA* child() { return &m_child; }
const ClassA* child() const { return &m_child; }

بهذه الطريقة يمكنك استدعاء طرق غير ثابتة على ClassA عندما يكون لديك كائن غير ثابت.

نصائح أخرى

حاول

giveacodicetagpre.

أو

giveacodicetagpre.

للحفاظ على صحة const

أيضا، لا تحتاج إلى استخدام المؤشرات طالما أنك لا تخطط تمرير Nullptr.لذلك يمكنك القيام بما يلي:

giveacodicetagpre.

المراجع لا تزال Alow Polymorphic الأشياء نفسها كما المؤشرات.

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