我正在尝试将一个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 album\n";
cout << "2. Remove image from album\n";
cout << "3. List all images in album\n";
cout << "4. View image in album\n";
cout << "5. Quit\n";
//and so on
当我尝试编译它时,我在void Menu :: startMenu(Model :: Album inAlbum)行中出现错误
'模型'尚未声明
Model是我使用的命名空间。我认为包括Album.hpp会解决这个问题,但它没有解决这个问题,而且我对如何解决这个问题感到茫然。
编辑:菜单是一个类,这是我的Menu.hpp:
#ifndef MENU_H //"Header guard"
#define MENU_H
namespace View
{
class Menu
{
public:
void startMenu(Model::Album inAlbum);
};
}
#endif
我的Album.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
答案 0 :(得分:1)
您的Menu.hpp
遗漏了一些声明。标题应该可以自己编译,而不需要在它们之前包含其他标题。所以如果你不确定你应该总是尝试编译这样的东西:
#include "Menu.hpp"
int main() {
}
如果它不编译,则需要在标题中添加包含或声明。
现在,您在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中包含图像标题。
有关包含和转发声明的详细信息,请阅读this excellent GOTW article from Herb Sutter。