读书人

纠结于一个基类声明派生类包含的有关

发布时间: 2012-03-01 10:25:46 作者: rapoo

纠结于一个基类声明,派生类包含的问题。。。
今天,在写完程序,编译的时候,出现如下错误:
。。。。。.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没有出现问题

C/C++ code
// genealogyNode.h -- 家谱结点类#ifndef GENEALOGYNODE_H#define GENEALOGYNODE_Hclass string;using std::string;class genealogyNode{};#endif




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

C/C++ code
// 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 将基类的类直接声明的时候。

C/C++ code
// 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 已跳过 ==========


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

[解决办法]
translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数
[解决办法]
你这个情况肯定是有函数没有实现的原因。 你仔细检查一下吧。

子类中不是声明虚函数,而是实现父类中的虚函数。
[解决办法]
1、class genealogy: public genealogyNode{};

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


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


3、translateInBooldType 方法你没定义吧



[解决办法]

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

读书人网 >C++

热点推荐