Redian新闻
>
问一个C++的问题,关于base class的设计的
avatar
问一个C++的问题,关于base class的设计的# Programming - 葵花宝典
l*o
1
在这种场合的,自然是要穿着正式礼服的。而阿克蒙德年轻一代的选择出奇一致,都是
以黑红双色为基调。这象征着火焰与熔岩,是阿克蒙德血脉的标志。几乎所有人都表现
出对炽热温度和琉磺味道的喜爱,因为这意味着血脉浓郁纯净,并且血脉能力开始有所
显现。
同样只有两个人看起来并不喜欢这个环境,一个是李察,一个是角落里的柔弱少女。
站在厅角的李察并不轻松,因为他感觉得到,几乎所有的目光都在明里暗里地看着
自己。另外房间中浓郁的火山风格其实让他感觉到略微有些不舒服,毕竟他的精灵血脉
是先行开始显现的。可是其它人就真的喜欢火山吗?除了温宁顿和黛玫,李察没看出一
个人有丝毫血脉觉醒的迹象,而且有些人细微的不自然表情和隐约的汗珠已经表明房间
的温度有些过高了。
一个真正的阿克蒙德决不会对四十度的室温感到不适。就象李察,觉醒了阿克蒙德
血脉能力爆发的他,和歌顿站在家族墓地的火山边缘时也并没有感觉到热得难以忍受,
只是本能地不太喜欢而已。那里可是超过七十度!也就是说,厅中大多数少男少女都是
在装样子,装出一幅血脉纯净浓郁的模样。其实这种做派,和那些历史悠久的大家族子
弟已经没什么区别,都是在拼命向着主流靠拢,试图获得些上位者的青睐而已。
歌顿如彗星般崛起,现在则如恒星般高悬天空,他选择的家族徽章为火山,所以这
些年轻子弟就在拼命表现出自己对一切带有火山要素的事物的喜爱。有什么比高温和硫
磺更能代表火山呢?
答案还有一个,那就是熔岩!
可是这些虚伪的小家伙显然不可能去拥抱熔岩。李察的目光一个个扫过宴会厅中的
人,心中却很恶意地想着。
李察的目光又落在那个少女的身上,停留了一下,又移开了。没办法,整个厅中就
她穿了一身素白的长裙,身上也没有多少装饰。于是在黑红为底色的厅中,变得极为显
眼。
李察心中浮上少女的资料:可可.玫丽.阿克蒙德,十六岁,高167厘米,职业是二
级幻术师,父亲为皮尔.阿克蒙德,爵位骑士,十级战士,拥有初级力量、初级防御双
重构装。目前于黑玫瑰城堡任护卫队副队长。
想起这些资料,李察不觉皱了皱眉。可可出身是所有在场人中最低微的,父亲至今
只是一名骑士,勉强沾上了一点贵族的边。而以他父亲十级战士的实力,受封骑士非常
勉强,应该是多年在黑玫瑰城堡服役,靠着年限和资历获得的一个封号,并且不能世袭
。一个双构装战士只有这点功勋,只能说明皮尔根本没有勇气到真正的战场上战斗厮杀
,否则的话获封爵士都有可能,而个人战斗力也至少会突破到十三级以上。因为身体没
有十三级潜质的话,根本无法承载两个构装。
至于可可,也因为父亲多年服役的原因得到了进入浮世德学习的机会。不过皮尔真
正的目的是想让可可嫁一个有地位和力量的男人,退一步的话找个更好的伴侣也可以,
然后再看看是否运气足够好,能够生下一个具有浓郁阿克蒙德血统的孩子。
然而李察看到她十六岁的年纪和二级幻术师的职业,立刻就知道可可根本没有任何
魔法上的天赋可言。而眼下她柔弱的体质也显露无疑,更是和战职无缘。那么惟一剩下
的就是血脉了。不过李察在她身上也没有看到任何浓郁血脉的迹象。她的父亲就没能觉
醒任何血脉能力,而她自己似乎还更多继承了母亲体弱多病的体质。
可可被送到浮世德已经一年了,以她的资质地位只能是属于被指定的对象,而且无
法反抗。如果她不肯完成第一项古老义务,那就会立刻被驱逐出阿克蒙德家族,那时的
处境还不如老老实实的完成义务。而另一方面,并不是每个冠以阿克蒙德姓氏的成员都
可以被列入需要承担义务的名单的。因为一旦指定了伴侣,家族就会提供一定的资源支
持,以使双方尽可能的提高力量,这样才有机会生下更好的后代。
可可其实长得很不错,清丽的面孔配合柔弱的气质,很让人有种怜惜的冲动。可是
她在浮世德已经一年,却还没有被指定伴侣。原因并不是她长得不够好,而是实在太弱
了。
阿克蒙德的血脉暴烈刚猛,伴侣制度实行了几百年之后,公认的规律就是两个强大
的人结合,更容易生出能够觉醒血脉的后代。而另一个规律则是真正强者的后代,特别
是拥有真名的强者,直系血亲之间通婚更容易拥有血脉浓郁的后代。
可可两个方面都靠不上,自然不会被那些野心勃勃的年轻阿克蒙德看中。而族中高
层在指定伴侣时,当然更会考虑这一点。
李察再次看向厅中其他人,特别是自己那些同父异母的兄弟姐妹。早在今晚之前,
他就已经拿到了所有人的资料。
沃林,十四岁,五级射手;温宁顿,十四岁,八级烈火卫士。维妮卡,十四岁,七
级烈火战士。黛玫,十五岁,十级咒术师!
应该说,在这个年纪层次里,阿克蒙德家族人才辈出,除了沃林明显要弱一些,其
余三个在个体武力上丝毫不逊于李察。
温宁顿和维妮卡已经显示出血脉觉醒的迹象,攻击时已带有火焰元素伤害。而黛玫
在魔法上的天赋却更是惊人。假如李察不是构装师,而是日夜研究魔法的话,到今天取
得的成绩最多也就和黛玫不相上下。但是一个普通的魔法师和咒术师相比,其作用和威
力不可同日而语。
当然,在这个小厅中李察依然是最耀眼的。深蓝传承,构装师,八级魔法师,以及
遗传自一半精灵血统的俊美外表,都让他的光芒远远压过众人。而且歌顿已经亲自做过
评价,李察的血脉天赋并不比他差。
这简直让人疯狂!歌顿拥有真名,现在已经不是秘密了。这个评价意味着李察最终
也将拥有真名,并且他还是一名构装师!
所以维妮卡和黛玫盯着李察的目光简直是在燃烧。维妮卡和黛玫长得都很高,容貌
则强势继承了父系家族的风格,火辣妖艳。她们穿着几乎一模一样的低胸晚礼服,也就
是说裁剪最简单,没有任何多余的装饰会掩盖掉姣好的曲线,不但刻意衬托出了发育良
好的胸部,而且高开衩的裙边更是把一条大腿完整地裸露出来。特别是维妮卡,因为本
身是战职的原因,虽然年纪比黛玫还要小一岁,胸部却凶猛得几乎要从晚礼服中跳出来。
PS:据南风说,七尺居士的新书《开天宝鉴》很不错,书号176870。目前略有些瘦
,但日保底三更,很快可肥。他那本老的数据侠客行也不错。大家有空的话可以看看。
另外,今晚还有两更。
avatar
C*e
2
有一段电话录音想编辑一下,主要想把一些不需要的地方去掉,然后把整个录音分成几
个小段。不知道用什么软件比较容易。恳请大虾们指点。谢谢!!!
avatar
y*j
3
一般那个系列容易出彩?
或者有没有牛人写了机器人之类的?
avatar
p*r
4
假设有个base class叫Animal
derived class包括Cat,Dog等等
class Cat: public Animal {
...
};
现在希望在Animal里定义一个成员函数,比如叫processData
其作用是处理一些各种动物共通的数据,比如身高体重之类的
其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
class的member variable
而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其
他一些cat特有的数据,比如胡须长度,这些数据都是CatData这个class的member
variable,当然,CatData是AnimalData的 derived class
现在问题是一般怎么设计这个base class Animal和derived class Cat?
假如把processData的输入参数设为AnimalData类型的reference,那么Cat的
processData就不能用CatData类型的reference,因为override要求必须参数类型一致
但如果把Cat的processData函数的输入也设为AnimalData类型的reference,那么就无法
处理Cat的特有的数据
希望大牛们不吝赐教指点一下,或者扔个链接我自己去网上看,谢谢您!
avatar
C*e
5
没有人知道么?自己顶一下

