OOP——C++遇到的小坑

HW3 Personal Diaray

  • 重定向到文件时,需要cin.clear(),详见Diary.cpp中的Read_Diary函数
  • 字符串格式pathfreopen使用时要加入path.cstr(),详见pdadd.cpp中的path调用

HW6 Vector

  • 类模板编写的时候,成员函数的实现要写在测试函数中(类模板,是不支持,声明,定义,测试分开写的,会出现链接编译错误)
    ref:https://blog.csdn.net/weixin_45031801/article/details/134358472
  • mallocremalloc的使用方便了动态申请数组,解决了数组超限的问题

MiniSQL

6-RECOVERY MANAGER

  1. map相关

    • first,second变量

      c++ 里面的map容器的迭代器first、second用法
      例:
      map<string, int> m_stlmap;
      m_stlmap[“xiaomi”] = 88;
      auto mpit = m_stlmap.begin();
      first会得到Map中key的有效值,
      second会得到Map中value的有效值。
      所以
      mpit ->first; // 得到是 string 值是 “xiaomi”
      mpit ->second; //得到是 int 值是 88

    对于unordered_map亦是如此

    • begin(),end()
      在C++中,std::map是一个关联容器,它提供了一种键-值对的存储方式,并按照键的排序顺序进行自动排序。map类提供了一系列的成员函数,其中包括begin()和end()函数,用于获取指向map容器中第一个元素和最后一个元素之后位置的迭代器。

      • map::begin()函数
        1
        2
        iterator begin();
        const_iterator begin() const;

      这个函数返回一个指向map容器中第一个元素的迭代器。如果map为空,返回的迭代器等于end()函数返回的迭代器,表示指向map容器的末尾。

      例如:

      1
      2
      3
      std::map<int, std::string> myMap;
      // 添加一些元素到myMap中
      std::map<int, std::string>::iterator it = myMap.begin();

      在这个例子中,it是一个指向myMap中第一个元素的迭代器。

      • map::end()函数
        1
        2
        iterator end();
        const_iterator end() const;
        这个函数返回一个指向map容器中最后一个元素之后位置的迭代器,也就是尾后迭代器。尾后迭代器不指向具体的元素,而是表示map容器的末尾。

      例如:

      1
      2
      3
      std::map<int, std::string> myMap;
      // 添加一些元素到myMap中
      std::map<int, std::string>::iterator it = myMap.end();

      在这个例子中,it是一个指向myMap中最后一个元素之后位置的迭代器,表示尾后迭代器

    • insert 和 emplace
      参考博客

  2. 共享指针相关

    1
    2
    3
    4
    //调用拷贝构造函数
    std::shared_ptr<int> p4(p3);//或者 std::shared_ptr<int> p4 = p3;
    //调用移动构造函数
    std::shared_ptr<int> p5(std::move(p4)); //或者 std::shared_ptr<int> p5 = std::move(p4);

    如上所示,p3 和 p4 都是 shared_ptr 类型的智能指针,因此可以用 p3 来初始化 p4,由于 p3 是左值,因此会调用拷贝构造函数。需要注意的是,如果 p3 为空智能指针,则 p4 也为空智能指针,其引用计数初始值为 0;反之,则表明 p4 和 p3 指向同一块堆内存,同时该堆空间的引用计数会加 1。

    1
    std::shared_ptr<int> p3 = std::make_shared<int>(10);

    同时,C++11 标准中还提供了 std::make_shared 模板函数,其可以用于初始化 shared_ptr 智能指针,例如:

    注意,同一普通指针不能同时为多个 shared_ptr 对象赋值,否则会导致程序发生异常。

  3. 结构体构造函数相关
    在C++中,结构体(struct)和类(class)在语法上非常相似,它们都可以拥有成员变量和成员函数,包括构造函数。结构体和类的主要区别在于默认的访问权限:结构体的成员默认是公共的(public),而类的成员默认是私有的(private)。以下是几种常见的构造函数写法:

    • 默认构造函数
      不接收任何参数,用于创建对象时不进行任何初始化。
    1
    2
    3
    4
    5
    struct MyStruct {
    MyStruct() {
    // 初始化代码
    }
    };
    • 参数化构造函数
      接收参数,用于初始化对象的成员变量。
    1
    2
    3
    4
    struct MyStruct {
    int x;
    MyStruct(int val) : x(val) {} // 使用初始化列表
    };
    • 带默认参数的构造函数
      构造函数的参数有默认值,调用时可以不提供这些参数。
    1
    2
    3
    4
    struct MyStruct {
    int x, y;
    MyStruct(int x = 0, int y = 0) : x(x), y(y) {} // 默认参数和初始化列表
    };
    • 委托构造函数(构造函数重载)
      结构体可以有多个构造函数,它们可以调用其他构造函数来减少代码重复。
    1
    2
    3
    4
    5
    struct MyStruct {
    int x, y;
    MyStruct(int x) : MyStruct(x, 0) {} // 委托给另一个构造函数
    MyStruct(int x, int y) : x(x), y(y) {}
    };
    • 复制构造函数
      用于复制已有对象来创建新对象。
    1
    2
    3
    4
    struct MyStruct {
    int x;
    MyStruct(const MyStruct& other) : x(other.x) {} // 复制构造函数
    };
    • 移动构造函数
      用于移动资源,避免不必要的复制。
    1
    2
    3
    4
    5
    6
    struct MyStruct {
    int* x;
    MyStruct(MyStruct&& other) : x(other.x) { // 移动构造函数
    other.x = nullptr;
    }
    };
    • 构造函数的组合
      可以将多种构造函数的特性结合起来。
    1
    2
    3
    4
    5
    6
    struct MyStruct {
    int x, y;
    MyStruct() : MyStruct(0, 0) {} // 默认构造函数,委托给参数化构造函数
    MyStruct(int x) : MyStruct(x, 0) {} // 单参数构造函数,委托给双参数构造函数
    MyStruct(int x, int y) : x(x), y(y) {} // 参数化构造函数
    };
    • 私有/受保护构造函数
      限制构造函数的访问,通常用于单例模式或防止外部直接创建对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Singleton {
    Singleton() {}
    // 私有构造函数,外部不能直接创建实例
    };

    struct ProtectedStruct {
    protected:
    ProtectedStruct() {} // 受保护的构造函数,只能在派生类中创建实例
    };
    • 删除的构造函数(C++11及以后)
      可以显式删除构造函数,使其不能被调用。
    1
    2
    3
    struct MyStruct {
    MyStruct() = delete; // 删除默认构造函数
    };

    这些构造函数的写法可以根据需要进行组合和定制,以满足不同的初始化需求。

C++短学期

EasyX库安装

OpenGL对新手不太友好,我们这里选择EasyX进行游戏设计
由于EasyX安装只能识别VS,我们这里参考博客进行Clion+EasyX的环境搭配
参考博客: https://codebus.cn/bestans/easyx-for-mingw

文章中提到:

链接选项增加:-leasyx,这样可以在编译的时候链接 libeasyx.a 库文件。每个项目都要这样设置一次,然后编译即可。
我们这里使用Cmake工具,避免使用了对于含EasyX库的项目都要进行对编译链的修改。

1
2
3
4
5
6
7
cmake_minimum_required(VERSION 3.27)
project(Doc_n_Me)

set(CMAKE_CXX_STANDARD 17)
link_libraries(libeasyx.a)
add_executable(Doc_n_Me main.cpp)

cmake

参考博客: