纠结于一个基类声明,派生类包含的问题。。。

时间:2022-09-08 09:09:55
今天,在写完程序,编译的时候,出现如下错误:
。。。。。.obj...............atal error LNK1120: 2 个无法解析的外部命令
然后,我上网找答案:

得到两个重要信息:
"
first.经过实验, 发现只要有两个cpp同时包含一个定义了变量的.h文件,就会提示错误.

second.有1.cpp和2.cpp, 1.cpp包含1.h,   2.cpp只包含2.h  但是2.h包含了1.h..  所以1.h中定义的变量编译的时候会在2.pp中有定义. 于是乎2.cpp翻译成的obj里也会有定义, 结果导致提示obj里重定义.
"

于是,我开始修改函数:
现有genealogy.h和genealogyNode.h两个文件:

genealogyNode.h没有出现问题
// genealogyNode.h -- 家谱结点类

#ifndef GENEALOGYNODE_H
#define GENEALOGYNODE_H

class string;
using std::string;

class genealogyNode{};
#endif




genealogy.cpp 将基类的头文件包含在派生类的头文件中。


// genealogy.h -- 家谱类

#ifndef GENEALOGY_H
#define GENEALOGY_H

#include "genealogyNode.h";
//class genealogyNode;  // <- 注意这里---------------------------------------
using std::string;

class genealogy: public genealogyNode
{
private:
genealogyNode * root; // 树根
genealogyNode * fence; // 定位梢
...}; // 单继承家谱的根结点
#endif


出现这个提示:

1>------ 已启动生成: 项目: Genealogy Management System, 配置: Debug Win32 ------
1>正在链接...
1>genealogy.obj : error LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall genealogy::translateDateToDateHelp(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?translateDateToDateHelp@genealogy@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V23@@Z),该符号在函数 "public: void __thiscall genealogy::input(void)" (?input@genealogy@@QAEXXZ) 中被引用
1>genealogy.obj : error LNK2019: 无法解析的外部符号 "public: char __thiscall genealogyNode::translateInBooldType(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?translateInBooldType@genealogyNode@@QAEDV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 "public: void __thiscall genealogy::update(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?update@genealogy@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) 中被引用
1>genealogyNode.obj : error LNK2001: 无法解析的外部符号 "public: char __thiscall genealogyNode::translateInBooldType(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?translateInBooldType@genealogyNode@@QAEDV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>G:\Genealogy Management System\Genealogy Management System\Debug\Genealogy Management System.exe : fatal error LNK1120: 2 个无法解析的外部命令
1>生成日志保存在“file://g:\Genealogy Management System\Genealogy Management System\Genealogy Management System\Debug\BuildLog.htm”
1>Genealogy Management System - 4 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========



genealogy.cpp 将基类的类直接声明的时候。


// genealogy.h -- 家谱类

#ifndef GENEALOGY_H
#define GENEALOGY_H

// #include "genealogyNode.h"; // <- 注意这里---------------------------------------

class genealogyNode; 
using std::string;

class genealogy: public genealogyNode{}; // 单继承家谱的根结点
#endif


1>------ 已启动生成: 项目: Genealogy Management System, 配置: Debug Win32 ------
1>正在编译...
1>mainFunction.cpp
1>g:\genealogy management system\genealogy management system\genealogy management system\genealogy.h(15) : error C2504: 'genealogyNode' : base class undefined
1>Generating Code...
1>Compiling...
1>main.cpp
1>g:\genealogy management system\genealogy management system\genealogy management system\genealogy.h(15) : error C2504: 'genealogyNode' : base class undefined
1>Generating Code...
1>Compiling...
1>genealogy.cpp
1>Generating Code...
1>生成日志保存在“file://g:\Genealogy Management System\Genealogy Management System\Genealogy Management System\Debug\BuildLog.htm”
1>Genealogy Management System - 2 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


晕啊~这个到底怎么解决好呢?问题根源是出现在哪呢?

6 个解决方案

#1


translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数

#2


引用 1 楼 ouyh12345 的回复:
translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数


translateDateToDateHelp()检查了一下,已经正确声明且定义了。
不过为什么,子类为什么要声明虚函数?

#3


你这个情况肯定是有函数没有实现的原因。  你仔细检查一下吧。

子类中不是声明虚函数,而是实现父类中的虚函数。

#4


1、class genealogy: public genealogyNode{}; 

这种代码必须要:#include "genealogyNode.h"
不能使用:class genealogyNode; 


2、error LNK2019:   是需要加入string头文件: #include <string>


3、translateInBooldType 方法你没定义吧


#5


的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。

#6


引用 5 楼 neicole 的回复:
的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。
可以写空函数,return 0;

#1


translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数

#2


引用 1 楼 ouyh12345 的回复:
translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数


translateDateToDateHelp()检查了一下,已经正确声明且定义了。
不过为什么,子类为什么要声明虚函数?

#3


你这个情况肯定是有函数没有实现的原因。  你仔细检查一下吧。

子类中不是声明虚函数,而是实现父类中的虚函数。

#4


1、class genealogy: public genealogyNode{}; 

这种代码必须要:#include "genealogyNode.h"
不能使用:class genealogyNode; 


2、error LNK2019:   是需要加入string头文件: #include <string>


3、translateInBooldType 方法你没定义吧


#5


的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。

#6


引用 5 楼 neicole 的回复:
的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。
可以写空函数,return 0;