如何从多个对象访问同一个资源?
How to access same resource from multiple objects?
我对 C++ OOP 比较陌生,所以请耐心等待。
我正在使用为专用硬件(PCIE 模块)实现的 CAN 总线协议的第 3 方驱动程序。它带有一个 class,允许您实例化 can_read
和 can_write
对象。
这个库在我自己的程序中使用,我有一个 class 和上述 class 的 7 个实例需要访问在全局范围内定义的 can_write
对象在主文件中。
我遇到的问题是 can_write
对象。作为驱动程序级库,它从 can_write
对象访问相同的内存地址。如果我有一个按值获取 can_writer
的成员函数,则程序会在访问时崩溃并出现 "double free or corruption" 错误。
我现在通过引用传递 can_writer
对象("CanClass &a" 作为参数)并且它似乎有效,但是我不确定这是一个好的做法还是传统的做法它。这是正确的做法吗?如果不是,什么是正确的方法?任何参考资料甚至是简短的解释都会非常有帮助!
编辑:我必须避免创建 can_writer
的副本,因为它会读取到内存损坏,因此我的 Class Foo
的所有 7 个实例都需要访问完全相同的 can_write
实例.
您可以在 class 上使用单例模式 (https://en.wikipedia.org/wiki/Singleton_pattern) 的变体。
例如,您可以使用 get_can_write() 方法来检查 can_write 对象是否已实例化,如果是,则返回对该对象的引用,否则它会创建一个对象 can_write,保留对它的引用并 returns 它。
提供 can_write 和 can_read 的 class 看起来像这样:
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 看起来像:
class Foo{
public:
void doSomeRead(){
string s = Bar::get_can_read()->doSomething();
}
void doSomeWrite(){
Bar::get_can_write()->doSomething("test");
}
}
我对 C++ OOP 比较陌生,所以请耐心等待。
我正在使用为专用硬件(PCIE 模块)实现的 CAN 总线协议的第 3 方驱动程序。它带有一个 class,允许您实例化 can_read
和 can_write
对象。
这个库在我自己的程序中使用,我有一个 class 和上述 class 的 7 个实例需要访问在全局范围内定义的 can_write
对象在主文件中。
我遇到的问题是 can_write
对象。作为驱动程序级库,它从 can_write
对象访问相同的内存地址。如果我有一个按值获取 can_writer
的成员函数,则程序会在访问时崩溃并出现 "double free or corruption" 错误。
我现在通过引用传递 can_writer
对象("CanClass &a" 作为参数)并且它似乎有效,但是我不确定这是一个好的做法还是传统的做法它。这是正确的做法吗?如果不是,什么是正确的方法?任何参考资料甚至是简短的解释都会非常有帮助!
编辑:我必须避免创建 can_writer
的副本,因为它会读取到内存损坏,因此我的 Class Foo
的所有 7 个实例都需要访问完全相同的 can_write
实例.
您可以在 class 上使用单例模式 (https://en.wikipedia.org/wiki/Singleton_pattern) 的变体。
例如,您可以使用 get_can_write() 方法来检查 can_write 对象是否已实例化,如果是,则返回对该对象的引用,否则它会创建一个对象 can_write,保留对它的引用并 returns 它。
提供 can_write 和 can_read 的 class 看起来像这样:
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 看起来像:
class Foo{
public:
void doSomeRead(){
string s = Bar::get_can_read()->doSomething();
}
void doSomeWrite(){
Bar::get_can_write()->doSomething("test");
}
}