我正在开发Android中的C ++项目。我想要实现的是在C ++中进行异步调用,然后通过JNI发回数据。这是一个简单的概念证明,但这也意味着我的C ++知识是有限的。
我已经完成了所有功能,但是想要让项目的C ++方面“更好”,我想实现一个观察者模式。 我用它作为教程: 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);
}
}
}
这可能是我很遗憾的事情,但我无法找到解决方案。
答案 0 :(得分:1)
你
#include <list>
所以'list'已经是一个定义的类型。选择一个不同的变量名称。
这就是不使用的好主意:
using namespace std;
答案 1 :(得分:1)
list
中的ASubject
属性重命名为其他内容,例如observedShops
(已在评论中指定)。using namespace std
。 答案 2 :(得分:0)
此外,如果使用boost :: signals2:
,观察者可以做得更短#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;
}