为什么我在这个简单的C ++程序中得到“error <class>没有命名类型”错误?</class>

时间:2014-01-29 05:06:20

标签: c++

我有一个简单的电影数据库程序,我正在努力学习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类型?

2 个答案:

答案 0 :(得分:4)

您有循环包含。 MovieView的定义需要MovieConroller的定义,但MovieController的定义需要MovieView的定义。

每个.h文件都包含其依赖项,但两个定义在物理上不可能先于另一个。包含守卫定义决定哪一个获胜。

你需要将其分解,以便只需要一个引用或指向另一个的引用,然后进行前向声明。

答案 1 :(得分:1)

主要包括MovieController MovieController包括MovieView MovieView试图包含MovieController,但是ifndef不允许它是一件好事。

这两个类中的一个在概念上属于另一个类或由另一个类拥有。从概念上讲,MovieController拥有一个MovieView,但MovieView不拥有一个控制器,它只需要一个引用它。 MovieView需要有一个指针,以便它可以引用原始的MovieController,但它不应该有一个真正的MovieController,或者它会尝试使它自己的控制器,与制作它的那个分开。那个电影控制器会制作一个新的MovieView ...这将制作一个新的MovieController ......它将永远制作一个新的MovieView ......等。