I'm trying to implement MVC pattern in C++. I follow the instructions in the file: http://www.laputan.org/pub/papers/POSA-MVC.pdf
But when I compile program I gets this errors:
In file included from C:\Users\Lukasz\ClionProjects\CDDB\Controller.h:10:0,
from C:\Users\Lukasz\ClionProjects\CDDB\Controller.cpp:5:
C:\Users\Lukasz\ClionProjects\CDDB\View.h:17:5: error: 'Controller' does not name a type
Controller *myController;
^
C:\Users\Lukasz\ClionProjects\CDDB\View.h:28:13: error: 'Controller' does not name a type
virtual Controller *makeController() {}
^
C:\Users\Lukasz\ClionProjects\CDDB\View.h:33:5: error: 'Controller' does not name a type
Controller *getController() { return myController; }
^
C:\Users\Lukasz\ClionProjects\CDDB\View.h: In constructor 'View::View(Model*)':
C:\Users\Lukasz\ClionProjects\CDDB\View.h:19:34: error: class 'View' does not have any field named 'myController'
View(Model *m) : myModel(m), myController(0)
^
In file included from C:\Users\Lukasz\ClionProjects\CDDB\View.h:10:0,
from C:\Users\Lukasz\ClionProjects\CDDB\View.cpp:5:
C:\Users\Lukasz\ClionProjects\CDDB\Controller.h:17:22: error: expected ')' before '*' token
Controller( View *v ) : myView(v){
^
C:\Users\Lukasz\ClionProjects\CDDB\Controller.h:27:5: error: 'View' does not name a type
View *myView;
^
My files:
View.h
#ifndef CDDB_VIEW_H
#define CDDB_VIEW_H
#include "Observer.h"
#include "Model.h"
#include "Controller.h"
class View : public Observer {
public:
Model *myModel;
Controller *myController;
View(Model *m) : myModel(m), myController(0)
{
myModel->attach(this);
}
virtual ~View() { }
virtual void update() { }
virtual void initialize() {}
virtual Controller *makeController() {}
virtual void draw();
Model *getModel() { return myModel; }
Controller *getController() { return myController; }
};
class BarChartView : public View {
public:
BarChartView(Model *m) : View(m) { }
virtual void draw();
};
#endif //CDDB_CONTROLLER_H
Model.h
#ifndef CDDB_MODEL_H
#define CDDB_MODEL_H
#include <iostream>
#include <cstdlib>
#include <list>
#include <set>
#include <iterator>
#include "Observer.h"
using namespace std;
class Model{
string cdName;
public:
Model(string cdName);
void addRecord();
void removeRecord();
void attach(Observer *s) { registry.insert(s); }
void detach(Observer *s) { registry.erase(s); }
protected:
virtual void notify();
private:
set<Observer*> registry;
};
#endif //CDDB_CONTROLLER_H
Controller.h
#ifndef CDDB_CONTROLLER_H
#define CDDB_CONTROLLER_H
#include "Observer.h"
#include "View.h"
class Controller : public Observer {
public:
virtual void handleEvent() {}
Controller( View *v ) : myView(v){
myModel = myView->getModel();
myModel->attach(this);
}
virtual ~Controller() { }
virtual void update() { }
protected:
Model *myModel;
View *myView;
};
#endif //CDDB_CONTROLLER_H
Model.cpp, View.cpp, Controller.cpp are empty. I compile this code using cmake
cmake_minimum_required(VERSION 3.3)
project(CDDB)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp Model.h Observer.h View.h controller.h Controller.cpp Controller.h Model.cpp View.cpp Observer.cpp)
add_executable(CDDB ${SOURCE_FILES})
Any ideas?
EDIT:
Ok, I add class Model; class View;
into Controller.h but I have new error 25: error: invalid use of incomplete type 'class View' myModel = myView->getModel();