m0_54906215 2021-01-28 15:30 采纳率: 100%
浏览 84
已采纳

vs2019中,派生类的定义和实现放在两个文件中为什么会报错?

使用vs2019,学习类模板的时候遇到一些不能理解的报错,希望有大佬可以帮助解答

首先我定义了一个基类,内部的函数都是纯虚函数,放在文件CHAPTER4_1.h,代码如下:

#ifndef CHAPTER4_1
#define CHAPTER4_1

#include<iostream>
using namespace std;

template<class elemType>
class queue
{
public:
	virtual bool isEmpty()const = 0;
	virtual void enQueue(const elemType& x) = 0;
	virtual elemType deQueue() = 0;
	virtual elemType getHead()const = 0;
	virtual ~queue(){}
};

#endif // !CHAPTER4_1

之后定义派生类,放在CHAPTER4_6.h中,代码如下:

#ifndef CHAPTER4_6
#define CHAPTER4_6

#include<iostream>
using namespace std;
#include"CHAPTER4_1.h"

template<class elemType>
class linkQueue :public queue<elemType>
{
private:
	struct node {
		elemType data;
		node* next;
		node(const elemType& x, node* N = NULL) {
			data = x;
			next = N;
		}
		node():next(NULL){}
		~node(){}
	};
	node* front, * rear;
	
public:
	linkQueue();
	~linkQueue();
	bool isEmpty()const;
	void enQueue(const elemType& x);
	elemType deQueue();
	elemType getHead()const;
};

#endif // !CHAPTER4_6

然后在CHAPTER4_6.cpp文件中,实现派生类中的函数,代码如下:

#include<iostream>
using namespace std;
#include"CHAPTER4_6.h"

template<class elemType>
linkQueue<elemType>::linkQueue() {
	front = rear = NULL;
}

template<class elemType>
linkQueue<elemType>::~linkQueue() {
	node* tmp;
	while (front != NULL) {
		tmp = front->next;
		delete front;
		front = tmp;
	}
}

template<class elemType>
bool linkQueue<elemType>::isEmpty()const {
	if (front == NULL)return true;
}

template<class elemType>
void linkQueue<elemType>::enQueue(const elemType& x) {
	if (rear == NULL) {
		rear = front = new node(x);
	}
	else {
		rear->next = new node;
		rear = rear->next;
		rear->data = x;
	}
}

template<class elemType>
elemType linkQueue<elemType>::getHead()const {
	return front->data;
}

template<class elemType>
elemType linkQueue<elemType>::deQueue() {
	elemType value;
	if (rear == front && rear != NULL) {
		delete rear;
		rear = front = NULL;
	}
	else {
		node* tmp;
		value = tmp->data;
		tmp = front;
		front = front->next;
		delete tmp;
	}
	return value;
}

最后是main函数,放在main.cpp中:

#include<iostream>
#include"CHAPTER4_6.h"
using namespace std;

int main() {
	queue<int>* a;
	linkQueue<int> b;
	a = &b;
	for (int i = 0; i < 5; i++) {
		a->enQueue(i);
	}
	cout << a->getHead() << endl;
	a->deQueue();
	cout << a->getHead() << endl;
	return 0;
}

但是运行之后会报错,如果把派生类的实现放在CHAPTER4_6.h文件中就可以正常运行

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证