成员变量是引用,需要通过初始化列表来初始化

需求 类中包含的成员变量是引用,如何对这种引用成员变量进行初始化? 解决 这种引用成员变量初始化只能使用初始化列表。 class CommandProcess { public: CommandProcess(uint64_t& send_count); private: uint64_t& msg_send_count_; }; CommandProcess::CommandProcess(uint64_t& send_count) : msg_send_count_(send_count) { } 参考 C/C++ - 类中成员变量是引用

<span title='2023-05-10 14:51:00 +0800 CST'>2023-05-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;24 words&nbsp;·&nbsp;RamLife

weak_ptr 给构造函数引用参数必须是 const, 否则 error: cannot bind non-const lvalue reference of type to an rvalue of type

需求 A类掌握资源,使用 shared_ptr 来指向资源。其他 B,C,D 类使用资源,在构造函数中使用 weak_ptr 作为引用参数来接收资源指针。但是编译是会报错,报错信息: error: cannot bind non-const lvalue reference of type ‘std::weak_ptr<>&’ to an rvalue of type ‘std::weak_ptr<>’ 解决 解决办法很简单,在构造函数的参数 weak_ptr 前面加上 const. std::unique_ptr<CommandProcess> process_; std::shared_ptr<MessageQueue> send_; process_ = make_unique<CommandProcess>(send_); CommandProcess::CommandProcess(const weak_ptr<MessageQueue>& send) : send_(send) { } 参考 c++ 智能指针 传参 GotW #91 Solution: Smart Pointer Parameters C/C++面试:weak_ptr的使用场景 关于c ++:我应该通过引用传递shared_ptr吗? C++ shared_ptr 作为参数和返回值的比较 C++11:再谈shared_ptr,以及shared_ptr参数传递以及构造细节 C++非const引用问题:error: cannot bind non-const lvalue reference of type 【报错】关于{Error} cannot bind non-const lvalue reference of type ‘std::String&‘ to an rvalue……的一个解决方案...

<span title='2023-05-10 11:24:00 +0800 CST'>2023-05-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;81 words&nbsp;·&nbsp;RamLife

c++ error: is an inaccessible base of

需求 今天编译报错 error: is an inaccessible base of 解决 这个问题解决也非常简单,主要是默认的继承实际上是 private, 所以不能直接访问父类的成员,只要在继承时,用 public 进行标识即可。 class A { public: virtual int add(int a, int b); }; class B : public A { int add(int a, int b) { return a + b; } }; 参考 ‘A’ is an inaccessible base of ‘B’解决方案 C++ is an inaccessible base of 问题的解决方法

<span title='2023-05-10 10:30:00 +0800 CST'>2023-05-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;58 words&nbsp;·&nbsp;RamLife

c++ 子类构造初始化和父类构造初始化

需求 子类构造时会调用父类构造函数,具体如何匹配? 解决 父类 子类 匹配 null null 编译器默认生成 父类和子类的构造函数 null 无参 或 带参 调用编译器生成的父类构造函数 无参 没有显式调用父类构造函数 隐式调用父类无参构造函数 带参 必须显式调用父类构造函数 显式调用,否则编译会报错 带参且都有默认值 不用显式调用父类构造函数 可以隐式调用父类有默认值的带参构造函数 无参或带参 只需要实现父类构造函数中的任何一个即可 没有显式调用的情况下,默认调用父类无参构造函数 参考 c++ 子类构造函数初始化及父类构造初始化 C++子类构造函数初始化及父类构造初始化

<span title='2023-05-10 10:30:00 +0800 CST'>2023-05-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;31 words&nbsp;·&nbsp;RamLife

c++ struct 使用初始化列表无效

需求 今天使用统一初始化, {} 初始化 struct 之后,发现数据还是 0,没有初始化进去。 解决 经过网上查找之后,找到问题所在,列表初始化只能用于 aggregate, 而 class, struct, union 是否属于 aggregate, 需要满足以下几个条件: 无自定义构造函数 无私有或受到保护的非静态数据成员 无基类 无虚函数 类的定义中,不能有被 {} 和 = 直接初始化的非静态数据成员 // 自定义构造函数 struct Test { int x; int y; Test(int, int) {} }; // 保护非静态数据成员 struct Test { int x; int y; protected: int z; }; // 基类 struct base{}; struct Test : base { int x; int y; }; // 虚函数 struct Test { int x; int y; virtual void func(int, int) {} }; // 直接初始化 struct Test { int x; int y = 5; }; 所以只要注意以上几点即可,但是如果一定要这种情况下还要能使用列表进行初始化,也是可以的,需要如下定义:...

