我正在编写一个程序,根据不同的搜索歌曲 参数。 在我的系统中有两种类型的歌曲:歌词和乐器。 因为我需要将它们都放在1个向量中,所以我有一个歌曲类和 LyricsSong& InstrumentalSong子类。
所以我有一个Song.h文件:
#include <stdio.h>
#include <iostream>
#include <string>
class Song
{
public:
std::string title;
virtual void print();
virtual void printSong(std::string query);
};
还有乐器和歌词子类,它们以这种方式定义:
class LyricsSong : public Song
class InstrumentalSong : public Song
两个包括Song.h,并且在这两个类中都定义了类 只在头文件中。
当我尝试运行另一个使用这两个子类的文件时 并包括:
#include "LyricsSong.h"
#include "InstrumentalSong.h"
(显然更多的cpp库),我得到以下编译错误:
In file included from /cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/InstrumentalSong.h:16:0,
from /cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/songsParser.cpp:26:
/cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/Song.h:6:7: error: redefinition of 'class Song'
class Song
^
In file included from /cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/LyricsSong.h:15:0,
from /cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/songsParser.cpp:25:
/cygdrive/c/Users/Username/Documents/C++ Workshop/ex2/ex2_code/Song.h:6:7: error: previous definition of 'class Song'
class Song
^
当:
我该怎么办? 附:我没有导入任何cpp文件,只导入头文件。
答案 0 :(得分:6)
您必须告诉预处理器只包含一次头文件。您可以在所有#pragma once
个文件的顶部添加*.h
来实现:
#pragma once
//Your header file's code
使用此行始终开始头文件也是一种好习惯。
答案 1 :(得分:5)
它们都包含'Song.h'文件,预处理器将文件内容包含两次。 您需要在#ifndef #define和#endif指令中编写'LyricsSong.h'和'InstrumentalSong.h'文件内容。喜欢这个
#ifndef LYRICS_SONG_H
#define LYRICS_SONG_H
your code goes here.
...
#endif
答案 2 :(得分:1)
如前所述,我也会使用#pragma一次,它更方便,更干净。但请注意,它不是C ++标准,因此如果您必须使用不同的编译器(尽管它是一个广泛的扩展),它可能会成为一个问题。