【在 C****e 的大作中提到】
: 有一段电话录音想编辑一下,主要想把一些不需要的地方去掉,然后把整个录音分成几
: 个小段。不知道用什么软件比较容易。恳请大虾们指点。谢谢!!!

avatar
p*t
6
我知道有牛人写了机器人,但是人家靠那个赚钱,不会给你的

【在 y***j 的大作中提到】
: 一般那个系列容易出彩?
: 或者有没有牛人写了机器人之类的?

avatar
N*K
7
static_cast?
visitor pattern?

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
l*e
8
outlet有啥deal?

【在 y***j 的大作中提到】
: 一般那个系列容易出彩?
: 或者有没有牛人写了机器人之类的?

avatar
N*K
9
http://alumni.cs.ucr.edu/~lgao/teaching/visitor.html
看起来挺恶心的

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
k*n
10
whenever there is 15% or 20% off coupon

【在 l******e 的大作中提到】
: outlet有啥deal?
avatar
l*b
11
processData既然是member function 为什么还要有一个animal作为参数呢
oop里函数必须作为second class处理 , 不然就是个灾难

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
l*e
12
然后呢?

【在 k*****n 的大作中提到】
: whenever there is 15% or 20% off coupon
avatar
g*y
13
看起来processData不应该设计成成员函数,因为cat不会processData。哈哈
实在想这样设计的话,可以参考visitor pattern。

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
g*u
14
当花儿乐队

