美文网首页
尝鲜c++踩坑合集_0neBean_NOTE

尝鲜c++踩坑合集_0neBean_NOTE

作者: 0neBean | 来源:发表于2020-02-12 16:48 被阅读0次

    在家自学了一段时间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;
        };
    };
    
    

    相关文章

      网友评论

          本文标题:尝鲜c++踩坑合集_0neBean_NOTE

          本文链接:https://www.haomeiwen.com/subject/wabxfhtx.html