“函数...已有主体”问题解决

错误原因:在.h文件中,在函数定义后面加上{},而.cpp文件已有此函数的具体实现。

正确写法:如果函数的具体实现已经写在.cpp文件中,则.h文件中应写为:

返回值  函数名(); //√
返回值  函数名(){}; //如果.cpp文件中有此函数的具体实现,则会报错。

分析:正是因为.cpp文件已存在对该函数的具体实现,会与.h文件中空函数体{}冲突,所以会报错“函数...已有主体”。

补充:在.h中,函数可以有函数体。

int Height() { return Height(root); }; //√。这时,.cpp文件无需再对该函数进行定义。

### 已有函数主体的修改与调用 在 C++ 中,如果已经存在某些函数主体并希望对其进行调整或扩展,则可以通过多种方式实现这一目标。以下是几种常见的方法: #### 方法一:通过重载现有函数 当需要保持原有函数的功能不变而新增其他功能时,可以利用函数重载机制来定义新的版本。这允许开发者在同一作用域下使用相同的名字表示不同行为的函数。 例如,在下面的例子中展示了如何基于参数列表的不同来创建 `add` 函数的新变体[^1]: ```cpp int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } ``` 上述代码片段说明了即使两个函数都命名为 `add`,但由于它们接受不同类型的数据作为输入,编译器能够区分这些函数,并正确执行相应的逻辑。 #### 方法二:继承与覆盖(Override) 对于面向对象编程中的成员函数而言,除了简单的函数重载外还可以考虑子类化以及虚函数的应用场景。假如父类中有声明为虚拟的方法,则可以在派生类里重新定义该方法的行为从而达到定制目的。 这里需要注意的是只有标记成virtual的关键字才会支持动态绑定进而使得基指针指向实际类型的实例运行期决定具体要调用哪个版本的操作[^2] : ```cpp class Base { public: virtual void show() { std::cout << "Base class\n"; } }; class Derived : public Base{ public: void show() override{ std::cout<< "Derived class \n"; } }; ``` 在这个例子当中我们看到尽管变量p是指向基础类别型但是由于采用了多形特性因此最终打印出来的将是衍生自类别里的讯息。 #### 方法三:模板泛型技术应用 另外一种强大的工具就是运用模板元程序设计技巧来自动生成适用于各种数据结构上的算法或者容器操作等功能模块。这种方式不仅限于数值运算还包括字符串处理等等领域都可以广泛适用。 如下所示即是一个通用交换两数值得简单示范: ```cpp template<typename T> void swap(T &a,T&b){ T temp=a;a=b;b=temp;} ``` 此段落描述了一个非常灵活的做法因为它并不局限于特定种类别的资料而是几乎能适应任何可赋值复制的对象类型之上. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值