<span title='2023-04-27 11:45:00 +0800 CST'>2023-04-27</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;116 words&nbsp;·&nbsp;RamLife

子类调用父类被重写的虚函数

需求 今天需要在子类的虚函数中,调用父类被重写的同名方法,来完成部分工作。 解决 this->Command::ToString(cmd) 类似上面这样,可以通过 this 指针直接拿到父类的方法 Command::ToString . 编译器可以自动找到并调用父类的方法。 参考 C++——子类调用父类方法 c++父类虚函数被子类虚函数覆盖后,如何直接调用父类的虚函数? C++ | 子类对象调用父类函数

<span title='2023-04-19 18:20:00 +0800 CST'>2023-04-19</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;16 words&nbsp;·&nbsp;RamLife

查看 g++ 生成的虚函数表

需求 为了了解父子类对于虚函数表的影响,需要查看编译器生成的虚函数表。 解决 生成包含虚函数表的文件。 # g++ 8 之前 g++ -fdump-class-hierarchy vptr.cpp # g++ 8 之后 g++ -fdump-lang-class vptr.cpp 编译后,后产生一个 *.class 的文件,查看这个文件就可以看到子类的虚函数表了。 参考 c++ 查看对象内存布局 C/C++杂记:深入虚表结构 从编译器的辅助信息看c++对象内存布局 C++在gcc下的单继承,多继承,虚继承的内存布局 如何查看c++的虚函数表 C++知识积累:如何获取虚函数表以及虚函数地址

<span title='2023-04-19 18:06:00 +0800 CST'>2023-04-19</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

gitea pull requst 配置和使用

需求 gitea 中当某个仓库需要开发组多人使用时,就不太适合直接推送,而是应该使用 pull request 来管理合并了。使用时需要如何配置,才能满足多人请求,单人审核的权限需求,以及选用哪种方法进行合并? 解决 分支 master 只能从 release 合并过来。仓库设置 -> branch 开启分支推送保护,并且合并白名单设置只能指定的测试人员才能把 release 中的某个提交合并到 master 上去。 develop 不能直接推送,必须从其他的个人分支合并过来。也是开启分支推送保护,并且合并白名单只能由管理员才能合并过来。 权限 leader 管理员的权限需求为: 不能删除仓库 管理仓库的方方面面 管理从其他分支到 develop 分支的合并 解决方法即为: 在组织中创建 team, 命名为 admin , 设置为 spec repo 和 admin access 即可。 把允许管理的仓库添加给 admin team. 只要不是 own team, 就不能删除仓库。 把 admin team 加入到 develop 的合并白名单 把具体的 leader 加入到这个 admin team 中去。 develop 开发人员的权限需求为: 可以推送除了 master, develop, release 以外的分支 只访问允许的仓库 解决方法为...

<span title='2023-04-13 11:29:00 +0800 CST'>2023-04-13</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;145 words&nbsp;·&nbsp;RamLife

构造函数可以调用成员函数吗?

需求 构造函数中可以使用成员函数吗? 如何可以的话,就可以多个构造函数,通过调用同一个成员函数,来提高代码复用。 解决 构造函数可以直接调用成员函数,因为成员函数在编译期就已经定下来了,在运行期执行构造函数,调用成员函数没有问题。 参考 构造函数中调用成员函数??

<span title='2023-04-12 17:52:00 +0800 CST'>2023-04-12</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;7 words&nbsp;·&nbsp;RamLife

'undefined reference to vtable for'

需求 今天编译的时候,报错 undefined reference to vtable for. 解决 这个报错就是说的虚函数没有找到对应的定义。经过多次仔细的检查后,发现是某个暂时没有用到的纯虚函数,在子类中没有相应的函数体。给这个函数加上 {} 就可以暂时解决了。 参考 C++ 基类继承 出现undefined reference to vtable for Cxxx错误 QT cmake编译时总显示undefined reference to `vtable for xxx‘ C++ 从命令行编译一个Qt单个文件:对vtable的未定义引用

<span title='2023-04-11 18:06:00 +0800 CST'>2023-04-11</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife