C ++包含并重新定义了类错误

时间:2015-09-03 13:43:21

标签: c++ inheritance include polymorphism multiple-inheritance

我正在编写一个程序,根据不同的搜索歌曲 参数。 在我的系统中有两种类型的歌曲:歌词和乐器。 因为我需要将它们都放在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
       ^

当:

  • 行InstrumentalSong.h:16:0和LyricsSong.h:15:0是我的地方 包括“Song.h”
  • lines songsParser.cpp:25和songsParser.cpp:26是我的地方 包括InstrumentalSong.h和LyricsSong.h
  • line Song.h:6:7:是Song.h的定义(据说是 宋级,如上所示。)

我该怎么办? 附:我没有导入任何cpp文件,只导入头文件。

3 个答案:

答案 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 ++标准,因此如果您必须使用不同的编译器(尽管它是一个广泛的扩展),它可能会成为一个问题。