作为我大学工作的一个小项目,我想在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 而不是制作模板。
或者我应该只将所有代码放在模板文件中
答案 0 :(得分:2)
您应该只在源代码中包含头文件。但是,您必须编译并链接项目中的所有.cpp
文件。如果不这样做,编译器/链接器将无法找到标头中定义的函数的实现。
看到源代码后,我认为问题出在makefile中。改变这个:
.cpp.o:
$(CC) -c $<
为:
.o:
$(CC) -c $<
答案 1 :(得分:1)
您使用哪个编译器/ IDE来构建代码?检查具有Class_Name::Class_Constructor
的源文件,并在构建过程中添加相同的源文件。
答案 2 :(得分:1)
// 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”没有冲突。