1

我正在使用 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);
        }
    }
}

这可能是我想念的非常简单的事情,但我找不到解决方案。

4

3 回答 3

1

#include <list>

所以'list'已经是一个定义的类型。选择不同的变量名称。

这就是为什么最好不要使用:

using namespace std;
于 2014-02-07T13:23:28.923 回答
1
  • list将属性重命名ASubject为其他内容,例如observedShops(如您的评论中已命名的那样)。
  • 避免using namespace std在库代码中。
于 2014-02-07T13:28:11.110 回答
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;
}
于 2014-02-07T13:51:12.947 回答