Как получить доступ к одному и тому же ресурсу из нескольких объектов? - PullRequest
1 голос
/ 01 апреля 2019

Я относительно новичок в C ++ OOP, поэтому, пожалуйста, будьте терпеливы со мной.

Я использую драйверы сторонних производителей для протокола шины CAN, который реализован для выделенного оборудования (модуль PCIE).Он поставляется с классом, который позволяет создавать экземпляры can_read и can_write объектов.

Эта библиотека используется в моей собственной программе, где у меня есть класс и 7 экземпляров вышеупомянутого класса, которым требуется доступ к can_write объект, который определен в глобальной области видимости в основном файле.

У меня проблема с can_write объектом.В качестве библиотеки уровня драйвера он получает доступ к тому же адресу памяти из объекта can_write.Если у меня есть функция-член, которая принимает can_writer по значению, программа завершает работу всякий раз, когда к ней обращаются с ошибкой «двойное освобождение или повреждение».

Теперь я передаю объект can_writer по ссылке («CanClass & a«для аргумента), и это, кажется, работает, однако я не уверен, является ли это хорошей практикой или обычным способом сделать это.Это правильный способ сделать это?Если нет, то каков правильный путь?Любые ссылки или даже краткое объяснение были бы очень полезны!

РЕДАКТИРОВАТЬ: я должен избегать создания копий can_writer, так как это приведет к повреждению памяти, следовательно, все 7 экземпляров моего Class Foo должны получить доступ кточно такой же экземпляр can_write.

1 Ответ

1 голос
/ 01 апреля 2019

Вы можете использовать вариацию одноэлементного шаблона (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");
    }
}
...