Статическая функция класса в другом классе

0

Я пытаюсь вызвать статическую функцию 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);
  • 0
    что за Model ?
  • 0
    Поместите тело View::linkMvc после AreaMap . Или сделайте функцию просто свободной функцией вместо статической функции-члена.
Теги:

2 ответа

0
Лучший ответ
#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() переменную-член.

  • 0
    извините, AreaMap :: модель статична. Это работает, хотя спасибо.
  • 0
    прости говорил слишком рано. Я получаю ошибку связи. Там написано несколько определений View :: linkMvc
Показать ещё 5 комментариев
0
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. Вам необходимо объявить эту функцию, прежде чем вы сможете ссылаться на нее.
  • 0
    Модель находится в другом заголовочном файле. Извините, там должен быть #include "Model.h" вверху.
  • 0
    А AreaMap :: staticInitialize () является статической функцией, определенной в AreaMap.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню