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

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

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

<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

c++ 用于解析 xml 文件的第三方库

需求 在 C++ 环境下,能够解析 xml 文件的第三方库? 解决 经过尝试之后,比较合适的是 tinyxml 这个第三方库,可以创建,插入,删除,修改,解析 xml 文件。 参考 C/C++ 使用 tinyxml库 操作XML格式文件(创建、插入、删除、修改、解析) C++解析XML TinyXML Files

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

c++ utf8 和 utf16 转换

需求 有一个 xml 文件,是 utf16-be 格式的,直接使用 firefox 打开不对,所以考虑先转码为 utf8 然后再打开。 解决 int Utf16leToUtf8(uint8_t* dest, int dest_size, int* dest_len, uint16_t* src, int src_len) { uint8_t* dest_start = dest; uint8_t* dest_end = dest + dest_size; //uint16_t* src_end = (uint16_t*)((uint8_t*)src + src_len); uint16_t* src_end = src + src_len; while (src < src_end) { if (*src < UTF16_2 && dest + 1 < dest_end) { //0000 - 007F : 0xxxxxxx *dest++ = (uint8_t)*src; } else if(*src >= UTF16_2 && *src < UTF16_3 && dest + 2 < dest_end) { //0080 - 07FF : 110xxxxx 10xxxxxx *dest++ = ((*src >> 6) & 0x1F) | 0xC0; *dest++ = (*src & 0x3F) | 0x80; } else if(*src >= UTF16_3 && *src < UTF16_4 && dest + 3 < dest_end) { //0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx *dest++ = ((*src >> 12) & 0x0F) | 0xE0; *dest++ = ((*src >> 6) & 0x3F) | 0x80; *dest++ = (*src & 0x3F) | 0x80; } else if(*src >= UTF16_4 && *src < UTF16_4_SECOND && dest + 4 < dest_end) { // 代理项对部分(4字节表示) //0001 0000 - 001F FFFF : 1111 0xxx 10xxxxxx 10xxxxxx 10xxxxxx // 从代理项对到UNICODE代码点转换 // 1、从高代理项减去0xD800,获取有效10bit // 2、从低代理项减去0xDC00,获取有效10bit // 3、加上0x10000,获取UNICODE代码点值 uint16_t high_sur = *src++; uint16_t low_sur = *src; uint32_t code_point = high_sur - UTF16_4; code_point <<= 10; code_point |= low_sur - UTF16_4_SECOND; code_point += UTF16_4_PLUS; *dest++ = (code_point >> 18) | 0xF0; *dest++ = ((code_point >> 12) & 0x3F) | 0x80; *dest++ = ((code_point >> 06) & 0x3F) | 0x80; *dest++ = (code_point & 0x3F) | 0x80; } else { break; } src++; } *dest = 0; *dest_len = dest - dest_start; if (src < src_end) { return -1; } return 0; } int Utf16beToUtf8(uint8_t* dest, int dest_size, int* dest_len, uint16_t* src, int src_len) { uint16_t le[src_len]; union { uint16_t s; uint8_t buf[sizeof(uint16_t)]; } data; for (int i = 0; i < src_len; i++) { /* uint8_t * d = (uint8_t *)(src + i); uint8_t tmp = *d; *d = *(d + 1); *(d + 1) = tmp; */ data....

<span title='2023-04-10 16:51:00 +0800 CST'>2023-04-10</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;367 words&nbsp;·&nbsp;RamLife

c++ 类中初始化另外一个类只可以用 {} 和 =

需求 在类中初始化另外一个类使用什么符号呢? () 可以吗? 解决 在类中给成员变量初始化只能用 {} 和 = ,不可以使用 (). 一般推荐 {} 这样的统一初始化形式。 参考 为何在类中初始化另一个类会出错? Non-static data members 构造函数与成员初始化器列表

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

c++ 获取类的名称

需求 希望获取类的名称. 解决 使用 typeid 即可。 #include <typeinfo.h> std::string getClassName() { return typeid(*this).name(); } 参考 获取类实例的类名(c++)

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