如何从多个对象访问同一资源?

时间:2019-04-01 07:33:24

标签: c++ class object driver hardware

我对C ++ OOP还是比较陌生,所以请耐心等待我。

我正在使用针对专用硬件(PCIE模块)实现的CAN总线协议的第三方驱动程序。它带有一个类,允许您实例化can_readcan_write对象。

该库在我自己的程序中使用,在该程序中,我有一个类和上述类的7个实例,它们需要访问在主文件的全局范围内定义的can_write对象。

我遇到的问题是can_write对象。作为驱动程序级库,它正在从can_write对象访问相同的内存地址。如果我有一个按值取can_writer的成员函数,则每次访问时都出现“双重释放或损坏”错误,程序就会崩溃。

我现在通过引用传递can_writer对象(该参数为“ CanClass&a”),并且似乎可行,但是我不确定这是一种好的做法还是常规的做法。这是正确的做法吗?如果没有,正确的方法是什么?任何参考甚至简短的解释都将非常有帮助!

编辑:我必须避免创建can_writer的副本,因为它会读取到内存损坏,因此,我的Class Foo的所有7个实例都需要访问can_write的完全相同的实例。 / p>

1 个答案:

答案 0 :(得分:1)

您可以在课堂上使用单例模式的变体(https://en.wikipedia.org/wiki/Singleton_pattern)。

例如,您可以具有一个get_can_write()方法,该方法检查can_write对象是否已实例化,如果是,则返回对该对象的引用,否则它将创建一个对象can_write,保留对该对象的引用并返回它。 / p>

您提供can_write和can_read的类如下所示:

class Bar {
private:
    static can_write* cw;
    static can_read* cr;

public:
    static can_write* get_can_write(){
        if(cw == null)
            cw = new can_write;
        return cw;
    }

    static can_read* get_can_read(){
        if(cr == null)
            cr = new can_read;
        return cr;
    }
}

使用can_write和can_read的类如下所示:

class Foo{
public:
    void doSomeRead(){
        string s = Bar::get_can_read()->doSomething();
    }

    void doSomeWrite(){
        Bar::get_can_write()->doSomething("test");
    }
}