Boost :: Сигналы для C ++ Копирование данных - PullRequest
2 голосов
/ 30 января 2011

Недавно у меня был класс, который выглядел как

class IGraphElement{
    typedef void FuncCharPtr(char*, int) ;
public:
    void Add(FuncCharPtr* f)
    {
        FuncVec.push_back(f);
    }
    void CastData(char * data, int length){
        for(size_t i = 0 ; i < FuncVec.size(); i++){
            char* dataCopy = new char[length];
            memcpy(dataCopy, data, length);
            FuncVec[i](dataCopy, length);
        }
    }
private:
    vector<FuncCharPtr*> FuncVec ;
};

Там я давал всем подписчикам указатель на там копию данных. Теперь я хочу, чтобы мой класс использовал повышение. Я понимаю, что с boost я буду свободен от typedef и vector, вместо этого у меня будет что-то вроде

class IGraphElement{

public:
  signal<void (char*, int) > SigB;

но как мне переписать CastData, чтобы сохранить контроль над данными, которые будут отправлены / переданы подписчикам?

1 Ответ

2 голосов
/ 30 января 2011

Вы делаете одну ошибку: вы предполагаете, что вызываемая вами функция освободит ресурсы (указатель char *), которые вы ей дадите.Вы должны сделать что-то вроде:

void CastData(char * data, int length){
    for(size_t i = 0 ; i < FuncVec.size(); i++){
        char* dataCopy = new char[length];
        memcpy(dataCopy, data, length);
        FuncVec[i](dataCopy, length);
        delete[] dataCopy;
    }
}

Теперь по поводу сигналов boost ::Сигнал просто содержит список указателей на функции.Если сигнал повышен, он просто вызывает каждую функцию в этом списке с указанными параметрами.Примерно так:

class signal { //non-templated version
public:
    void operator() (Params) 
    {
        for (FuncList::iterator i = f_.begin(); i != f_.end(); ++i) {
            (**i)(Params);
        }
    }
private:
    typedef ... Function;
    typedef std::vector<Function> FuncList;
    FuncList f_;
}

Поскольку параметры передаются напрямую, вам придется инкапсулировать вашу структуру данных в вспомогательный класс.Вы будете управлять памятью в конструкторе копирования.

...