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

neicole 2012-01-29 09:16:29
今天,在写完程序,编译的时候,出现如下错误:
。。。。。.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 已跳过 ==========


晕啊~这个到底怎么解决好呢?问题根源是出现在哪呢?
...全文
150 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwei197874 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 neicole 的回复:]
的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。
[/Quote]可以写空函数,return 0;
neicole 2012-01-30
  • 打赏
  • 举报
回复
的确是还有几个函数还没有定义,只是不是它提示的名字罢了,原来原因出现在这里,因为现在还没有将整个程序写完,然后,还打算写一部分,试编译一部分,之前还以为如果不需要用到的那些函数可以只声明不定义呢。。
程序员小迷 2012-01-29
  • 打赏
  • 举报
回复
1、class genealogy: public genealogyNode{};

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


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


3、translateInBooldType 方法你没定义吧


UnknowName 2012-01-29
  • 打赏
  • 举报
回复
你这个情况肯定是有函数没有实现的原因。 你仔细检查一下吧。

子类中不是声明虚函数,而是实现父类中的虚函数。
neicole 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数
[/Quote]

translateDateToDateHelp()检查了一下,已经正确声明且定义了。
不过为什么,子类为什么要声明虚函数?
ouyh12345 2012-01-29
  • 打赏
  • 举报
回复
translateDateToDateHelp函数没有实现
子类需要实现声明的虚函数

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