[C++]类成员函数声明不定义报错

有一篇文章讨论过这个问题,如果是其他函数,当然只有被调用的时候才才会报错,如果这个函数是析构函数或者构造函数,那么如果声明了没定义,又声明了一个这个类的实例一定会报错。形如:

class Arithmetic
{
public:
    Arithmetic();
    ~Arithmetic();
      /*.......*/
};

转载于:https://www.cnblogs.com/drunknbeard/p/10139751.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 单元 每个单元只包含一个声明中不永许写实现成员函数不超过20个,需要被外界调用的成员函数放在Public外,其余的全部放在Proteced,明确的不想让继承者修改的话放在Private中。 包含的头文件 也就是#include <VCL.h> 在头文件应该包含该所需要的型的。如果cpp也包含了,那么头文件就不要在包含,使用Class vcl; 告诉头文件有些需要的已经在CPP文件中包含啦!另外对不再使用的包含文件要及时的清除出去,否则可能碰到连接出错的问题,bcb的连接提示少的可怜啊!就有苦头吃拉!还有要记得给自己加进的包含写注解啊!! 2 实现文件中 千万不要定义全局变量和全局函数,至于发什么问题啦,只有碰到了几十万的代码,五六个项目集合,一两百个单元所可能发生的问题。 那该怎么办了? 简单把它归到所在单元的声明中去。函数实现代码行不要超过200行 包括之间的空格.因为人的暂时记忆能力不强啊! 为什么文章要分段落啊! 就是人暂存上下文的关联的内存是有限的呀 3 组件的属性设置和数据库的字段表名: 一般下都在对象检查器中的设置。当调试过不去而你又忘记了设置的属性时的哭相,是多么地可气啊!而且BCB没有组件之间的比较,否则的话可以拖个同样的新组件来比一比到底哪里设置的不同! 所以没有办法只好麻烦些直接在代码中设置吧! 虽然很麻烦 却可以节省比较可观的时间呀! 要不就像 kateboy (老公)由于设置了ADOConnection 的Attrib里中的自动事务处理。每当退出程序时就报错!从早上跑到各大BCB的QQ群中求人帮助,只到最后吃晚饭才惊奇发现了毛病所在! 还有一次不知那各BCB老大自报家丑 说自己吸了5包烟抓改BUG直到凌晨时分,方发现了它,原来是书写错误。
C++】多⽂件程序结构 以前写⼀个C++多⽂件程序的时候经常为哪些东西应该放在.h⽂件⾥,哪些东西应该放在.cpp⽂件⾥⽽疑惑。稍有不慎就搞出⼀ 个"error:LNK2005 已经在*.obj中定义"的重复定义错误,就算解决了这个问题⾃⼰实际上也还是⼀知半解。最近去了解了C++多⽂件程 序结构的知识,才搞清楚了这些问题的本质。在此总结⼀下,如有错误,欢迎指出。 声明定义 ⾸先从声明定义说起。 声明是数据对象的和函数的描述。声明的作⽤就是让编译器知道实体的名字,以及其数据型或函数签名。如: external int x; //变量声明 void fun(); //函数声明 class A; //声明 定义则是实体本⾝,代表着实体在⼀个作⽤域的唯⼀描述。 如: int x; //变量定义 void fun() {…} //函数定义 class A {…}; //定义 因此,可以理解为,声明定义的引⽤,⽽定义是实体本⾝。 外部链接性与内部链接性 定义具有链接性。链接性分为内部链接和外部链接。 外部链接:外部链接的定义可被定义所处的翻译单元(.cpp)内看见,也可以被其他翻译单元引⽤。 具有外部链接性的: · ⾮inline函数。包括命名空间中⾮静态函数成员函数静态成员函数 · 静态成员变量总有外部链接。 · 命名空间(不包括⽆名命名空间)中⾮静态变量 内部链接:内部链接的定义只能在该定义所处的翻译单元内看见。 具有内部链接性的: · 所有的声明 · 命名空间(包括全局命名空间)中的静态⾃由函数、静态友元函数、静态变量的定义、const常量定义 · enum定义 · inline函数定义(包括⾃由函数和⾮⾃由函数) · (class、struct、union)的定义 注:在体中定义成员函数为内联(inline)函数,属于内部链接。 实质上声明没有链接性的概念,但可以理解成声明总是内部链接的,因为它只对它所在的翻译单元有效。如果我们把声明置于头⽂件,则由 于包含该头⽂件的每个翻译单元都独⽴复制了该声明(见下⽂预处理部分的说明),因此每个翻译单元都能"看到"这个声明。 预处理、编译和链接 C++中,源程序要被翻译成可执⾏⽂件,都要经过三个步骤:预处理、编译和链接。 预处理:阅读源程序,执⾏预处理指令,嵌⼊指定源⽂件。预处理指令以"#"号开始。如#include指令实现⽂件包含。当⼀个.cpp⽂件编 译前,它⾸先递归地包含头⽂件,形成⼀个含有所有必要信息的单个源⽂件,也就是⼀个翻译单元。 编译: 编译器每次翻译⼀个.cpp⽂件(翻译单元),并输出对象⽂件(.o或.obj)。对象⽂件含有.cpp⽂件内定义的所有函数编译后的机器 码,也包含.cpp⽂件内定义的全局变量和静态变量。此外,对象⽂件也可能含有未定义引⽤,这些未定义的引⽤就是该翻译单元内有声明, 但是在这个.cpp⽂件中没有定义函数和全局变量。 那么,这些没有定义的东西在哪?答案是这些东西定义在其他.cpp⽂件中。 要怎么找到呢?这就是链接器的任务了。 链接:有外部链接的定义可以在对象⽂件中产⽣外部符号,这些外部符号可以被所有其他的翻译单元访问,⽤来解析他们未定义的引⽤。链 接器的⼯作就是读取所有对象⽂件,并尝试解决对象⽂件之间的交差引⽤。如果成功,则产⽣可执⾏程序。当⽆法解决外部引⽤的时候,根 据情况链接器有两种报错: 1、当找不到引⽤的⽬标时,就产⽣"⽆法解决的外部符号"错误。 2、当找到两个或以上相同名字的实体(函数或变量时),就产⽣"符号被多重定义"错误。 因此,要让程序正确地链接,⾸先不能声明⼀个实体,却没有相应的定义。⽐如在A.cpp⾥⾯声明⼀个void fun();但在这个⽂件和其他⽂件 中都没有这个函数定义(也就是函数实现),这就产⽣"⽆法解决的外部符号"错误。同时,也不能重复地定义具有外部链接性的实 体。⽐如,在A.cpp⽂件⾥⾯定义int x,同时在B.cpp⾥⾯⼜定义⼀个int x。这样就出现"符号被多重定义"。 头⽂件 了解了上⾯⼏点知识,我们就可以理解和回答⼀些问题了。 (1)为什么不要把外部链接的定义放在头⽂件⾥⾯? 因为我们知道cpp在预编译的时候递归包含头⽂件,因此,如果⼀个头⽂件包含了⼀个外部链接的定义,其他包含它的.cpp⽂件都有⼀ 个相同的外部链接的定义。出现"符号被多重定义"也就不难理解了。要特别注意的是,的静态成员变量和⼀般的静态变量不⼀样,它具 有外部链接性,因此假设你在头⽂件中定义⼀个: class A { static int member; } 那么该静态成员变量的定义不能放在这个头⽂件⾥⾯。⽽是应该在某个.cpp⽂件⾥⾯写定义: int A::member; (2)有内部链接性的定义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值