【问题标题】:How to access same resource from multiple objects?如何从多个对象访问相同的资源?
【发布时间】:2019-04-01 07:33:23
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ class object driver hardware


    【解决方案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");
        }
    }
    

    【讨论】:

    • 感谢您的回复。请您再详细说明一下,这将如何解决问题?每个“can_write”对象都将访问相同的内存地址,我希望我的所有 7 个对象都可以访问那个相同的对象。
    • 我刚刚编辑了我的答案以添加一些示例,您可以如何做到这一点。
    • 请注意,您的 getter 返回指针,因此需要 -> 来访问成员
    • 感谢您的评论,我编辑我的答案更可靠。
    • 嗨,我想我并没有说得很清楚。 Can_writer 将访问硬件模块的相同寄存器,它的多个实例会导致模块错误和内存错误,我想使用我自己的 7 个对象中的同一个对象。
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2017-01-06
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2013-08-28
    • 2014-02-14
    相关资源
    最近更新 更多