إرجاع مؤشر إلى الطبقة الداخلية المتداخلة من الطبقة الخارجية العامة

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

  •  24-09-2019
  •  | 
  •  

سؤال

أنا جديد على C ++ ، لذا تحمل معي. لدي فئة عامة تسمى A. A لها فئة متداخلة تسمى B. A تحتوي على طريقة تسمى GetB () ، والتي من المفترض أن تعيد مثيلًا جديدًا لـ B. ومع ذلك ، لا يمكنني الحصول على الكود الخاص بي. إليك ما يبدو عليه: #include

آه

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B * getB(); 
};

A.CPP

#include "A.h"

template <class E>
A<E>::B * A::getB() {
    return new B();
}

عندما أحاول تجميع هذا ، أحصل على الخطأ التالي:

error: expected constructor, destructor, or type conversion before '*' token

هل يعرف أي شخص ما أفعله خطأ؟

شكرًا،

حلزون

تحديث:

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

آه

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B * getB(); 
};

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}

class C {

};

ومع ذلك ، عندما أحاول استخدام هذا من Main ، أحصل على خطأ. ها هي طريقتي الرئيسية:

Main.cpp

#include "A.h"

int main(int argc, char *argv[])
{
    A<C> *a = new A<C>();
    A<C>::B *b = a.getB();
}

عندما أحاول تجميع هذا ، أحصل على الخطأ التالي:

error: request for member 'getB' in 'a', which is of non-class type 'A<C>*'

شكرا مرة أخرى على الردود السريعة.

حلزون

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

المحلول

المترجم ليس ذكيًا بما يكفي لمعرفة أن "B" هو نوع عندما يكون "A". حاول استخدام Typename.

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}

نصائح أخرى

تحتاج إلى استخدام typename في تعريفك للتلميح إلى المترجم أن B هو نوع.

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}

الإجابة على التحديث:

لا تحتاج إلى new في الواقع ، سيكون من الأفضل إذا لم تفعل ذلك ، ومنذ ذلك الحين يجب أن تضطر إلى ذلك بشكل صريح delete ذاكرة مخصصة أو استخدام المؤشرات الذكية.

لذلك ، إليك رمزك المنقح:

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B getB(); // Object, not pointer
};

template <class E>
typename A<E>::B A<E>::getB() {
    return B();
}

#include "A.h"

int main(int argc, char *argv[])
{
    A<C> a = A<C>();
    A<C>::B b = a.getB();
}

إذا كنت ترغب في new ال A<C> الفصل ، ثم تحتاج إلى استخدام operator-> لاستدعاء الأساليب:

A<C>::B b = a->getB();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top