在家自学了一段时间c++.其中遇到了一些问题,及思考过程,记录下来和大家探讨一下.
-
1: c++的模板不支持分离文件编译,导致模板类定义了方法的实现写到了cpp文件里不生效,这没人告诉你,估计你也很难猜到吧.
如果你一定需要使用模板进行泛型编程,还要保留.h头文件,可以这么写:
头文件里只引用.cpp文件,包含模板的代码全部写到.cpp文件里.我试过了,不会影响泛型的继承
xxx.h
:
//
// Created by 0neBean on 2020/1/11.
//
#ifndef DATA_STRUCTURE_OPERATOR_H
#define DATA_STRUCTURE_OPERATOR_H
#include "xxx.cpp"
#endif //DATA_STRUCTURE_OPERATOR_H
xxx.cpp
:
#include <iostream>
#include "../base/Object.h"
using namespace std;
template<typename T, class C>
class Operator : public Object {
public:
bool operator==(T obj) {
cout << "== type" << endl;
return this->value == obj;
};
......
-
2: c++ 操作符的重载继承问题,所有可重载的操作符都支持继承,除了赋值运算符,c++有一些特殊的函数是不能被继承的,有一部分编译器会自动生成默认的函数,覆盖继承的函数,这部分特殊的函数包括:
构造函数
,析构函数
还有c++标准没有提到的,c++编译器会自动生成覆盖继承来的赋值运算符重载
,所以当你想通过面向对象来封装运算符重载时,别忘了在派生类中重新重载赋值运算符.
-
3 如果你想用自定义数据类型重载赋值运算符,那你得用隐式转换,直接重载赋值操作符,这又是什么骚操作? 看下面代码:
老子明明重载了赋值运算符,可是在赋值时依然报错
Boolean .cpp
#include "../operator/BoolOperator.h"
class Boolean : public BoolOperator<bool, Boolean> {
public:
Boolean& operator=(bool b) {
this->value = b;
return *this;
};
};
main.cpp
#include "dependency/dependency.h"
using namespace std;
int main() {
Boolean b = false; //这里运算符报错
return 0;
}
Boolean .cpp
必须要这样写,用隐式转换
#include "../operator/BoolOperator.h"
class Boolean : public BoolOperator<bool, Boolean> {
public:
Boolean(const bool b) {
this->value = b;
};
};