2016-03-12 3 views
0

Я имею дело с ситуацией, когда я пытаюсь определить два класса, которые зависят друг от друга. Это упрощенный пример того, что я пытаюсь сделать.Передовая декларация и классы

class a{ 
public: 
    int ia; 
    int printb(b in){ 
     return in.ib; 
    } 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in){ 
     return in.ia; 
    } 
}; 

Это дает мне неопределенные ошибки класса b. Я пробовал

class b; 

class a{ 
public: 
    int ia; 
    int printb(b in){ 
     return in.ib; 
    } 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in){ 
     return in.ia; 
    } 
}; 

Но это не исправляет проблему. Есть идеи?

+1

Подумайте об этом: Как компилятор должен знать, что 'обратный in.ib;' означает, что, не зная определение 'b'? Вы должны определить 'b', прежде чем вы определяете' a :: printb'. –

+0

Итак, объявляйте только подпрограммы в классах и затем определяете их позже? – WhatWouldKantDo

+0

Да. Вероятно, для этого есть обман, но я тоже не знаю, как это искать. :/ –

ответ

3

Все, что вам нужно сделать, это сохранить реализацию функций-членов вне определения класса. Вы можете убедиться, что оба класса определены перед внедрением членов:

class b; 

class a{ 
public: 
    int printb(b in); 
    int ia; 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in); 
}; 

int a::printb(b in){ 
     return in.ib; 
    } 
int b::printb(a in){ 
     return in.ia; 
    } 
+0

Две функции-члены должны быть помечены как 'inline', чтобы они соответствовали исходному коду. Также необходимо, если это файл заголовка. –

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