c++ - header 多重重新定义

我知道这个问题已经死了,但是我已经做了相当多的研究,到目前为止没有任何帮助。是的,我有很多头文件保护程序。据我所知,不需要内联每个函数都在一个类中。我有一个coderrunner.cpp,其中包括encoder.h和decoder.h,encoder.h和decoder.h都包含了频率表.h,这是所有事情都破灭的地方,编译器说,频率表中的所有内容都是重新定义的。这是恰好来自于我与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

等等...
  • 我已经/添加了 header 防护,包括一次尝试#pragma
  • 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  
    

    编辑1:
        #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;
    

    请让我知道您还需要什么其他信息
  • 最佳答案

    我感觉到它与编译有关,但是由于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之类的东西?是因为他们使用内联还是模板,任何人都可以将我链接到可以对此进行解释或自己进行解释的内容吗?

    关于c++ - header 多重重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357636/

    相关文章:

    java - 无法编译Java代码

    c++ - 默认构造函数编译错误,预期的ID不合格

    c++ - 模板化 BST 方法的返回值问题

    c++ - 编译用户定义的类时出现编译器错误

    c++ - '' *2之前的解析错误

    oracle - Oracle函数编译错误PLS-00103(遇到符号 “SELECT”…)

    android - Android代码抛出错误

    java - 出现错误: No enclosing instance of type **** is

    exception - 捕获 block 避免编译错误?

    java - 未知的Java类错误