求救,list里保存对象?

wungyong025 2008-11-07 10:54:30
基类
class A
{
public:
A();
virtual ~A();
virtual void dosomething(unsigned long t) = 0;

A* nextT;
};
类B,C,D...都从A类派生,我想将B,C,D...对象放入链表中,以便实现dosomething()不同的结果,我现在想知道的是:
1,我在H类中如何通过调用 void H::Add(A* p)将B,C,D类的对象添加到list中(或者自己实现的链表?)。
2,如果我将B,C,D...等对象加入链表后,我怎样才能判断B,C,D...对象已经加入到链表中呢?
谢谢赐教!
...全文
108 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wungyong025 2008-11-07
  • 打赏
  • 举报
回复
给分
wungyong025 2008-11-07
  • 打赏
  • 举报
回复
谢谢!第一个问题解决了!
lann64 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wungyong025 的回复:]
刚才也许没有说清楚,我通过void H::Add(A* p)将B,C,D...等的对象加入链表中,按照楼上的方法是
list <A*> alist;
A* pb = new B();
A* pc = new C();
alist.push_back(pb);
alist.push_back(pc);
现在的问题是我事先不知道你要加那个对象放入链表。所以也就new不了具体的类了。
[/Quote]
这个要事先知道干嘛?
你调用Add(A* p)的时候,传的实参应该已经指向了你要加的对象了吧?
alist.push_back(p)不就行了。

你总有一个地方生成BCD的对象吧,生成时就用A*指向它,以后就操作A*就行了。
太乙 2008-11-07
  • 打赏
  • 举报
回复
多态~~
yuzy 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wungyong025 的回复:]
刚才也许没有说清楚,我通过void H::Add(A* p)将B,C,D...等的对象加入链表中,按照楼上的方法是
list <A*> alist;
A* pb = new B();
A* pc = new C();
alist.push_back(pb);
alist.push_back(pc);
现在的问题是我事先不知道你要加那个对象放入链表。所以也就new不了具体的类了。
[/Quote]
无奈~~~~,你不用知道是那个类!new?是提前声明好了对象就可以。
虽然我好久没有用C++,但是.........................
wungyong025 2008-11-07
  • 打赏
  • 举报
回复
刚才也许没有说清楚,我通过void H::Add(A* p)将B,C,D...等的对象加入链表中,按照楼上的方法是
list<A*> alist;
A* pb = new B();
A* pc = new C();
alist.push_back(pb);
alist.push_back(pc);
现在的问题是我事先不知道你要加那个对象放入链表。所以也就new不了具体的类了。
liumingrong 2008-11-07
  • 打赏
  • 举报
回复
你也不需要知道是BCD中的那个,只要你传入它们的指针就可以了
wungyong025 2008-11-07
  • 打赏
  • 举报
回复
感谢回复,关键问题是这样的,void H::Add(A* p)中p指向的对象B,C,D...我事先并不知道是那个啊,所以也就没有办法用A的指针指向它了。
liumingrong 2008-11-07
  • 打赏
  • 举报
回复
保存A*类型的指针,例如
list<A*> alist;
A* pb = new B();
A* pc = new C();
alist.push_back(pb);
alist.push_back(pc);
yuzy 2008-11-07
  • 打赏
  • 举报
回复
定义B,C,D类的对象,然后定义一个A类的指针,分别指向B,C,D类的对象,
把这个指针添加到链表就应该能解决你的第一个问题。
第二个问题应该通过你实现的不同dosomething函数来判断呀!
我现在用的是C,C++好久没用但是应该差不多。
yh4130a 2008-11-07
  • 打赏
  • 举报
回复

class A
{
public:
void Show(std::string str)
{
std::cout<<str<<std::endl;
};
bool operator == (const A& a)
{
if(this == &a) return true;
return false;
};
};
class B : public A{};
class C : public A{};
class H
{
private:
std::list<A*> list;
public:
void Add(A* a)
{
if(std::find(this->list.begin(), this->list.end(), a) == this->list.end())
{
this->list.push_back(a);
}
}
void Show(std::string str)
{
std::list<A*>::iterator it = this->list.begin();
while(it != this->list.end())
{
(*it)->Show(str);
it++;
}
}
};
int main()
{
std::string str;
std::cin>>str;

B* b = new B();
C* c = new C();
H h;
h.Add(b);
h.Add(c);
h.Add(b);
h.Add(b);
h.Add(b);
h.Show(str);
delete b;
delete c;

std::cin>>str;
return 0;
}

64,654

社区成员

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

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