我有一个简单的电影数据库程序,我正在努力学习C ++。
我有一个Main.cc文件......
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#include "MovieController.h"
int main()
{
MovieController mc;
mc.execute();
return 0;
}
...创建并“执行”MovieController ......
#ifndef MOVIECONTROLLER_H
#define MOVIECONTROLLER_H
#include "MovieView.h"
class MovieController
{
public:
void execute();
void showMainMenuUI();
void doAddMovie(string title, int year, string genre);
private:
MovieView movieView;
};
#endif
... MovieController有一个MovieView,它调用显示UI的东西......
#ifndef MOVIEVIEW_H
#define MOVIEVIEW_H
#include "MovieController.h"
class MovieView
{
public:
void showMainMenu();
void showAddMovie();
private:
MovieController movieController;
};
#endif
... MovieView有一个MovieController,所以它可以回叫控制器来添加电影等等。
我的问题是当我编译Main.cc时出现以下错误...
$ g++ -o test Main.cc
In file included from MovieController.h:4:0,
from Main.cc:17:
MovieView.h:17:5: error: ‘MovieController’ does not name a type
为什么MovieView不能识别MovieContoller类型?
答案 0 :(得分:4)
您有循环包含。 MovieView
的定义需要MovieConroller
的定义,但MovieController
的定义需要MovieView
的定义。
每个.h
文件都包含其依赖项,但两个定义在物理上不可能先于另一个。包含守卫定义决定哪一个获胜。
你需要将其分解,以便只需要一个引用或指向另一个的引用,然后进行前向声明。
答案 1 :(得分:1)
主要包括MovieController MovieController包括MovieView MovieView试图包含MovieController,但是ifndef不允许它是一件好事。
这两个类中的一个在概念上属于另一个类或由另一个类拥有。从概念上讲,MovieController拥有一个MovieView,但MovieView不拥有一个控制器,它只需要一个引用它。 MovieView需要有一个指针,以便它可以引用原始的MovieController,但它不应该有一个真正的MovieController,或者它会尝试使它自己的控制器,与制作它的那个分开。那个电影控制器会制作一个新的MovieView ...这将制作一个新的MovieController ......它将永远制作一个新的MovieView ......等。