尝鲜c++踩坑合集

在家自学了一段时间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 
#include "../base/Object.h"

using namespace std;

template
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 {
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 {
public:
    Boolean(const bool b) {
        this->value = b;
    };
};

你可能感兴趣的:(尝鲜c++踩坑合集)