头文件和命名空间混淆
Header file and namespace confusion
我试图将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文章。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- Qt C++:不同文件中同一命名空间的多个Q_NAMESPACE
- 不同C++文件中未命名命名空间中的名称可以引用同一个命名事物吗?
- 使用命名空间在另一个".cpp"文件中定义
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- 模板实现文件中的匿名命名空间
- C++-使用来自不同头文件、相同命名空间的枚举
- C++ 如何在 def 文件中指定命名空间
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 在头文件中添加命名空间函数
- 在多个 cpp 文件中重用未命名的命名空间函数
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- 跨命名空间的友元类和不同的.H 文件
- 我可以在应用程序之间更改 .proto 文件的命名空间吗?
- 试图将两个类放在同一命名空间中的单独文件中,但只有#1个#Class类作品
- C++中的头文件和命名空间
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- 包含所有命名空间 std 的文件