矢量和派生类对象 [英] Vector and derived classes objects

查看:74
本文介绍了矢量和派生类对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑一个类 - 让我们称之为CObjectHolderClass,它有一个

对象指针集合,如


std :: vector< CBaseClass *> base_class_vec;


作为成员var。现在在我的CObjectHolderClass中的某处我做了


CDerived1 * p_derived1 = new CDerived1();

base_class_vec.push_back(derived1);


在CObjectHolderClass中,我只使用CBaseClass的公共接口。


如果我派生另一个类 - 让我们说来自CBaseClass的CDerived2,我有

更改我的CObjectHolderClass以执行类似


CDerived2 * p_derived2 = new CMyOtherBaseClass();

base_class_vec.push_back(p_derived2);


麻烦的是,我必须为不同的派生

类修改CObjectHolderClass。我该如何解决这个问题呢?


我的猜测是这种边界在某种类型的''设计模式''(我所在的区域是
还没有已经深入研究或者可能是一个模板解决方案,但是我很困惑如何。


未经测试或工作的源代码示例会受到很大的影响。 />
这表明需要我可能愚蠢的跟进

问题。


一如既往,提前谢谢。

Consider a class - lets call it CObjectHolderClass that has a
collection of object pointers like

std::vector<CBaseClass*> base_class_vec;

as member var. Now somewhere in my CObjectHolderClass I do

CDerived1* p_derived1 = new CDerived1();
base_class_vec.push_back(derived1);

In CObjectHolderClass, i just use the public interface of CBaseClass.

If I derive another class - lets say CDerived2 from CBaseClass, I have
to change my CObjectHolderClass to do something like

CDerived2* p_derived2 = new CMyOtherBaseClass();
base_class_vec.push_back(p_derived2);

Trouble is, I have to modify CObjectHolderClass for different derived
classes. How do I get around this?

My guess is this borders on some type of ''design pattern'' (an area I
haven''t delved into yet) or perhaps a template solution but I''m
confused on how.

Untested or working source examples would be greatly appreaciated.
This alleaviates the need for me my potentially silly follow up
questions.

As always, thanks in advance.

推荐答案

ma740988写道:
ma740988 wrote:
考虑一个类 - 让我们称之为CObjectHolderClass,它有一个像
std :: vector< CBaseClass *> base_class_vec;

作为成员var。现在在我的CObjectHolderClass中的某处我做了CDerived1 * p_derived1 = new CDerived1();
base_class_vec.push_back(derived1);

在CObjectHolderClass中,我只是使用了CBaseClass的公共接口。

如果我派出另一个类 - 让我们说CBaseClass的CDerived2,我就可以改变我的CObjectHolderClass来做类似的事情

CDerived2 * p_derived2 = new CMyOtherBaseClass();
base_class_vec.push_back(p_derived2);

麻烦的是,我必须为不同的派生类修改CObjectHolderClass。我该如何解决这个问题?


一个模板,也许......

我的猜测是这种边界在某种类型的''设计模式''(我所在的地区)还没有深入研究或者可能是一个模板解决方案,但我对如何感到困惑。

未经测试或正在运行的源代码示例将会受到很大的影响。
这个代表需要我可能愚蠢的跟进
问题。
Consider a class - lets call it CObjectHolderClass that has a
collection of object pointers like

std::vector<CBaseClass*> base_class_vec;

as member var. Now somewhere in my CObjectHolderClass I do

CDerived1* p_derived1 = new CDerived1();
base_class_vec.push_back(derived1);

In CObjectHolderClass, i just use the public interface of CBaseClass.

If I derive another class - lets say CDerived2 from CBaseClass, I have
to change my CObjectHolderClass to do something like

CDerived2* p_derived2 = new CMyOtherBaseClass();
base_class_vec.push_back(p_derived2);

Trouble is, I have to modify CObjectHolderClass for different derived
classes. How do I get around this?
A template, perhaps...
My guess is this borders on some type of ''design pattern'' (an area I
haven''t delved into yet) or perhaps a template solution but I''m
confused on how.

Untested or working source examples would be greatly appreaciated.
This alleaviates the need for me my potentially silly follow up
questions.




#include< vector>


class Base {};


class ObjectHolder {

std :: vector< Base *> base_class_vec;

public:

template< class D> void addDerived(D * d){

base_class_vec.push_back(d);

}

};


class Derived1:public Base {};

class Derived2:public Base {};


int main(){

ObjectHolder等等;

blah.addDerived(new Derived1());

blah.addDerived(new Derived2());

}


(这个例子本身并不干净,但你可以添加它,不是吗?)


HTH


V



#include <vector>

class Base {};

class ObjectHolder {
std::vector<Base*> base_class_vec;
public:
template<class D> void addDerived(D* d) {
base_class_vec.push_back(d);
}
};

class Derived1 : public Base {};
class Derived2 : public Base {};

int main() {
ObjectHolder blah;
blah.addDerived(new Derived1());
blah.addDerived(new Derived2());
}

(this example doesn''t clean after itself, but you can add it, can''t you?)

HTH

V


* Victor Bazarov:
* Victor Bazarov:
ma740988写道:
ma740988 wrote:
考虑一个类 - 让我们称之为CObjectHolderClass,它有一组对象指针,如

std :: vector< CBaseClass *> base_class_vec;

作为成员var。现在在我的CObjectHolderClass中的某处我做了CDerived1 * p_derived1 = new CDerived1();
base_class_vec.push_back(derived1);

在CObjectHolderClass中,我只是使用了CBaseClass的公共接口。

如果我派出另一个类 - 让我们说CBaseClass的CDerived2,我就可以改变我的CObjectHolderClass来做类似的事情

CDerived2 * p_derived2 = new CMyOtherBaseClass();
base_class_vec.push_back(p_derived2);

麻烦的是,我必须为不同的派生类修改CObjectHolderClass。我如何解决这个问题?
Consider a class - lets call it CObjectHolderClass that has a
collection of object pointers like

std::vector<CBaseClass*> base_class_vec;

as member var. Now somewhere in my CObjectHolderClass I do

CDerived1* p_derived1 = new CDerived1();
base_class_vec.push_back(derived1);

In CObjectHolderClass, i just use the public interface of CBaseClass.

If I derive another class - lets say CDerived2 from CBaseClass, I have
to change my CObjectHolderClass to do something like

CDerived2* p_derived2 = new CMyOtherBaseClass();
base_class_vec.push_back(p_derived2);

Trouble is, I have to modify CObjectHolderClass for different derived
classes. How do I get around this?



一个模板,也许......



A template, perhaps...




OP说明只有公共接口使用CBaseClass。


因此,将内部指针声明为CBaseClass *,并传入

一个对象工厂提供这样的指针,会做(这里忽略)可能

错误引用CMyOtherBaseclass)。


