- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想要一个存储接口(interface)(抽象类)和一组存储实现(SQLite、MySQL、Memcached..),用于存储已知类的对象并从存储中检索子集。
对我来说,清晰的界面是:
class Storable{int id; blah; blah; blah; string type;};
class Storage{
virtual Storage::iterator get_subset_of_type(string type) = 0;
virtual Storage::iterator end)_ = 0;
virtual void add_storable(Storable storable) = 0;
};
然后创建实现接口(interface)的 Storage 实现。现在,我的问题如下:
有什么提示吗?
最佳答案
如果你想要一个用于迭代的虚拟接口(interface),是这样的吗?
#include <iostream>
#include <iterator>
struct Iterable {
virtual int current() = 0;
virtual void advance() = 0;
protected:
~Iterable() {}
};
struct Iterator : std::iterator<std::input_iterator_tag,int> {
struct Proxy {
int value;
Proxy(const Iterator &it) : value(*it) {}
int operator*() { return value; }
};
Iterable *container;
Iterator(Iterable *a) : container(a) {}
int operator*() const { return container->current(); }
Iterator &operator++() { container->advance(); return *this; }
Proxy operator++(int) { Proxy cp(*this); ++*this; return cp; }
};
struct AbstractStorage : private Iterable {
Iterator iterate() {
return Iterator(this);
}
// presumably other virtual member functions...
virtual ~AbstractStorage() {}
};
struct ConcreteStorage : AbstractStorage {
int i;
ConcreteStorage() : i(0) {}
virtual int current() { return i; }
virtual void advance() { i += 10; }
};
int main() {
ConcreteStorage c;
Iterator x = c.iterate();
for (int i = 0; i < 10; ++i) {
std::cout << *x++ << "\n";
}
}
这不是一个完整的解决方案 - 我还没有实现 Iterator::operator==
或 Iterator::operator->
(如果需要后者包含的类型是类类型)。
我将状态存储在 ConcreteStorage 类中,这意味着我们不能在同一个 Storage 上同时拥有多个迭代器。因此可能不是 Iterable
是 Storage 的基类,而是需要 Storage 的另一个虚函数来返回一个新的 Iterable
。它只是一个输入迭代器这一事实意味着迭代器的拷贝都可以指向相同的 Iterable
,因此可以使用 shared_ptr
(以及 Itertable
应该有一个虚拟析构函数,或者 newIterator 函数应该返回 shared_ptr
,或者两者兼而有之)。
关于C++、多态和迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4247336/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!