gpt4 book ai didi

c++ - 如何强制调用类的全局实例的析构函数和构造函数(所以 "re-init"是类实例)

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

我有一个用 C++ 开发的固件项目,其中所有驱动程序都是用一个类制作的,没有简单的方法来修改它们。

驱动程序用于 uP 的内部外围设备,由类的全局实例实现;现在我必须修改该函数并允许在异常情况或类似情况下“重新初始化”驱动程序。

驱动程序的初始化是在驱动程序的构造函数中进行的(以这种方式实现,我无法修改它)并且没有明确的方法(特定方法或类似方法)来重新调用该函数.所以我需要强制记忆类的构造函数。丢失实例的所有信息不是问题,因此可以删除实例并重新创建。

例如,部分代码类似于(来自 Mbed 库):

class SPI {

public:

SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel=NC);

void format(int bits, int mode = 0);
[.....]

~SPI()

}

在代码的其他部分有一个全局实例:

SPI SPI_Master(P0_9, P0_8, P0_7);

void funcA(int b){
}

所以函数中有一种方法可以做类似的事情:

void SPIException(){
delete SPI_Master;
SPI_Master = new SPI (P0_9, P0_8, P0_7);
}

所以要强制调用构造函数?

还有一点澄清:

SPI SPI_Master(P0_9, P0_8, P0_7);

完全等同于:

SPI SPI_Master = new SPI(P0_9, P0_8, P0_7);

?

最佳答案

析构函数只是一个具有特殊名称的函数。像 instance.~T() 一样调用它。

void destroy()
{
SPI_Master.~SPI():
}

可以通过placement new强制在给定位置构造一个对象。

void reinit()
{
new(&SPI_Master) SPI(/*arguments go here*/);
}

关于c++ - 如何强制调用类的全局实例的析构函数和构造函数(所以 "re-init"是类实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322596/

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