Реализация шаблона Observer Переполнение стека

Я работаю над проектом C ++ в Android. Чего я хочу добиться, это сделать асинхронный вызов в C ++, а затем отправить данные обратно через JNI. Это простое доказательство концепции, но это также означает, что мои знания C ++ ограничены.

У меня все функциональные возможности работают, но, желая сделать сторону проекта на C ++ «лучше», я хочу реализовать шаблон Observer.
Я использовал это как учебник:
http://www.codeproject.com/Articles/328365/Understanding-and-Implementing-Observer-Pattern-in

После добавления всего (ofc, модифицированного в мой проект) я получаю следующую ошибку компиляции:
Аргумент шаблона 2 недопустим в ASubject.h в строке:

std::vector<PoCCplusplus*> list;

Тема h и cpp:

#pragma once
#include <vector>
#include <list>
#include <algorithm>
#include "PoCCplusplus.h"

class ASubject
{
//Lets keep a track of all the shops we have observing
std::vector<PoCCplusplus*> list;

public:
void Attach(PoCCplusplus *cws);
void Detach(PoCCplusplus *cws);
void Notify(char *xml);
};

#include "ASubject.h"
using namespace std;

void ASubject::Attach(PoCCplusplus *cws)
{
list.push_back(cws);
}
void ASubject::Detach(PoCCplusplus *cws)
{
list.erase(std::remove(list.begin(), list.end(), cws), list.end());
}

void ASubject::Notify(char *xml)
{
for(vector<PoCCplusplus*>::const_iterator iter = list.begin(); iter != list.end(); ++iter)
{
if(*iter != 0)
{
(*iter)->Update(xml);
}
}
}

Возможно, это что-то очень простое, что я упускаю, но я просто не могу найти решение для этого.

1

Решение

  • Переименовать list приписывать ASubject скажи что-нибудь еще observedShops (как уже упоминалось в вашем комментарии).
  • избежать using namespace std в коде библиотеки.
1

Другие решения

Вы

#include <list>

поэтому «список» уже является определенным типом. Выберите другое имя переменной.

Вот почему не стоит использовать:

using namespace std;
1

Также, наблюдатель можно сделать короче, если вы используете boost :: signal2:

#include <boost/signals2.hpp>
#include <boost/bind.hpp>

using namespace std;
using boost::signals2::signal;
using boost::bind;

struct Some {
void Update(char* xml) {
cout << "Update\n";
}
void operator()(char* xml) {
cout << "operator\n";
}
};

void func(char* xml) {
cout << "func\n";
}

int main() {
signal<void(char*)> s;
Some some;
Some other;
s.connect(some);
s.connect(bind(&Some::Update, other, _1));
s.connect(func);
char str[10] = "some str";
s(str);
return 0;
}
0
По вопросам рекламы [email protected]