100分求一个STL问题答案,另一个50分链接在VC++区,问题解决了一起给分

IONPhantom 2010-08-04 02:19:07
题目是这样的,我需要一个这样的接口类 MyInterfaceClass(只是一个示例型的伪代码)

class TempClass
{
};

class MyInterfaceClass
{
public:
iterator Insert(TempClass *pObject)=0;
iterator Earse(TempClass *pObject)=0;
iterator Find(...)=0;
iterator Begin()=0;
iterator End()=0;
};

在实现MyInterfaceClass的派生类的时候有一个条件,派生类允许用map/list/vector中任意一个容器进行存储,那么这个MyInterfaceClass的iterator可怎么定义阿?
主要问题是不限制用哪种容器的时候iterator是对应于各自容器的,怎么能让把他们的信息掩埋起来只暴露出一个MyInterfaceClass::iterator呢?

这个帖子50分,另一个50分链接在VC++区,问题解决了一起给分
...全文
290 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
IONPhantom 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 scut_lcc 的回复:]
重载,进行偏特化

template<>
iterator Begin<map>();

template<>
iterator Begin<list>();

template<>
iterator Begin<vector>();

俺菜鸟,只是个大概的建议,不知道正确否
[/Quote]
这3个begin返回的迭代器类型是相同的???
scut_lcc 2010-08-05
  • 打赏
  • 举报
回复
重载,进行偏特化

template<>
iterator Begin<map>();

template<>
iterator Begin<list>();

template<>
iterator Begin<vector>();

俺菜鸟,只是个大概的建议,不知道正确否
IONPhantom 2010-08-05
  • 打赏
  • 举报
回复
问题还是在迭代器,返回迭代器的时候是返回迭代器对象而不是迭代器指针,有点郁闷
bulijun1987 2010-08-04
  • 打赏
  • 举报
回复
学习了哈!
独酌逸醉 2010-08-04
  • 打赏
  • 举报
回复
LZ是干吗的?
thehunters 2010-08-04
  • 打赏
  • 举报
回复
把iterator 做为模板参数
开心的卡夫卡 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cattycat 的回复:]
测试可以运行的。其他容器的可以类似的写。

C/C++ code
#include <iostream>
#include <string>
#include <vector>
using namespace std;

template<class Container>
class MyInterfaceClass
{
public:
typedef typena……
[/Quote]

恩,有意思~
太乙 2010-08-04
  • 打赏
  • 举报
回复
使用模板,将模板参数定义为任何一种vector/map/list等
template<typename Container>
class A
{
typedef typename Container::iterator iterator;
typedef typename Container::value_type value_type;
iterator insert(value_type v);
};
cattycat 2010-08-04
  • 打赏
  • 举报
回复
测试可以运行的。其他容器的可以类似的写。
#include <iostream>
#include <string>
#include <vector>
using namespace std;

template<class Container>
class MyInterfaceClass
{
public:
typedef typename Container::iterator iterator;
virtual iterator Insert(string s)=0;

};


template<class Container>
class VectorContainer:public MyInterfaceClass<Container>
{
public:
iterator Insert(string s)
{
return container.insert(container.begin(),s);;
}
private:
Container container;
};

void main()
{
VectorContainer<vector<string>> d;
d.Insert("hello");

}
chenyu2202863 2010-08-04
  • 打赏
  • 举报
回复
楼上正解~
cattycat 2010-08-04
  • 打赏
  • 举报
回复
子类:
template<class Container>
class Derived:public MyInterfaceClass<Container>
{
....
//直接可以用iterator了
}
cattycat 2010-08-04
  • 打赏
  • 举报
回复
template<class Container>
class MyInterfaceClass
{
public:
typedef typename Container::iterator iterator;
iterator Insert(TempClass *pObject)=0;
iterator Earse(TempClass *pObject)=0;
iterator Find(...)=0;
iterator Begin()=0;
iterator End()=0;

};


然后在派生类也这么定义模板,实例化的时候就能知道具体iterator的类型

war10811 2010-08-04
  • 打赏
  • 举报
回复
没看明白LZ的需求
IONPhantom 2010-08-04
  • 打赏
  • 举报
回复
楼上的仔细看需求...
ShowLong 2010-08-04
  • 打赏
  • 举报
回复
class VectorVersion : public MyInterfaceClass< std::vector >
{
vector<string> my_vec;
public:
virtual std::vector::iterator Insert(string &s)
{
return my_vec.insert(s);
}
};
ShowLong 2010-08-04
  • 打赏
  • 举报
回复
template< _Container >
class MyInterfaceClass
{
public:
virtual _Container::iterator Insert(TempClass *pObject)=0;
virtual _Container::iterator Earse(TempClass *pObject)=0;
virtual _Container::iterator Find(...)=0;
virtual _Container::iterator Begin()=0;
virtual _Container::iterator End()=0;
};

na_he 2010-08-04
  • 打赏
  • 举报
回复
1。就像多态的思路吧。基类为iterator,基类的指针可以访问子类具体操作的时候,又是各个iterator的操作。

2。或者采用设计模式中fatory的模式,设计一个类,根据不用类型返回不同的iractor.
胡说八道 2010-08-04
  • 打赏
  • 举报
回复
即然你能够将容器的操作抽象出一套接口出来,同样,也为 iterator 抽象出统一的接口,具体的实现让派生类去做吧
IONPhantom 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 macrojj 的回复:]
看了你的示例代码 觉得不咋可能。。。。。
接口的返回类型就算不一样 也要有继承关系。
[/Quote]
你这句话点题了,我现在的问题就在这里,因为map/list/vector的iterator类型不一样,所以造成我现在的困惑
macrojj 2010-08-04
  • 打赏
  • 举报
回复
看了你的示例代码 觉得不咋可能。。。。。
接口的返回类型就算不一样 也要有继承关系。
加载更多回复(8)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