主要问题是OP给出的例子也不例外

安全;应该是例如

std :: auto_ptr< CBaseClass> p_derived = my_derived_factory-> newObject();

base_class_vec.push_back(p_derived.get()); //可能会抛出。

p_derived.release();


-

答:因为它弄乱了订单人们通常会阅读文字。

问:为什么这么糟糕?

A:热门帖子。

问:什么是usenet和电子邮件中最烦人的事情是什么?



The OP states that only the public interface of CBaseClass is used.

Hence, declaring the internal pointers as CBaseClass*, and passing in
an object factory serving such pointer, will do (here ignoring the probably
incorrect reference to CMyOtherBaseclass).

The main problem is that the examples the OP gives are not exception
safe; should be e.g.
std::auto_ptr<CBaseClass> p_derived = my_derived_factory->newObject();

base_class_vec.push_back( p_derived.get() ); // May throw.
p_derived.release();

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?


Victor Bazarov< v。******** @ comAcast.net>在消息新闻中写道:< QQ *************** @ newsread1.dllstx09.us.to.v erio.net> ...
Victor Bazarov <v.********@comAcast.net> wrote in message news:<QQ***************@newsread1.dllstx09.us.to.v erio.net>...
ma740988写道:
[...]
int main(){
ObjectHolder blah;
blah.addDerived(new Derived1());
blah.addDerived(new Derived2 ());
}

(这个例子本身并不干净,但是你可以添加它,不是吗?)
ma740988 wrote: [...]
int main() {
ObjectHolder blah;
blah.addDerived(new Derived1());
blah.addDerived(new Derived2());
}

(this example doesn''t clean after itself, but you can add it, can''t you?)



我能做到的。 :)感谢您的帮助


That I could do. :) Thanks for the help


这篇关于矢量和派生类对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