c ++主文件混乱

时间:2011-07-30 06:06:51

标签: c++ header-files

作为我大学工作的一个小项目,我想在c ++上工作。

我的项目有很多* .h和相应的* .cpp文件。

然后我创建了一个具有main函数的主文件。 我包括了main中所需的所有头文件。 但它表明   [链接器错误]未定义引用`Class_Name :: Class_Constructor()' 以及其他功能。

然后我用源cpp文件替换头文件,它工作。 现在我认为应该是其他方式。和 无法解释为什么会发生这种情况。 因为我们通常只包含头文件而且有效。 通常我们只需要声明,现在我们需要在main中定义。 我是对的吗?

//请注意以下代码正在运行,但我想包含头文件而不是源文件。

的 这是代码:     //我的主文件

#include "MicroProcessor.cpp"

#include "Register/Register.cpp"

#include "Register/RegistersName.cpp"


#include <iostream>

using namespace std;

int main(){
MicroProcessor<REG_SIZE> mp;
mp.move(RegistersName::AX , RegistersName::BX);
cout << "hello";
return 0;
}

#ifndef MICROPROCESSOR_H
#define MICROPROCESSOR_H

#include "Register/RegistersName.h"
#include "Register/Register.h"
#include "Register/RegisterConstants.h"
using namespace std;

template<int regSize>
class MicroProcessor
{
private:
    Register<REG_SIZE> *registers;
    Register<FLAG_SIZE> *flags;
public:
    MicroProcessor();

    ~MicroProcessor();

    void move(RegistersName destination, RegistersName source);

};

#endif // MICROPROCESSOR_H

#ifndef REGISTER_H
#define REGISTER_H

/ *   这是注册类。   * /

#include <bitset>
#include "RegisterConstants.h"
using namespace std;

template <int regSize=REG_SIZE>
class Register
{
private:
       bitset<regSize> reg ;
   int carry ;
   int a;
public:
   // Constructor
   Register();

   // parameterized constructor
   // @param:
   // 
   Register(const string &binary);

   // destructor
   // get the bitset<> reg bit number position
   int get(int position)const;

   //reset the bit at position
   void reset(int position);

   //reset the bit at position
   void set(int position);


   // move the value of a register into another
   Register move(const Register &source, int startIndex=0, int len=REG_SIZE);

   // display the contents of the register but from last to first 
   // because lowest bit is stimulated as 0th index of register in memory.  
   void display();


   // return the size of the register bitset<> reg
   int size()const;

   // add two registers result = this + other, return result
   // but should be this = this + other, return this
   // this is more like operator +()
   Register add(const Register &other);

   // adds two registers and returns the sum of the registers without modifying any of them 
   Register operator+(const Register &other);     

   // add the bits of the register
   int addBits(int bit1, int bit2, int cary);

   // is carry is set after the operations
   bool isCarry();
};

#endif // REGISTER_H

#ifndef REGISTER_CPP
#define REGISTER_CPP

#include <iostream>

using namespace std;

#include "Register.h"

#include <bitset>

// Constructor
template<int regSize> Register<regSize> :: Register(){
carry = 0;       
}

/* other code */

#endif // REGISTER_CPP

CC = g++

HEADER =  Register/Register.h Register/RegistersName.h MicroProcessor.h 

SRC = Register/Register.cpp Register/RegistersName.cpp MicroProcessorTest.cpp 
MicroProcessor.cpp 

OUTPUT = out_executable.x

OBJS =  MicroProcessorTest.o MicroProcessor.o Register/Register.o       
Register/RegistersName.o 

.cpp.o: 
$(CC) -c $< 

MicroProcessorTest.o: MicroProcessorTest.cpp MicroProcessor.h Register/Register.h 
Register/RegistersName.h

MicroProcessor.o: MicroProcessor.cpp Register/Register.h Register/RegistersName.h

Register/Register.o: Register/Register.cpp Register/RegistersName.h

Register/RegistersName.o: Register/RegistersName.cpp

build:  $(OBJS)

$(CC) -o $(OUTPUT) $(OBJS)

./$(OUTPUT)

清洁:     -rm * .x * .o     cd注册     -rm * .x * .o

rebuild: clean build

----------

现在问题是:

我的模板参数总是int ..所以这应该意味着我应该做类似template_Class&lt; 16&gt;的事情。 ;在cpp文件中。

如果你看到我的代码就好了。我可以在运行时获得regSize因为我希望在我的RegisterClass中获得具有不同类型的不同大小的寄存器 位集。

如果我只能在编译时执行此操作而不是我应该执行#define regSize 16 而不是制作模板。

或者我应该只将所有代码放在模板文件中

3 个答案:

答案 0 :(得分:2)

您应该只在源代码中包含头文件。但是,您必须编译并链接项目中的所有.cpp文件。如果不这样做,编译器/链接器将无法找到标头中定义的函数的实现。


看到源代码后,我认为问题出在makefile中。改变这个:

.cpp.o: 
$(CC) -c $< 

为:

.o: 
$(CC) -c $< 

答案 1 :(得分:1)

您使用哪个编译器/ IDE来构建代码?检查具有Class_Name::Class_Constructor的源文件,并在构建过程中添加相同的源文件。

答案 2 :(得分:1)

  • 如果“main.cpp”是您编译的唯一源文件,那么这应该可以正常工作:
    // Effectively, you've created one, big, happy source file for the entire project
    #include "MicroProcessor.cpp"
    #include "Register/Register.cpp"
    #include "Register/RegistersName.cpp"
    #include 

    using namespace std;

    int main(){
      MicroProcessor mp;
      mp.move(RegistersName::AX , RegistersName::BX);
      cout 
  • 另一方面,如果编译“main.o”(使用#included'模块)和“Microprocessor.cpp”AND ...,那么在创建时应该“重复定义”链接错误.exe

  • 我的猜测是你的构建工具FAILED找不到(或者根本就没有构建)其他模块,因此“未定义引用”链接错误。因此,你的“#includes”没有冲突。