【在 l******e 的大作中提到】
: 然后呢?
avatar
j*o
15
单独做一个static函数吧
avatar
p*r
16
上午看到一个639的i7 920, 6g, win7, gt220,五分钟就没了,求coupon都来不及

【在 l******e 的大作中提到】
: outlet有啥deal?
avatar
b*s
17
use interface like things rather than inheritance
merely a suggestion

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
d*e
18
你这问题该去ebiz 问才对,呵呵。
偶自己曾经有两个Dell,都是玩了半年然后 +$60出手。deal不deal见仁见智,当时够
用就好。
最近盯的应该是xps 8000和xps 435两款,见过xps 8000 $450 shipped 和xps 435 $
570 shipped。去年有段时间还有435 mt with 4850 $53x shipped。
要玩机的话还是得自己配。偶最近自己动手装了一个。坏处是胃口被越调越高。这不才
不到一个月,主板,显卡,内存换了个遍。这两天又觉得现在这个CM Storm Scout机箱
的cable management不够好,开始垂涎Corsair Obsidian 800D。。。
Remember, greed is a sin --> looking for deals is a sin too, lol
avatar
Z*7
19
c++看起来好难懂

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
v*e
20
盯slickdeals就够了吧

【在 y***j 的大作中提到】
: 一般那个系列容易出彩?
: 或者有没有牛人写了机器人之类的?

avatar
N*K
21
智商堪忧的 就不要碰c++

【在 Z****7 的大作中提到】
: c++看起来好难懂
avatar
l*e
22
黄花菜都凉了

【在 v****e 的大作中提到】
: 盯slickdeals就够了吧
avatar
G*l
23
visitor pattern解决你的问题很方便。但是有一点点over kill,因为你好像不需要多
种的visitor。
或者你可以用template,这是c++的优势。

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
y*j
24
大牛教导我们说,被发出来的deal不是deal
突然发现"盯"字张的好别扭.

【在 v****e 的大作中提到】
: 盯slickdeals就够了吧
avatar
g*g
25
因为你的设计有问题,做两个方法,processAnimalData和 processCatData在两个类里
。问题就解决了。后者可以调用前者。

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
y*j
26
谢谢,俺去研究研究

