头文件和命名空间混淆

Header file and namespace confusion

本文关键字:命名空间 文件      更新时间:2023-10-16

我试图将Album对象从main发送到另一个.cpp文件中的函数,但在编译时出错:

在main中,我创建了一个Album对象,然后尝试将其传递给菜单函数,如下所示:

Model::Album album("TestAlbum");
View::Menu m;
m.startMenu(album);

我的菜单类:

#include "stdio.h"
#include "Menu.hpp"
#include "AlbumOps.hpp"
#include "Album.hpp"
#include <iostream>
using namespace std;
namespace View
{
void Menu::startMenu(Model::Album inAlbum) //compile errors happen here
    {
    int option = 1;
    while (option!=5)
        {
        cout << "1. Add image to albumn";
        cout << "2. Remove image from albumn";
        cout << "3. List all images in albumn";
        cout << "4. View image in albumn";
        cout << "5. Quitn";
//and so on

当我试图编译这个时,我在void Menu::startMenu(Model::Album inAlbum)行上遇到错误

"模型"尚未声明为

Model是我使用的名称空间。我原以为包括Album.hpp会解决这个问题,但事实并非如此,我不知道如何解决这个问题。

编辑:菜单是一个类,这是我的菜单

#ifndef MENU_H //"Header guard"
#define MENU_H
namespace View
{
class Menu
    {
    public:
    void startMenu(Model::Album inAlbum);
    };
}
#endif

我的专辑.hpp:

#ifndef ALBUM_H
#define ALBUM_H
#include <string>
#include <vector>
#include "Image.hpp"
namespace Model{
class Album
{
  private:
    std::vector<Image*> imageList;
    std::string albumName;      

  public:
    Album(std::string);
    /****Setters****/
    void setAlbumName(std::string);
    void addImage(Image);
    /****Getters****/
    Image getImage(int);
    std::string getAlbumName();
    int getListLength();
};
}
#endif

您的Menu.hpp缺少一些声明。标头应该是可编译的,而不需要在它们之前包含其他标头。所以,如果你不确定你应该总是尝试编译这样的东西:

#include "Menu.hpp"
int main() {
}

如果它没有编译,则需要在标头中添加include或声明。

现在,Menu.hpp中缺少的是Album类的声明。仅仅包含专辑标题是过分的,并导致循环包含,所以转发声明是正确的做法:

#ifndef MENU_H //"Header guard"
#define MENU_H
//forward declaration of Album:
namespace Model {
  class Album;
}
namespace View
{
class Menu
    {
    public:
    void startMenu(Model::Album inAlbum);
    };
}
#endif 

在"相簿"标头中,"图像"标头包含的内容太多。一个正向声明就足够了,因为您实际上并没有使用一个Image,您只使用指向Image的指针,并将其类型声明为某些函数的返回和参数类型。不过,您可能需要在Album.cpp中包含图像标题。

有关包含和转发声明的更多信息,请阅读Herb Sutter的这篇优秀的GOTW文章。