lecture7

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 函数:)”

posted @ 2024-05-05 23:57  viewoverlook  阅读(3)  评论(0编辑  收藏  举报