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

时间:2018-11-12 11:05:38

标签: c++ global-variables

我正在为嵌入式设备开发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来访问它。这也不是一个坏办法,但是我还是更喜欢全局变量。

2 个答案:

答案 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 );