由买买提看人间百态

topics

全部话题 - 话题: animaldata
(共0页)
p*********r
发帖数: 40
1
假设有个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类型的referenc... 阅读全帖
B********e
发帖数: 1062
2
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
发帖数: 1062
3
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
}
};
k***e
发帖数: 1931
4
也许理解的不对。CatData从AnimalData继承,那么CatData is a AnimalData,
processData使用(AnimalData*)作为参数,在Cat类中用RTTI判断指针指向的对象是
不是一个CatData不就行了吗?
G**U
发帖数: 180
5
是我没弄懂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);... 阅读全帖
K*******g
发帖数: 26
6
如果Animal, Cat, AnimalData, CatData这样结构定死了确实很难办,但一般很难办的
时候都说明结构本身有问题。在我看来CatData继承AnimalData不是很合适,因为从命
名上说这两个都只是一组数据,没有成员函数的话享受不到继承带来的多态性。
如果可以的话建议改成以下类:
AnimalBasicData:所有动物都有的数据
AnimalXSpecificData:X特有数据
AnimalData {
enum AnimalType{...}
AnimalType type;
AnimalBasicData *basic;
AnimalXSpecificData *xdata;
AnimalYSpecificData *ydata;
...
}
仅供参考:)
N******K
发帖数: 10202
7
AnimalData 能覆盖所有情况?
B********e
发帖数: 1062
8
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
N******K
发帖数: 10202
9
怎么设计这个基于Json格式的 AnimalData?
这个想法挺好 能仔细展开讲讲么?

format.
B********e
发帖数: 1062
10
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.
Q**g
发帖数: 183
11
像是经典的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);
}
... 阅读全帖
(共0页)