标题多重重新定义

时间:2015-05-20 18:27:19

标签: c++ compiler-errors

我知道这个问题已被要求死亡,但我做了大量研究,到目前为止没有任何帮助。是的我有很多很多的标题保护没有我知道没有什么需要内联的每个功能都在一个类中。我有一个encoderrunner.cpp,其中包括encoder.h和decoder.h,encoder.h和decoder.h都包含FrequencyTable.h,而且这一切都破坏了,编译器说FrequencyTable中的所有内容都是重新定义。这是许多其中之一恰好来自与FrequencyTable

分开的类
/home/sersay/Documents/ECS60/p4/FrequencyNode.cpp:10: multiple definition of `FrequencyNode::FrequencyNode(unsigned char, FrequencyNode*, FrequencyNode*)'
decoder.o:/home/sersay/Documents/ECS60/p4/FrequencyNode.cpp:10: first defined here

等...

  • 我已经/添加了标题保护,包括尝试#pragma once
  • FrequencyTable最初是一个嵌套类,所以我尝试将它分成两个类,仍然是同样的错误
  • 我在类外有函数,但它们在我的FrequencyTable类中不存在,或者与我分开的其他类

我可以提供更多代码,但我不相信它完全相关,也许这就是我编译它的方式?

encoder.out : decoder.o encoder.o encoderRunner.o  
g++ -ansi -Wall -g -o encoder.out decoder.o encoder.o encoderRunner.o  

decoder.o : decoder.cpp decoder.h 
g++ -ansi -Wall -g -c decoder.cpp

encoder.o : encoder.cpp encoder.h 
g++ -ansi -Wall -g -c encoder.cpp

encoderRunner.o : encoderRunner.cpp CPUTimer.h encoder.h decoder.h 
g++ -ansi -Wall -g -c encoderRunner.cpp

clean : 
rm -f encoder.out decoder.o  encoder.o  encoderRunner.o  

EDIT1:

    #pragma once
    #ifndef FrequencyTable_H_
    #define FrequencyTable_H_

    #include "FrequencyNode.h"

    //class FrequencyNode;

    class FrequencyTable
    {
    private:
        FrequencyNode *HighestNode;
        FrequencyNode *LowestNode;
    public:
        FrequencyTable();
        ~FrequencyTable();
        FrequencyNode * insert(unsigned char symbol); //USE THIS for new values in hash
        unsigned char * GetOrder();

    };


//#include "FrequencyTable.cpp"
#endif

Edit2(Ed的请求):

#include "FrequencyTable.h"
#include "FrequencyNode.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

请告诉我您需要的其他信息

1 个答案:

答案 0 :(得分:0)

我感觉它与编辑有关,但感谢Orbit的@Lightness Races和@πάνταῥεῖ我把我的makefile改写为

encoder.out : FrequencyNode.o FrequencyTable.o decoder.o encoder.o encoderRunner.o  
    g++ -ansi -Wall -g -o encoder.out FrequencyTable.o FrequencyNode.o decoder.o encoder.o encoderRunner.o  

FrequencyNode.o : FrequencyNode.cpp FrequencyTable.h
    g++ -ansi -Wall -g -c FrequencyNode.cpp

FrequencyTable.o : FrequencyTable.cpp FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c FrequencyTable.cpp

decoder.o : decoder.cpp decoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c decoder.cpp

encoder.o : encoder.cpp encoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c encoder.cpp

encoderRunner.o : encoderRunner.cpp CPUTimer.h encoder.h decoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c encoderRunner.cpp

clean : 
rm -f encoder.out FrequencyTable.o FrequencyNode.o decoder.o encoder.o encoderRunner.o

话虽如此,我知道你不必专门编译像iostream和stdlib.h这样的东西吗?这是因为他们使用内联或模板,任何人都可以将我链接到可以解释这一点的东西,或者自己解释一下吗?