在家自學了一段時間c++.其中遇到了一些問題,及思考過程,記錄下來和大家探討一下.
-
1: c++的模板不支持分離文件編譯,導致模板類定義了方法的實現(xiàn)寫到了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++有一些特殊的函數(shù)是不能被繼承的,有一部分編譯器會自動生成默認的函數(shù),覆蓋繼承的函數(shù),這部分特殊的函數(shù)包括:
構造函數(shù)
,析構函數(shù)
還有c++標準沒有提到的,c++編譯器會自動生成覆蓋繼承來的賦值運算符重載
,所以當你想通過面向對象來封裝運算符重載時,別忘了在派生類中重新重載賦值運算符.
-
3 如果你想用自定義數(shù)據(jù)類型重載賦值運算符,那你得用隱式轉換,直接重載賦值操作符,這又是什么騷操作? 看下面代碼:
老子明明重載了賦值運算符,可是在賦值時依然報錯
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;
};
};