Я пытаюсь вызвать статическую функцию AreaMap :: staticInitialize (Model *) из метода в классе View. Он компилируется, когда я сначала определяю класс AreaMap, но я получаю сообщение об ошибке ниже, когда я пытаюсь объявить View first, даже если я перечислил область AreaMap. Кто-нибудь знает способ сохранить определение View сверху?
#ifndef VIEW_H
#define VIEW_H
#include "Model.h"
class AreaMap;
class View {
public:
void linkMvc(Model * m) {
model = m;
AreaMap::staticInitialize(m);
}
Model * model;
};
class AreaMap {
public:
void static staticInitialize(Model * m) {
model = m;
}
Model * model;
};
#endif
Ошибка:
inc/View.hpp: In member function ‘void View::linkMvc(Model*, Controller*):
inc/View.hpp:36:7: error: incomplete type ‘AreaMap used in nested name specifier
AreaMap::staticInitialize(m);
#ifndef VIEW_H
#define VIEW_H
class AreaMap;
class View {
public:
void linkMvc(Model * m);
Model * model;
};
class AreaMap {
public:
void static staticInitialize(Model * m) {
model = m;
}
Model * model;
};
void View::linkMvc(Model * m) {
model = m;
AreaMap::staticInitialize(m);
}
#endif
Однако это еще не должно компилироваться. staticInitialize()
пытается изменить staticInitialize()
переменную-член.
class AreaMap; <----- This won't suffice.
class View {
public:
void linkMvc(Model * m) { <----- What Model?
model = m;
AreaMap::staticInitialize(m); <----- What this?
}
Model * model;
};
Здесь есть две проблемы:
Model
? Вы должны переслать его.AreaMap
недостаточно для вызова AreaMap::staticInitialize
. Вам необходимо объявить эту функцию, прежде чем вы сможете ссылаться на нее.
Model
?View::linkMvc
послеAreaMap
. Или сделайте функцию просто свободной функцией вместо статической функции-члена.