2015-12-06 4 views
0

Поэтому у меня есть два класса, как этотC++ Возвращение дочернего класса внутри родительского класса

#pragma once 
#include "B.h" 
class A { 
public: 
    B getB() {} 
}; 

и

#pragma once 
#include "A.h" 
class B : public A { 

}; 

Ошибка: 'A' базовый класс не определено.

Оба должны быть объявлены перед другим, так как я могу исправить это?

Если вы реорганизовать код в один файл, то он выглядит следующим образом:

#include <iostream> 
using namespace std; 
class B : public A { 

}; 
class A { 
public: 
    B getB() {} 
}; 

void main() { 
    A a; 
    B b = a.getB(); 
    system("pause"); 
} 

Но проблема все еще существует ...

+0

Что такое IDE, которую вы используете? –

+0

Visual Studio 2015 –

ответ

1
  • Перед использованием в наследовании, класс должен быть полностью определить.
  • Перед использованием в значении (т. Е. Член, переменная, входной параметр, возвращаемое значение) класс должен быть полностью определен.

Итак, здесь вы застряли. Обходной путь обычно делается, чтобы вернуть класс ссылочной/указатель/shared_ptr: (?, Т.е. кто владеет указатель вы вернетесь)

// Forward declaration 
class B; 

class A 
{ 
    public: 
    B& GetB(); 
}; 

class B : public A 
{ /* ... */ } 

B& A::GetB() { return a_b_from_somewhere; } 

Но обратите внимание, что вы, безусловно, придется иметь дело с проблемами владельца судна в этом случае

+0

Хорошо спасибо, быстрый вопрос об этой функции, как я могу это исправить? B & getB() { B a (4); возвращение a; } Ошибки: C2440 \t 'возвращение': не удается преобразовать из 'Int' в 'B &' C2079 \t 'A :: с' использует неопределенный класс 'B' –

+0

Просто реализовать его после того, как 'b' декларация. (пример обновлен) – Johan

+0

Спасибо, что я должен вам! –

Смежные вопросы