إرجاع مؤشر إلى الطبقة الداخلية المتداخلة من الطبقة الخارجية العامة
-
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();