【发布时间】:2010-03-14 14:00:25
【问题描述】:
我正在尝试将我儿子的兴趣从魔兽争霸 3 编程扩展到 C++,以在一定程度上拓宽他的视野。我们正计划移植他编写的一个小游戏。
上下文是这样的。
- 有舰船和导弹,舰船将使用导弹并与之互动
- 存在一个容器,它将保存“一个”船舶列表。
- 存在一个容器,它将保存行星的“列表”。
- 可以对容器中的所有元素应用一个函数 (for_each)
- 可以随时创建/销毁舰船和导弹
- 新对象会自动将自己插入到正确的容器中。
我拼凑了一个小例子来完成这项工作,所以我们可以讨论主题(列表、模板等),但我对结果不满意。
#include <iostream>
#include <list>
using namespace std;
/* Base class to hold static list in common with various object groups */
template<class T>
class ObjectManager
{
public :
ObjectManager(void)
{
cout << "Construct ObjectManager at " << this << endl;
objectList.push_back(this);
}
virtual ~ObjectManager(void)
{
cout << "Destroy ObjectManager at " << this << endl;
}
void for_each(void (*function)(T *))
{
for (objectListIter = objectList.begin();
objectListIter != objectList.end();
++objectListIter)
{
(*function)((T *) *objectListIter);
}
}
list<ObjectManager<T> *>::iterator objectListIter;
static list<ObjectManager<T> *> objectList;
};
/* initializer for static list */
template<class T>
list<ObjectManager<T> *> ObjectManager<T>::objectList;
/* A simple ship for testing */
class Ship : public ObjectManager<Ship>
{
public :
Ship(void) : ObjectManager<Ship>()
{
cout << "Construct Ship at " << this << endl;
}
~Ship(void)
{
cout << "Destroy Ship at " << this << endl;
}
friend ostream &operator<<(ostream &out,const Ship &that)
{
out << "I am a ship";
return out;
}
};
/* A simple missile for testing */
class Missile : public ObjectManager<Missile>
{
public :
Missile(void) : ObjectManager<Missile>()
{
cout << "Construct Missile at " << this << endl;
}
~Missile(void)
{
cout << "Destroy Missile at " << this << endl;
}
friend ostream &operator<<(ostream &out,const Missile &that)
{
out << "I am a missile";
return out;
}
};
/* A function suitable for the for_each function */
template <class T>
void show(T *it)
{
cout << "Show: " << *it << " at " << it << endl;
}
int main(void)
{
/* Create dummy planets for testing */
Missile p1;
Missile p2;
/* Demonstrate Iterator */
p1.for_each(show);
/* Create dummy ships for testing */
Ship s1;
Ship s2;
Ship s3;
/* Demonstrate Iterator */
s1.for_each(show);
return 0;
}
具体来说,该列表通过继承机制有效地嵌入到每艘船中。必须有一艘船,才能访问船舶列表。必须拥有导弹才能访问导弹列表。感觉很尴尬。
我的问题归结为“有更好的方法吗?”
- 自动创建对象容器
- 自动对象插入
- 无需列表中的对象即可访问容器。
我正在寻找更好的想法。 所有有用的条目都会获得赞成票。
谢谢
邪恶。
【问题讨论】:
-
我不认为只有我一个人会发现您的函数参数声明样式不可读。一般来说,尤其是在这里发帖时,尽量减少垂直空白是个好主意,
-
我不确定你想要完成什么。您的儿子在 C++ 方面有多少经验?我建议从一些非常简单且很少有自动魔法的东西开始。
-
为什么不教他一门简单的语言呢?如果你想让他对编程感兴趣,不要把时间浪费在让一切变得比必要更难的语言上。
-
@jalf&&fabrizioM 他已经用 jass 编写了魔兽争霸 3。他非常喜欢 C++。
-
不要使用
void表示C++ 中没有参数。只需使用空括号。
标签: c++ static-methods