【在 d********e 的大作中提到】
: 你这问题该去ebiz 问才对,呵呵。
: 偶自己曾经有两个Dell,都是玩了半年然后 +$60出手。deal不deal见仁见智,当时够
: 用就好。
: 最近盯的应该是xps 8000和xps 435两款,见过xps 8000 $450 shipped 和xps 435 $
: 570 shipped。去年有段时间还有435 mt with 4850 $53x shipped。
: 要玩机的话还是得自己配。偶最近自己动手装了一个。坏处是胃口被越调越高。这不才
: 不到一个月,主板,显卡,内存换了个遍。这两天又觉得现在这个CM Storm Scout机箱
: 的cable management不够好,开始垂涎Corsair Obsidian 800D。。。
: Remember, greed is a sin --> looking for deals is a sin too, lol

avatar
s*i
27
generic?

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
y*j
28
用啥语言写呢?

【在 p****t 的大作中提到】
: 我知道有牛人写了机器人,但是人家靠那个赚钱,不会给你的
avatar
d*n
29
这也是灾难吧,都写到h里面去了。所以非infra一概不用。

【在 G***l 的大作中提到】
: visitor pattern解决你的问题很方便。但是有一点点over kill,因为你好像不需要多
: 种的visitor。
: 或者你可以用template,这是c++的优势。

avatar
d*e
30
刚看到435 有个$649 i7 920/4G/640G/1G GT 220,如果有15% coupon 还不错了

【在 y***j 的大作中提到】
: 谢谢,俺去研究研究
avatar
G*l
31
按你这么说template都没法用了,用c++不用template还图啥?用tempalte最多编译慢
点而已。

【在 d****n 的大作中提到】
: 这也是灾难吧,都写到h里面去了。所以非infra一概不用。
avatar
y*j
32
我也刚看到
15% coupon从哪里买? ebay?

【在 d********e 的大作中提到】
: 刚看到435 有个$649 i7 920/4G/640G/1G GT 220,如果有15% coupon 还不错了
avatar
d*n
33
很难refactor。

【在 G***l 的大作中提到】
: 按你这么说template都没法用了,用c++不用template还图啥?用tempalte最多编译慢
: 点而已。

avatar
d*e
34
e-junkie, ebay 或者各大论坛

【在 y***j 的大作中提到】
: 我也刚看到
: 15% coupon从哪里买? ebay?

avatar
B*e
35
Try this:
class Animal {
virtual void processData(AnimalData &d)
{
//process common data for an animal
}
};
class Cat : public Animal {
virtual void processData(AnimalData &d)
{
Animal::processData(d);
//process cat specific data
}
};
class Dog : public Animal {
virtual void processData(AnimalData &d)
{
Animal::processData(d);
//process dog specific data
}
};

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
y*j
36
谢了,一共一个包子发给你了~~

