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

问题描述 投票:1回答:1

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

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

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

我遇到的问题是can_write对象。作为一个驱动程序级库,它从can_write对象访问相同的内存地址。如果我有一个按值获取can_writer的成员函数,那么只要用“double free or corruption”错误访问它,程序就会崩溃。

我现在通过引用传递can_writer对象(参数的“CanClass&a”)它似乎有效,但是我不确定这是一个好的做法还是传统的做法。这是正确的做法吗?如果没有,那么正确的方法是什么?任何参考或甚至简短的解释都会非常有用!

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

c++ class object driver hardware
1个回答
1
投票

你可以在你的班级上使用单身模式(https://en.wikipedia.org/wiki/Singleton_pattern)的变体。

例如,您可以使用get_can_write()方法检查是否实例化了can_write对象,如果是,则返回对此对象的引用,否则它会创建一个对象can_write,保留对它的引用并返回它。

提供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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.