我正在为嵌入式设备开发C ++库。我想创建类来处理一些硬件资源,例如UART外设。
我要做的是提供一些全局变量,例如UART1和UART2。但是我也想让构造函数保持私有,因为用户可以为不存在的UART创建一个新实例,甚至更糟的是,复制一个现有实例并尝试从2种不同的实例中访问它,这是没有意义的。对象。
问题在于,像这样在类外部定义私有构造函数时,我无法访问它们。
// 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
来访问它。这也不是一个坏办法,但是我还是更喜欢全局变量。
答案 0 :(得分:0)
让我们创建一个完整的答案。我将避免在这里使用朋友声明。
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);
答案 1 :(得分:0)
我不明白为什么使用全局变量对您会更好,我会使用更具动态性的指针或上面建议的工厂解决方案。但是,无论如何,我看到的不提供构造函数(或私有)的全局变量的唯一方法是使用默认拷贝构造函数从继承类创建。由于这不是指针或引用,因此您应该非常小心,此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 );