为有限的硬件资源创建全局变量,但使用私有构造函数



我正在为嵌入式设备开发C++库。我想创建一些类来处理一些硬件资源,比如UART外围设备。

我想做的是提供一些全局变量,例如UART1和UART2。但我也想保持构造函数的私有性,因为用户可以为不存在的UART创建一个新实例,或者更糟的是,复制现有实例中的一个,并试图从两个不同的对象访问它,这是没有意义的。

问题是,当在类外定义私有构造函数时,我无法访问它们,就像这样。

// uart.h
class Uart {
private:
Uart(int uart_num);
}
extern Uart uart1, uart2;
// uart.c
Uart uart1(1);
Uart uart2(2);

实现这一目标的好方法是什么?我一直在考虑像Uart &get_instance(int uart_num)这样的静态方法。这是一个不错的选择,但我更喜欢全局变量,我认为它们更干净、更优雅。如果这是最好的解决方案,我应该返回一个指向uart对象的指针或引用吗?

我也考虑过类的静态成员,但这会导致访问变量的字符串太长。我的库在它自己的命名空间中,所以用户必须以mylibnamespace::Uart::uart1而不是mylibnamespace::uart1的形式访问它。这不是一个坏的解决方案,但我仍然更喜欢全局变量。

我不明白为什么使用全局变量更好,我会使用更动态的pointeres或上面建议的工厂解决方案。但是,无论如何,我看到的提供没有构造函数(或私有(的全局变量的唯一方法是使用默认的复制构造函数从继承类创建。由于这不是一个指针或引用,您应该非常小心,这个UartPriv::UartPriv(int(构造函数只是用来填充Uart成员变量,而不应该在这里声明其他方法或变量。

// uart.h
class Uart{ 
};
Uart uart1, uart2;

// uart.c
class UartPriv : public Uart{
public:
UartPriv( int uart )
{
//initialize Uart members here
}
};
Uart Uart1 = UartPriv( 1 );
Uart Uart2 = UartPriv( 2 );

让我们创建一个完整的答案。我将避免在这里使用朋友声明。

class Uart {
public:
static Uart& get(int uart_num);
Uart(const Uart&) = delete;
Uart(Uart&&) = delete;
private:
Uart(int uart_num);
}
// This is the function you can use from the outside
Uart& get_Uart(int uart_num);
Uart Uart::get(int uart_num)
{
Uart uart0(0);
switch(uart_num):
{
case 0:
return uart0;
};
throw std::out_of_range("no such UART");
}
Uart& get_Uart(uart_num)
{
return Uart::get(uart_num);
}
Uart& foo = get_Uart(foo_num);

最新更新