作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 不同物件的Link-List
时间Sat Sep 26 12:16:25 2009
※ 引述《godman362 (青)》之铭言:
: 不过这样我又产生了一个问题
: 因为实际上我是根据读档案而动态产生不同物件後串连
: 也就是我不知道串连的先後顺序,我只知道开头的位址而已
: 那麽,我的确可以一路往下指下去没有问题
: 但是假设我要从结构中取值的话,就有问题了
: 因为如同之前所说,我必须要「转型」
: 可是我不知道目前指的是哪一个,所以也不知道该转成什麽型态
: 所以想再请问各位,这应该如何解决?
: 或是各位有比我更好想法的话,还请指点一下,谢谢
以下是不好的示范
乖孩子请不要学
(虽然这样的写法在 C 里面早已行之多年)
typedef enum {
LIGHT, TUNELIGHT, WINDOW
} StructType;
struct Base {
struct Base* LocalLink;
StructType Type;
};
typedef struct Base Base;
typedef struct {
Base* LocalLink;
StructType Type;
int Power;
} Light;
typedef struct {
Base* LocalLink;
StructType Type;
int Power;
int Brightness;
} TuneLight;
typedef struct {
Base* LocalLink;
StructType Type;
int OpenLevel;
} Window;
// constructors
Light* NewLight(int p)
{
Light* light = (Light*)malloc(sizeof(Light));
light->Type = LIGHT;
light->Power = p;
light->LocalLink = NULL;
return light;
}
TuneLight* NewTuneLight(int p, int b); // ditto
Window* NewWindow(int level); // ditto
void foo(Base* list){
Base* next = list;
// iterate through the list
while(next){
Light* light;
TuneLight* tune_light;
Window* window;
switch(next->Type){
case LIGHT:
light = (Light*)next;
...
break;
case TUNELIGHT:
tune_light = (TuneLight*)next;
...
break;
case WINDOW:
window = (Window*)next;
...
break;
default:
// error here
exit(1);
}
next = next->LocalLink;
}
}
这样的写法不好
因为如果你之後要增加更多种类的 struct
必须要改变非常多的地方 而且你不改并不会造成 compile error
(这是最糟糕的地方 你很难知道自己到底有没有改完整)
最正道的方法
是改用 C++
使用继承及多型
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.163.147.79
1F:推 yoco315:呜呜 公司全都是这种code... 我写c++还被消遣.. 09/26 12:56
2F:推 VictorTom:这种code真是地狱....Orz 09/26 14:47
3F:→ james732:用继承多型写起来就不会这麽罗嗦了 眞的方便很多 >"< 09/26 15:05
4F:推 godman362:谢谢您的例子,其实我不是一定要用C写 09/27 10:13
5F:→ godman362:只是对多型不熟就是了... 09/27 10:13
6F:推 softwind:哀~~~ 莫再提 09/27 23:26