新手求助,如何定义类

链之炼金术师 2012-02-16 03:09:48
初学c++,感觉类的思想很好很强大。现在遇到一个问题,请大牛们指教。
问题描述:现在有100个人(小明,小红,大雄......),对于每个人,都有10种行为(吃饭,睡觉......)。
问题1:我是用人定义类,行为作为成员函数,还是用行为定义类,人作为成员函数好?(主要从但不限于以下方面:编写这些类的开发时间和难易程度,人和行为增减时对类的维护难易程度。)
问题2:上述的100和10如果数字变化了,如10个人,每人100种行为,情况又如何。有没有完备性的指导(即涵盖各种数字组合)。
如果大牛们能给出这种问题相关资料那就更好了,拜谢!
第一种方法:
class people
{
public:
void eat(){省略......};
void sleep(){省略......};
......
};
class xiaoming:public people;
省略重写某些行为的代码......

省略其它99个派生类代码......

在调用时
xiaoming realxiaoming;
realxiaoming.eat();

还是
class eat
{
void xiaoming(){省略......};
void xiaohong(){省略......};
省略其它98个人......
}

省略其它9种行为类的代码......

调用时
eat realeat;
realeat.xiaoming();
...全文
150 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
链之炼金术师 2012-02-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

多少个人不是重点,因为类的对象的个数可以随时变化
我认为行为也可以是类,人“类”有行为“类”的对象
[/Quote]
我想到了,第二种方法的行为也可以定义一个基类。
class behave
{
public:
void xiaoming();
...
};

class eat:public behave
...

eat realeat;
realeat.xiaoming();

然后这样和第一种比较哪种更好一些?还是都可以。
sagegz 2012-02-17
  • 打赏
  • 举报
回复
用继承。
ouyh12345 2012-02-17
  • 打赏
  • 举报
回复
多少个人不是重点,因为类的对象的个数可以随时变化
我认为行为也可以是类,人“类”有行为“类”的对象
一丝晨光 2012-02-17
  • 打赏
  • 举报
回复
问题1:我是用人定义类,行为作为成员函数,还是用行为定义类,人作为成员函数好?(主要从但不限于以下方面:编写这些类的开发时间和难易程度,人和行为增减时对类的维护难易程度。):

按照面向对象的基本思想,在这种情况下,应该人定义为类,行为作为成员函数;这是对象行为基本定义决定的;
但是,项目的需求可能有所变化,那么上面的思路不是一定的;
如果行为作为类也行,那么它的成员函数就应该是
小明式的吃法
小明式的睡觉方式
。。。

那么人是不能作为行为的方法的(理论可行,但是可能99%的程序员都不理解),上面说的这样是可行的。


问题2:上述的100和10如果数字变化了,如10个人,每人100种行为,情况又如何。有没有完备性的指导(即涵盖各种数字组合)。

数字的变化不能让面向对象的基本思想变化;
不能仅仅根据数字的变化改变了一般程序员的设计思路,不能让代码很难懂,但是似乎完成了工作;
不管多少人,多少中行为,面向对象的思维都可以恰当地分离其中最核心的东西,封装成一个一个的类,
或者一层又一层的类,来解决最终的问题