【在 d********e 的大作中提到】
: e-junkie, ebay 或者各大论坛
avatar
B*e
37
class Animal {
virtual void processData(AnimalData &d) {
{
//process common data for an animal
processPrivateData(d);
}
protected:
virtual void processPrivateData(AnimalData &d) = 0;
};
class Cat : public Animal {
virtual void processPrivateData(AnimalData &d)
{
//process cat specific data
}
};
class Dog : public Animal {
virtual void processPrivateData(AnimalData &d)
{
//process dog specific data
}
};

【在 B********e 的大作中提到】
: Try this:
: class Animal {
: virtual void processData(AnimalData &d)
: {
: //process common data for an animal
: }
: };
: class Cat : public Animal {
: virtual void processData(AnimalData &d)
: {

avatar
d*e
38
不过这一拨儿coupon好像1/29到期。
avatar
N*K
39
AnimalData 能覆盖所有情况?

【在 B********e 的大作中提到】
: Try this:
: class Animal {
: virtual void processData(AnimalData &d)
: {
: //process common data for an animal
: }
: };
: class Cat : public Animal {
: virtual void processData(AnimalData &d)
: {

avatar
p*r
40
8G的比较合算,4x2G,
6G=6X1G,
9G=3x2G+3x1G
fatwallet有1%的cashback,不知道哪里还有cashback可拿

【在 d********e 的大作中提到】
: 刚看到435 有个$649 i7 920/4G/640G/1G GT 220,如果有15% coupon 还不错了
avatar
B*e
41
I don't know. Since it's in the design stage, everything is possible.
If it's required to serialize or deserialize the data for all the classes in
a general format, it's not a bad design at all to do this way.
Just one of the options.

【在 N******K 的大作中提到】
: AnimalData 能覆盖所有情况?
avatar
d*e
42
6x1 最惨,呵呵。不过可以ebay了之。

【在 p**********r 的大作中提到】
: 8G的比较合算,4x2G,
: 6G=6X1G,
: 9G=3x2G+3x1G
: fatwallet有1%的cashback,不知道哪里还有cashback可拿

avatar
g*g
43
Not a good idea, you'll need casting. It's not a crime to have 2 different
functions. Why are you guys so insisting of using processAnimalData to cover
Cat. An extra processCatData in Cat will do just fine. Cat can process Cat
data and animal data, animal can only process animal data, don't force
animal to process Cat Data. This is OOP 101.

in

【在 B********e 的大作中提到】
: I don't know. Since it's in the design stage, everything is possible.
: If it's required to serialize or deserialize the data for all the classes in
: a general format, it's not a bad design at all to do this way.
: Just one of the options.

avatar
d*0
44
不用买,到dell outlet注册个账号他会定期给你发的

【在 y***j 的大作中提到】
: 我也刚看到
: 15% coupon从哪里买? ebay?

avatar
B*e
45
it does not make sense to keep two parallel set of classes
amimal,cat,dog
with
animaldata,catdata,dogdata
my idea is to make the data in a general format. for example in json format.
using the key to find the specific fields to process.

cover
Cat

【在 g*****g 的大作中提到】
: Not a good idea, you'll need casting. It's not a crime to have 2 different
: functions. Why are you guys so insisting of using processAnimalData to cover
: Cat. An extra processCatData in Cat will do just fine. Cat can process Cat
: data and animal data, animal can only process animal data, don't force
: animal to process Cat Data. This is OOP 101.
:
: in

avatar
p*o
46
Both ways you lose the ability to detect errors at compile time when
passing DogData to processCatData.

format.

【在 B********e 的大作中提到】
: it does not make sense to keep two parallel set of classes
: amimal,cat,dog
: with
: animaldata,catdata,dogdata
: my idea is to make the data in a general format. for example in json format.
: using the key to find the specific fields to process.
:
: cover
: Cat

avatar
m*i
47
计算机小白回一下:可以用 pure virtual 在 base class 吗? 在 detived class
overriden. 另外,factory 这个概念可不可以用来设计这个?
avatar
a9
48
you will have to call different function when calling this function
if cat{
.processcatdata();
} else {
.processanimaldata();
}

cover
Cat
classes

【在 g*****g 的大作中提到】
: Not a good idea, you'll need casting. It's not a crime to have 2 different
: functions. Why are you guys so insisting of using processAnimalData to cover
: Cat. An extra processCatData in Cat will do just fine. Cat can process Cat
: data and animal data, animal can only process animal data, don't force
: animal to process Cat Data. This is OOP 101.
:
: in

avatar
g*g
49
You are wrong, if you have cat data, route it through processCatData, if you
have Animal data, route it through processAnimalData
Cat can be seen as both an animal and cat, the caller will call the
interface they are interested. There will never be an Animal routed to
processCatData.
it's more like
processCatData(Cat cat) {
processAnimal(cat);
//extra processing for cat.
}
processAnimalData(Animal animal) {
//process animal.
}

【在 a9 的大作中提到】
: you will have to call different function when calling this function
: if cat{
: .processcatdata();
: } else {
: .processanimaldata();
: }
:
: cover
: Cat
: classes

avatar
k*e
50
也许理解的不对。CatData从AnimalData继承,那么CatData is a AnimalData,
processData使用(AnimalData*)作为参数,在Cat类中用RTTI判断指针指向的对象是
不是一个CatData不就行了吗?
avatar
N*K
51
怎么设计这个基于Json格式的 AnimalData?
这个想法挺好 能仔细展开讲讲么?

format.

【在 B********e 的大作中提到】
: it does not make sense to keep two parallel set of classes
: amimal,cat,dog
: with
: animaldata,catdata,dogdata
: my idea is to make the data in a general format. for example in json format.
: using the key to find the specific fields to process.
:
: cover
: Cat

avatar
g*g
52
因为这不是一个好的做法。两个接口才能保证强类型。

【在 k***e 的大作中提到】
: 也许理解的不对。CatData从AnimalData继承,那么CatData is a AnimalData,
: processData使用(AnimalData*)作为参数,在Cat类中用RTTI判断指针指向的对象是
: 不是一个CatData不就行了吗?

avatar
B*e
53
animaldata is just a map of key-val pairs.
say there is a field ‘type’.
in cat.processdata
if type is cat
do cat data.
else
print error
return.

【在 N******K 的大作中提到】
: 怎么设计这个基于Json格式的 AnimalData?
: 这个想法挺好 能仔细展开讲讲么?
:
: format.

avatar
N*K
54
要是value的类型不一样呢?
有的是string 有的是自定义的结构体

【在 B********e 的大作中提到】
: animaldata is just a map of key-val pairs.
: say there is a field ‘type’.
: in cat.processdata
: if type is cat
: do cat data.
: else
: print error
: return.

avatar
B*e
55
option 1
use boost Any type with std::map
option 2
define the structure in json format. and use json object to replace c++
structure.
if you want to use it with mongo, use bson object.

【在 N******K 的大作中提到】
: 要是value的类型不一样呢?
: 有的是string 有的是自定义的结构体

avatar
b*s
56
it is just an entry-level question
#include
using namespace std;
class Animal
{
public:
virtual void butchered()
{
is_live = false;
cout << "is_live:" << is_live << endl;
}
private:
bool is_live = true;
};
class Dog : public Animal
{
public:
void butchered() override
{
Animal::butchered();
make_hot_pot = true;
cout << "make it hot pot? " << make_hot_pot << endl;
}
private:
bool make_hot_pot = false;
};
int main()
{
Dog dog;
dog.butchered();
}

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
N*K
57
我的意思是 Json object 能包打天下?

【在 B********e 的大作中提到】
: option 1
: use boost Any type with std::map
: option 2
: define the structure in json format. and use json object to replace c++
: structure.
: if you want to use it with mongo, use bson object.

avatar
b*s
58
the only sound solution in this thread

【在 B********e 的大作中提到】
: Try this:
: class Animal {
: virtual void processData(AnimalData &d)
: {
: //process common data for an animal
: }
: };
: class Cat : public Animal {
: virtual void processData(AnimalData &d)
: {

avatar
k*e
59
照你这么说C++允许Animal* p = &CatInstance这样的赋值就是大大的破坏了强类型啊。
派生类 is a 基类这是OO基本的哲学原则啊。

【在 g*****g 的大作中提到】
: 因为这不是一个好的做法。两个接口才能保证强类型。
avatar
B*e
60
我觉得差不多,我们在实际中用它表示过非常复杂的模型

【在 N******K 的大作中提到】
: 我的意思是 Json object 能包打天下?
avatar
G*U
61
是我没弄懂lz问题还是。。。我这个实现有什么问题吗?
1 #include
2
3 using namespace std;
4
5 class AnimalData {
6 public:
7 int a;
8 };
9
10 class CatData : public AnimalData {
11 public:
12 int b;
13 };
14
15 class Animal {
16 public:
17 virtual void processData(AnimalData &d)
18 {
19 cout << d.a << endl;
20 }
21 };
22
23 class Cat : public Animal {
24 public:
25 virtual void processData(CatData &d)
26 {
27 Animal::processData(d);
28 cout << d.b << endl;
29 }
30 };
avatar
g*g
62
在Cat里用Animal data是可以的。但在Cat里去判断是什么数据是破坏强类型的。
我不明白你们为啥非要把俩东西挤进一个方法里。如果这个类hierarchy很深,难道就
这么一直instanceOf地一堆if? 两个方法不好吗?

啊。

【在 k***e 的大作中提到】
: 照你这么说C++允许Animal* p = &CatInstance这样的赋值就是大大的破坏了强类型啊。
: 派生类 is a 基类这是OO基本的哲学原则啊。

avatar
l*s
63
Basically, you are taking the burden to decide most derived type from the
java runtime. or reloacting the instanceOf() to the caller. It is not
really more beneficial, but rather personal taste/style.


【在 g*****g 的大作中提到】
: 在Cat里用Animal data是可以的。但在Cat里去判断是什么数据是破坏强类型的。
: 我不明白你们为啥非要把俩东西挤进一个方法里。如果这个类hierarchy很深,难道就
: 这么一直instanceOf地一堆if? 两个方法不好吗?
:
: 啊。

avatar
K*g
64
如果Animal, Cat, AnimalData, CatData这样结构定死了确实很难办,但一般很难办的
时候都说明结构本身有问题。在我看来CatData继承AnimalData不是很合适,因为从命
名上说这两个都只是一组数据,没有成员函数的话享受不到继承带来的多态性。
如果可以的话建议改成以下类:
AnimalBasicData:所有动物都有的数据
AnimalXSpecificData:X特有数据
AnimalData {
enum AnimalType{...}
AnimalType type;
AnimalBasicData *basic;
AnimalXSpecificData *xdata;
AnimalYSpecificData *ydata;
...
}
仅供参考:)

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
N*K
65
举个例子?

【在 B********e 的大作中提到】
: 我觉得差不多,我们在实际中用它表示过非常复杂的模型
avatar
B*e
66
网上例子挺多的。
要不, 你说个具体的问题, 大家给你看看用json如何表示?

【在 N******K 的大作中提到】
: 举个例子?
avatar
N*K
67
三角形mesh的数据结构:(triangle mesh)
(1)一群点集合 (vetex point)
每个点有很多属性 比如 亮度 方向 等等
(2)一群三角形集合 (cell/face)
每三个点构成一个三角形
每个三角形有很多属性 比如 面积
整个mesh本身有全局属性 可能是好几个矩阵
mesh类要可以扩展 增加属性
这种怎么用json 表达三种mesh
BaseMesh
PolygonMesh
TriangleMesh

【在 B********e 的大作中提到】
: 网上例子挺多的。
: 要不, 你说个具体的问题, 大家给你看看用json如何表示?

avatar
B*e
68
VetexPoint {
"x":"..",
"y":"..",
"direction": "",
"brightness":"",
...
}
Triangle {
"p1": { Vetex Point },
"p2" : {Vetex Point },
"p3" : {Vetex Point },
"Area" : "",
...
}
Matrix {
"rows":"",
"columns":"",
"values":[{{Row}}, {{Row}}, ...]
}
TriangleMesh {
"CommonProperty1": {Matrix},
"CommonProperty2": {Matrix},
...
"Points" : [{Vetex Point}, {Vetex Point}, ...]
"Cells" : [{Triangle}, {Triangle}, ...]
}
JSON is just a representation of key-val pair structures.
Other key-val pair structures like PER/BER used in UMTS/LTE
like FIX/FASTFIX used by lots of finacial exchanges.

【在 N******K 的大作中提到】
: 三角形mesh的数据结构:(triangle mesh)
: (1)一群点集合 (vetex point)
: 每个点有很多属性 比如 亮度 方向 等等
: (2)一群三角形集合 (cell/face)
: 每三个点构成一个三角形
: 每个三角形有很多属性 比如 面积
: 整个mesh本身有全局属性 可能是好几个矩阵
: mesh类要可以扩展 增加属性
: 这种怎么用json 表达三种mesh
: BaseMesh

avatar
N*K
69
如果要动态删除添加点和三角形 怎么办?
另外你这个matrix 只是数据 如何变为可以定义加减乘除的类?

【在 B********e 的大作中提到】
: VetexPoint {
: "x":"..",
: "y":"..",
: "direction": "",
: "brightness":"",
: ...
: }
: Triangle {
: "p1": { Vetex Point },
: "p2" : {Vetex Point },

avatar
B*e
70
As you said, the JSON (like tha matrix) is just the data part.
How about separate the operation away from the data?
starting from
--> deserialized into the operation class
--> do any operations in the class
--> serialized back to .

【在 N******K 的大作中提到】
: 如果要动态删除添加点和三角形 怎么办?
: 另外你这个matrix 只是数据 如何变为可以定义加减乘除的类?

avatar
N*K
71
serialize / deserialize 就得复制数据吧?

【在 B********e 的大作中提到】
: As you said, the JSON (like tha matrix) is just the data part.
: How about separate the operation away from the data?
: starting from
: --> deserialized into the operation class
: --> do any operations in the class
: --> serialized back to .

avatar
B*e
72
yes. you are right. It means the data copy is needed.

【在 N******K 的大作中提到】
: serialize / deserialize 就得复制数据吧?
avatar
N*K
73
是不是这样
matrix 得设计两个类
JsonMatrix 用来存取数据
MathMatrix 用来做运算
两者之间交流通过互相复制数据

【在 B********e 的大作中提到】
: yes. you are right. It means the data copy is needed.
avatar
N*K
74
这个每个点的坐标 你用什么精度存? float or double?
可否加个选项 控制 json里面数据的精度?
datatype: double or float

【在 B********e 的大作中提到】
: VetexPoint {
: "x":"..",
: "y":"..",
: "direction": "",
: "brightness":"",
: ...
: }
: Triangle {
: "p1": { Vetex Point },
: "p2" : {Vetex Point },

avatar
B*e
75
全用double 行吗?

【在 N******K 的大作中提到】
: 这个每个点的坐标 你用什么精度存? float or double?
: 可否加个选项 控制 json里面数据的精度?
: datatype: double or float

avatar
Q*g
76
像是经典的Double dispatch pattern.
你大概是想 Dog process DogData, Cat process CatData; 当 Dog 遇上 CatData 或者
Cat 遇上 DogData 就用缺省的 Animal process AnimalData。试试
#include
class Animal;
class Data;
class Cat;
class CatData;
class Dog;
class DogData;
using namespace std;
class Data {
public:
virtual void process(const Animal* animal) const {
cout << "Default Data and Animal" << endl;
}
virtual void process(const Cat* animal) const {
process((const Animal*) animal);
}
virtual void process(const Dog* animal) const {
process((const Animal*) animal);
}
};
class Animal {
public:
virtual void process(const Data* data) const {
data->process(this);
}
};
class Cat : public Animal {
public:
virtual void process(const Data* data) const {
data->process(this);
}
};
class CatData : public Data {
public:
void process(const Cat* animal) const {
cout << "CatData and cat" << endl;
}
};
class Dog : public Animal {
public:
virtual void process(const Data* data) const {
data->process(this);
}
};
class DogData : public Data {
public:
void process(const Dog* animal) const {
cout << "DogData and Dog" << endl;
}
};
int main(int argc, char** argv) {
Dog dog;
Cat cat;
DogData dogData;
CatData catData;
dog.process(&dogData);
dog.process(&catData);
cat.process(&dogData);
cat.process(&catData);
}

【在 p*********r 的大作中提到】
: 假设有个base class叫Animal
: derived class包括Cat,Dog等等
: class Cat: public Animal {
: ...
: };
: 现在希望在Animal里定义一个成员函数,比如叫processData
: 其作用是处理一些各种动物共通的数据,比如身高体重之类的
: 其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
: class的member variable
: 而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其

avatar
N*K
77
你的意思 json里面数据精度必须是定好的 不可以选择 类似c++模板?
我现在有很多c++模板类 我自己搞了一个类似json的格式
josn文件本身存储类的大概信息,具体数据放到另外一个文件
比如
matrix.json 只存储 行 列 的个数 以及数字精度是double还是float还是int
martrix.josn.data 存储具体的数字
这样得用好多文件
是否可以放在一个json里面?

【在 B********e 的大作中提到】
: 全用double 行吗?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。