lecture7

viewoverlook發表於2024-05-05

lecture7 class

類簡介

“Class: A programmerdefined custom type. An abstraction of an object or data type.”

類:由程式設計師定義的特殊型別。是對一種物件或者資料型別的抽象

但是這個問題已經有struct

struct 弊端:

  • 內部成員預設是public
  • 使用者需要初始化每個成員變數

“Recall: namespaces”

  • 將程式碼放到邏輯集合中來避免命名衝突
  • 每個類有自己的名稱空間
  • 呼叫/使用名稱空間的東西語法:namespace_name::name

“Destructors”

  • 刪除總是發生在類的解構函式中的
  • 解構函式定義:Class_name::~Class_name()
  • 不要顯式呼叫它。只有當Class_name 類越界時才會被呼叫。
  • 就像其他成員函式,在.h 中宣告,在.cpp 中實現

模版類

“Fundamental Theorem of Software Engineering: Any problem can be solved by adding enough layers of indirection.” 軟體工程基本定理:任何問題都可以透過新增足夠的間接層來解決。

“The problem with StrVector” StrVector 的問題

  1. 設計的vector 應該包含任何資料型別

    • 這可能會要建立多種類比如IntVector , DoubleVecor
  2. 如果不想為每個型別都單獨寫一個類呢?

    • 模版類

“Template Class: A class that is parametrized over some number of types. A class that is comprised of member variables of a general type/types.” 模板類:在一定數量的型別上引數化的類。由通用型別的成員變數組成的類。

“Templates don’t emit code until instantiated, so include the .cpp in the .h instead of the other way around!” 模板在例項化之前不會發出程式碼,因此將 .cpp 包含在 .h 中,而不是相反!

// vector.h
template <typename T>
class vector<T> {
T at(int i);
};

// vector.cpp
#include "vector.h"
template <typename T>
void vector<T>::at(int i) {
}
 
// main.cpp
#include "vector.h"
vector<int> a;
a.at(5);

以上虛擬碼在實現時會出現編譯錯誤

“What the C++ compiler does with non-template classes” C++ 編譯器對非模板類做什麼?

//main.cpp
#include "vectorint.h"
vectorInt a;
a.at(5);
  1. g++ -c vectorint.cpp main.cpp :編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 vectorint.h 中的所有函式都有已編譯的實現,main 可以訪問它們,因為它包含了 vectorint.h

  2. ““Oh look she used vectorInt::at, sure glad I compiled all that code and can access vectorInt::at right now!””

    “哦,看看她使用了 vectorInt::at,我很高興我編譯了所有這些程式碼並且現在就可以訪問 vectorInt::at!”

“What the C++ compiler does with template classes” C++ 編譯器對模板類做什麼?

//main.cpp
#include "vector.h"
vectorInt a;
a.at(5);
  1. g++ -c vectorint.cpp main.cpp :編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 但由於vector 是模版類,這不會建立任何程式碼

  2. ““Oh look she made a vector<int>! Better go generate all the code for one of those!””

    “哦,看她做了一個向量<int>!最好為其中之一生成所有程式碼!”

  3. ““Oh no! All I have access to is vector.h! There’s no implementation for the interface in that file! And I can’t go looking for vector<int>.cpp!””

    “不好了!我所能訪問的只是vector.h!該檔案中沒有該介面的實現!而且我無法去尋找 vector<int>.cpp!”

此時需要做出改變,將vector.cpp 的程式碼包含在vector.h

// vector.h
#include "vector.cpp"
template <typename T>
class vector<T> {
T at(int i);
};

// vector.cpp
#include "vector.h"
template <typename T>
void vector<T>::at(int i) {
}
 
// main.cpp
#include "vector.h"
vector<int> a;
a.at(5);
  1. g++ -c vectorint.cpp main.cpp :編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 但由於vector 是模版類,這不會建立任何程式碼

  2. ““Oh look she made a vector<int>! Better go generate all the code for one of those!””

    “哦,看她做了一個向量<int>!最好為其中之一生成所有程式碼!”

  3. ““vector.h includes all the code in vector.cpp, which tells me how to create a vector<int>::at function 😃””

    “vector.h 包含了 vector.cpp 中的所有程式碼,它告訴我如何建立一個 vector<int>::at 函式:)”