适合新手的教程,我自己也在学,以下是部分学习笔记 69 函数指针 70 动态内存分配 Dynamic memory pointer = new type pointer = new type [elements] 第一个表达式用来给一个单元素的数据型分配内存。第二个表达式用来给一个数组分配内存。 例如: int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. }; delete pointer; delete [ ] pointer; 在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h 因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。 函数malloc void * malloc (size_t nbytes); char * cp; cp = (char *) malloc (10); int * bobby; bobby = (int *) malloc (5 * sizeof(int)); 这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是 2,4或更多字节 数,取决于程序是在什么操作系统下被编译的。 int * bobby; bobby = (int *) calloc (5, sizeof(int)); malloc 和calloc的另一点不同在于calloc 会将所有的元素初始化为0。 它被用来改变已经被分配给一个指针的内存的长度。 void * realloc (void * pointer, size_t size); 参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size 用来指明新的内存长度。这个函数 给指针分配size 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要 求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函 数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针 pointer 及其内容保持不变。 函数 free 这个函数用来释放被前面malloc, calloc 或realloc所分配的内存块。 void free (void * pointer); 注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。 74 数据结构 76-78 结构指针(Pointers to structures) -> 这是一个引用操作符,常与结构或的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用: pmovie->title 来代替: (*pmovie).title 79 自定义数据型(User defined data types) typedef existing_type new_type_name; typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field [50]; 80 联合(Union) union mytypes_t { char c; int i; float f; } mytypes; 81 枚举Enumerations (enum) enum model_name { value1, value2, value3, . . } object_name; 例如,我们可以定义一种新的变量型叫做color_t 来存储不同的颜色: enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 注意在这个定义里我们没有使用任何基本数据型。换句话说,我们创造了一种的新的数据型,而它并没有基 于任何已存在的数据型:型color_t,花括号{}中包括了它的所有的可能取值。例如,在定义了colors_t 列举 型后,我们可以使用以下表达式: 84 (Class) (class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义的关键字为class ,其功能与C语言中的struct似,不同之处 是class可以包含函数,而不像struct只能包含数据元素。 定义的形式是: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; 其中 class_name 是的名称 (用户自定义型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含 成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个关键字中 任意一个:private:, public: 或 protected:。它们分别代表以下含义: ● private :class的private成员,只有同一个class的其他成员或该class的“friend” class可以访问这些成员。 ● protected :class的protected成员,只有同一个class的其他成员,或该class的“friend” class,或该class的子(derived classes) 可以访问这些成员。 ● public :class的public成员,任何可以看到这个class的地方都可以访问这些成员。 如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为 private范围。 以下是怎样读前面例子中出现的一些指针和操作符 (*, &, ., ->, [ ]): ● *x 读作: pointed by x (由x指向的) ● &x 读作: address of x(x的地址) ● x.y 读作: member y of object x (对象x的成员y) ● (*x).y 读作: member y of object pointed by x(由x指向的对象的成员y) ● x->y 读作: member y of object pointed by x (同上一个等价) ● x[0] 读作: first object pointed by x(由x指向的第一个对象) ● x[1] 读作: second object pointed by x(由x指向的第二个对象) ● x[n] 读作: (n+1)th object pointed by x(由x指向的第n+1个对象) 由关键字struct和union定义 不仅可以用关键字class来定义,也可以用struct或union来定义。 因为在C++中和数据结构的概念太相似了,所以这两个关键字struct和class的作用几乎是一样的(也就是说在C++中struct定义也可以有成员函数,而不仅仅有数据成员)。两者定义的唯一区别在于由class定义所有成员的默认访问权限为private,而 struct定义所有成员默认访问权限为public。除此之外,两个关键字的作用是相同的。 union的概念与struct和class定义不同, 因为union在同一时间只能存储一个数据成员。但是由union定义也是可以有成员函 数的。union定义访问权限默认为public。 94 操作符重载(Overloading operators) + - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ -- % & ^ ! | ~ &= ^= |= && || %= [] () new delete 96 this指针 97 静态成员(静态变量、静态函数)(Static members) 静态成员直接访问,不属于对象的成员 98 之间的关系(Relationships between classes) 友元函数(Friend functions) 101 的继承 记住,this 代表代码正在被执行的这一个对象的指针。 142 函数模块 154 出错处理 (Exception handling) 159 型转换高级 (Advacned Class Type-casting) 163 typeid 164 预处理指令 168 标准函数库
设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相 关的对象,以适当的粒度将它们归,再定义的接口和继承层次,建立对象之间的基本关 系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下 子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的。一个设计在最 终完成之前常要被复用好几次,而且每一次都有所修改。 有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总 是求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是 怎么回事。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢? 内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解 决方案。当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的 部分原因。因此,你会在许多面向对象系统中看到和相互通信的对象( c o m m u n i c a t i n g o b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复 用性更好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。
设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相
关的对象,以适当的粒度将它们归,再定义的接口和继承层次,建立对象之间的基本关
系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。
你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下
子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的。一个设计在最
终完成之前常要被复用好几次,而且每一次都有所修改。
有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总
求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是
怎么回事。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢?
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解
决方案。当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的
部分原因。因此,你会在许多面向对象系统中看到和相互通信的对象( c o m m u n i c a t i n g
o b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复
用性更好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。
一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