成员变量是数组,通过初始化列表来初始化

需求 今天编译是报错: warning: list-initializer for non-class type must not be parenthesized, 报错的地方是对类中包含的成员变量是一个数组,然后使用了列表初始化。 解决 其实这个报错提示已经说的很清楚了,对非类使用了列表初始化并且加了括号。所以解决的方法也很简单,这种数组成员变量初始化使用列表初始化时,不要加括号就 ok 了。 class Sn74cbtlv3253 { //using FuncVoidVoid = void (*)(void); using FuncVoidBool = void (*)(bool); public: enum Index { kIndex1 = 0, kIndex2, kIndex3, kIndex4, }; public: Sn74cbtlv3253(FuncVoidBool s0, FuncVoidBool s1, FuncVoidBool oe) : s0_(s0), s1_(s1), oe_(oe) {}; void Switch(Index index); void Disconnect(); private: FuncVoidBool s0_; FuncVoidBool s1_; FuncVoidBool oe_; }; class Channel { public: enum ChannelIndex { kChannel1 = 0, kChannel2, kChannel3, kChannel4, kChannel5, kChannel6, kChannel7, kChannel8, kChannel9, kChannel10, kChannel11, kChannel12, }; public: Channel(); void Switch(ChannelIndex index); void Disconnect(); private: Sn74cbtlv3253 sn74cbtlv3253_[6][2]; }; Channel::Channel() : sn74cbtlv3253_{ {{Chip1S0PinControl, Chip1S1PinControl, Chip1En1PinControl}, {Chip1S0PinControl, Chip1S1PinControl, Chip1En2PinControl}}, {{Chip2S0PinControl, Chip2S1PinControl, Chip2En1PinControl}, {Chip2S0PinControl, Chip2S1PinControl, Chip2En2PinControl}}, {{Chip3S0PinControl, Chip3S1PinControl, Chip3En1PinControl}, {Chip3S0PinControl, Chip3S1PinControl, Chip3En2PinControl}}, {{Chip4S0PinControl, Chip4S1PinControl, Chip4En1PinControl}, {Chip4S0PinControl, Chip4S1PinControl, Chip4En2PinControl}}, {{Chip5S0PinControl, Chip5S1PinControl, Chip5En1PinControl}, {Chip5S0PinControl, Chip5S1PinControl, Chip5En2PinControl}}, {{Chip6S0PinControl, Chip6S1PinControl, Chip6En1PinControl}, {Chip6S0PinControl, Chip6S1PinControl, Chip6En2PinControl}}, } { Disconnect(); } 参考 list initializer for non class type must not be parenthesized werror...

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

结构体位域字节对齐

需求 有些时候,一些数据只占用几个 bit,而且是紧密排列的,所以就会考虑使用结构体位域,最好能再带上 union,使用起来会更加方便,但是位域是否字节对齐? 解决 经过测试,如果每一段的位域都在单个字节内,没有跨字节,那么就可以直接使用,字节是对齐的。否则每个跨字节的位域会多占用一个字节,会造成整体的数据错位。 参考 结构体(Struct)、联合体(Union)和位域 union联合体与内存对齐 C语言位域(位段)详解 UNION和位域的使用

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

成员变量是类的对象,通过初始化列表来初始化

需求 类中包含的成员变量是另外一个类的对象,如何对这种成员变量进行初始化? 解决 这种类对象成员变量初始化可以使用初始化列表。 class Hc595 { using FuncVoidVoid = void (*)(void); using FuncVoidBool = void (*)(bool); public: Hc595(FuncVoidVoid sck, FuncVoidVoid rck, FuncVoidBool bit, FuncVoidBool oe, FuncVoidVoid bit_delay) : sck_(sck), rck_(rck), bit_(bit), oe_(oe), bit_delay_(bit_delay) {}; void ShiftByte(uint8_t b); void Store(); void Display(bool en); private: FuncVoidVoid sck_; FuncVoidVoid rck_; FuncVoidBool bit_; FuncVoidBool oe_; FuncVoidVoid bit_delay_; }; class Led { public: enum LedIndex { kLed1 = 0, kLed2, kLed3, kLed4, kLed5, kLed6, kLed7, kLed8, kLed9, kLed10, kLed11, kLed12, }; public: Led(); void Set(LedIndex index, bool g, bool r, bool b); void Refresh(); void ClearData(); private: static const uint8_t kDataLength = 12; static const uint8_t kBufLength = 5; std::array<uint8_t, kDataLength> data_ {}; std::array<uint8_t, kBufLength> buf_ {}; Hc595 hc_; }; Led::Led() : hc_({SckRiseEdge, RckRiseEdge, DataBitPinControl, nullptr, nullptr}) { //hc_ = {SckRiseEdge, RckRiseEdge, DataBitPinControl, nullptr, nullptr}; hc_....

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

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

需求 类中包含的成员变量是引用,如何对这种引用成员变量进行初始化? 解决 这种引用成员变量初始化只能使用初始化列表。 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

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

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

<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