gpt4 book ai didi

c++ - 如何防止 C++ 编译器创建任何默认类成员?

转载 作者:行者123 更新时间:2023-11-30 03:30:04 24 4
gpt4 key购买 nike

我正在设计一些类来访问和控制微 Controller 的外围设备(adc、端口、usart 等)。该设备每个外围设备只有几个(在某些情况下只有一个)实例,因此我决定将每个外围设备表示为单态类。我的一个类的定义和用法是这样的:

usart.h

class usart {
public:
static void init() { /* initialize the peripheral */ }
static char read() { /* read a char from the input buffer */ }
static void write(char ch) { /* write a char to the output buffer */ }
// ... more member functions
};

ma​​in1.cpp

#include "usart.h"

int main()
{
usart::init();

char data;
while (true) {
data = usart::read();
usart::write(data);
}

}

但是上面定义 usart 类的方式并没有禁止用户做这样的事情:

ma​​in2.cpp

#include "usart.h"

int main()
{
// I don't want object construction
usart serial1;
usart serial2;

// neither assignment
serial1 = serial2;

// two objects representing the same hardware resource
// I don't want that
serial1.init();
serial2.write('r');
}

我知道从 C++11 开始我可以使用 delete 关键字来阻止编译器创建默认构造函数和函数,但我不知道编译器创建的这些默认值到底是什么。有复制构造函数、复制赋值、移动语义重载等。我需要在我的类中放置多少个删除(以及在哪些函数和构造函数中)?

更新:我知道我可以(也许应该)使用命名空间而不是类,但恐怕以后我需要将这些类(或命名空间)作为模板参数传递。据我所知,不可能将 namespace 用作模板参数,因此我选择使用具有静态成员的类而不是 namespace 。

最佳答案

struct cannot_exist {
cannot_exist()=delete;
~cannot_exist()=delete;
cannot_exist(cannot_exist const&)=delete;
cannot_exist(cannot_exist &&)=delete;
cannot_exist& operator=(cannot_exist const&)=delete;
cannot_exist& operator=(cannot_exist &&)=delete;
};

这是一个 C++ 为您生成的每个成员都被显式删除的类。 (你可以用更少的东西来做到这一点,但我不认为这一点不太明确)。

简单地继承自 cannot_exist 并且...您的类的实例不存在,也不会有编译器自动定义的任何成员函数。尝试调用它们将产生编译器错误。

但是,一旦您拥有一个不存在的类,请考虑使用命名空间

class usart:cannot_exist {
public:
static void init() { /* initialize the peripheral */ }
static char read() { /* read a char from the input buffer */ }
static void write(char ch) { /* write a char to the output buffer */ }
// ... more member functions
};

对比

namespace usart {
static void init() { /* initialize the peripheral */ }
static char read() { /* read a char from the input buffer */ }
static void write(char ch) { /* write a char to the output buffer */ }
// ... more member functions
};

关于c++ - 如何防止 C++ 编译器创建任何默认类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45216222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com