在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?
Posted
技术标签:
【中文标题】在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?【英文标题】:What is the best way to store and instantiate list of classes in C++ without using STL?在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是什么? 【发布时间】:2009-09-16 21:01:42 【问题描述】:我有一个类似下面的代码:
class News
public:
virtual void get() = 0;
class Cnn : News
void get () ...
class Msnbc : News
void get () ...
class Bbc : News
void get () ...
main ()
News * news = new Cnn;
news->get ()
News * news = new Msnbc;
news->get ()
News * news = new Bbc;
news->get ()
除了创建每个子类之外,存储子类(Cnn、Msnbc ...)并迭代并从所有提要中获取新闻的最佳方法是什么(我不能在一会儿)
谢谢
【问题讨论】:
为什么不能使用 STL?这就像说你不能使用 C++ :( 作业? 不使用STL的原因是什么?你应该使用一个容器类——即使是本土的——来管理分配。 (RAII - ***.com/questions/712639/…)。如果这也不是一个选项,那就是new News *[]
代码在嵌入式设备上运行,使用STL时链接器产生错误。它必须与 IO 做一些事情。
STL 将为您编写的任何主要项目节省时间 - 除非您真的想为您的自定义链表类进行单元测试。
我知道 C++ 在嵌入式方面的痛苦——就像被弹回到 90 年代初期一样。尽管如此,我还是强烈建议您尝试解决 STL 问题
【参考方案1】:
如果您不能使用 STL,那么最好的办法是使用一组 News*。
News*[] GetAllNews( int& count )
News*[] arr = new News*[3];
count = 3;
arr[0] = new Cnn();
arr[1] = new Msnbc();
arr[2] = new Bbc();
return arr;
int count;
News*[] arr = GetAllNews(count);
for ( int i = 0; i < count; i++ )
arr[i]->get();
// Now for the awkward cleanup
for ( int i = 0; i < count; i++ )
delete arr[i];
arr[i] = NULL;
delete[] arr;
【讨论】:
@hacker,你选择了更静态的解决方案,而我选择了更动态的解决方案。动态的必然更冗长。 @hacker:我会说 C++ 中的金徽章使 JaredPar 有资格成为该语言的非初学者。再说一次,他没有被点燃:P @hacker,你怎样才能拥有一个动态大小的数组(无 STL)并且不那么冗长?除非有一些模板疯狂。 dribeas,c++ 中的金色徽章意味着他得到了人们的支持,他们从我的话中推断出他是该语言的初学者。所以,徽章根本没有任何意义——另一方面,Jared 让你和你的两个支持者支持防守者并不是 Jared 的错 ;-) 而且我不知道“litb”是什么。尽管我不是语言的初学者,但英语不是我的母语,也永远不会是;-) @JaredPar:我在这里可以看到没有什么冗长的,但我认为你的数组声明有点不对劲——应该是News* arr[]
而不是News*[] arr
,返回类型为GetAllNews()
需要进行类似的更改。【参考方案2】:
News *n[] = new Cnn(), new Msnbc(), new Bbc() ;
for(News **p=n;p<&n[ sizeof(n)/sizeof(*n) ];++p)
(*p)->get();
delete *p;
【讨论】:
为什么投反对票?它可能简洁的答案,但它回答了这个问题。静态方法也有效,尤其是在不能使用完整 C++ 的小型嵌入式系统中。 来吧伙计们,这是一个很好的答案——简洁而正确。 +1。 (为了清楚起见,将sizeof
element-count 技巧拆分为单独的内联函数模板会很好。)
谢谢大家。 j_random_hacker,是的,在现实生活中的代码中是有意义的,但在答案中,我认为它可以更好地了解正在发生的事情。至少这是我将其嵌入此处的动机。
stefaanv,我实际上不知道在此处的代码中添加什么 - 它太短了,不需要不重复代码本身的 cmets。至于静态方法,在这种特殊情况下我认为没有任何理由比它更喜欢动态方法。它更快(当然,不多),更容易维护,更短......以上是关于在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?
如何在不循环的情况下将数组的内容复制到 C++ 中的 std::vector?
在 C++ 中,如何在不使用 if 语句的情况下选择运行特定的成员函数?