当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 这个怎么解释?
帖子发表于 : 2009-07-31 21:31 

注册: 2008-11-14 20:35
帖子: 259
送出感谢: 0 次
接收感谢: 1
源代码附在后面:

请特别注意,set_object函数的声明(第127、135、142行)不可放置在程序区块(即{}
中)的第一行,所以第126、134、141的空行是刻意的,如果放置在第一行,将无法正常
声明函数而产生错误的结果。

我不懂这句话的意思,但我就偏偏那么做,也没发现有什么不一样。我用的编译器是GCC。

源代码:

1 /*
2 * =====================================================================================
3 *
4 * Filename: eg_16.7.cpp
5 *
6 * Description:
7 *
8 * Version: 1.0
9 * Created: 2009年07月30日 21时29分29秒
10* Revision:
11* Compiler: gcc
12*
13* Author:
14* Company: University of Science and Technology of China
15* Copyright: Copyright (c) 2009
16*
17*=====================================================================================
18*/
19
20
21 #include<iostream>
22 #include<cstring>
23 #include<typeinfo>
24
25 using namespace std;
26
27 class person;
28
29 class object
30 {
31 protected:
32 char color[10];
33 char type[10];
34 public:
35 object(char * o_type, char * o_color)
36 {
37 strcpy(type, o_type);
38 strcpy(color, o_color);
39 }
40
41 object() {}
42 virtual void set_object(person & a_person)
43 {
44 cout << "The set_object(person & a_person) of object is called!" << endl;
45 }
46 };
47
48 class clothes;
49 class pants;
50 class shoes;
51
52 class person
53 {
54 protected:
55 char last_name[5];
56 char first_name[15];
57 clothes * my_clothes;
58 shoes * my_shoes;
59 pants * my_pants;
60 friend class clothes;
61 friend class shoes;
62 friend class pants;
63 public:
64 person(const char * l_name, const char * f_name)
65 {
66 strcpy(last_name, l_name);
67 strcpy(first_name, f_name);
68 }
69
70 void wear(object *);
71 void show_data();
72 };
73
74 class clothes : public object
75 {
76 private:
77 friend class person;
78 public:
79 clothes(char * type, char * color) : object(type, color) {}
80
81 void set_object(person & a_person)
82 {
83 cout << "The set_object() of clothes is called!" << endl;
84 a_person.my_clothes = this;
85 }
86
87 };
88
89 class pants : public object
90 {
91 private:
92 friend class person;
93 public:
94 pants(char * type, char * color) : object(type, color) {}
95
96 void set_object(person & a_person)
97 {
98 cout << "The set_object() of pants is called!" << endl;
99 a_person.my_pants = this;
100 }
101 };
102
103 class shoes : public object
104 {
105 private:
106 friend class person;
107 public:
108 shoes(char * type, char * color) : object(type, color) {}
109
110 void set_object(person & a_person)
111 {
112 cout << "The set_object() of shoes is called!" << endl;
113 a_person.my_shoes = this;
114 }
115 };
116
117 void person::wear(object * object_ptr)
118 {
119 clothes * clothes_ptr;
120 pants * pants_ptr;
121 shoes * shoes_ptr;
122
123 clothes_ptr = dynamic_cast<clothes * > (object_ptr);
124
125 if (clothes_ptr != 0){
126
127 clothes_ptr->set_object(*this);
128 }
129 else
130 {
131 pants_ptr = dynamic_cast<pants *>(object_ptr);
132
133 if (pants_ptr != 0){
134
135 pants_ptr->set_object(*this);
136 }
137 else
138 {
139 shoes_ptr = dynamic_cast<shoes *>(object_ptr);
140 if (shoes_ptr != 0){
141
142 shoes_ptr->set_object(*this);
143 }
144 else{
145
146 object_ptr->set_object(*this);
147 }
148 }
149 }
150 }
151
152 void person::show_data()
153 {
154 cout << endl << "My name is " << first_name << " " << last_name << "." << endl;
155 cout << " I wear " << my_clothes->color << " " << my_clothes->type;
156 cout << ", " << my_pants->color << " " << my_pants->type;
157 cout << " and " << my_shoes->color << " " << my_shoes->type << "." << endl;
158 }
159
160 int main()
161 {
162 person John("John", "Kuo");
163 object a_object;
164 clothes a_clothes("T-shirt", "white");
165 pants a_pants("short", "green");
166 shoes a_shoes("gymshoe", "blue");
167
168 cout << "The first testing......" << endl;
169 John.wear(&a_object);
170
171 cout << endl << "The second testing......" << endl;
172 John.wear(&a_clothes);
173 John.wear(&a_pants);
174 John.wear(&a_shoes);
175
176 John.show_data();
177
178 return 0;
179 }
180
181


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-07-31 21:34 
头像

注册: 2008-12-13 19:39
帖子: 13284
地址: 物华天宝人杰地灵
送出感谢: 1
接收感谢: 6
路过帮顶吧,你的排版。。。 :em03


_________________
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-08-01 10:15 

注册: 2006-03-10 15:10
帖子: 3182
地址: xi'an China
送出感谢: 0 次
接收感谢: 2
引用:
请特别注意,set_object函数的声明(第127、135、142行)不可放置在程序区块(即{}
中)的第一行,所以第126、134、141的空行是刻意的,如果放置在第一行,将无法正常
声明函数而产生错误的结果。


你在哪儿看到的这种错误说法呢?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-08-01 12:02 

注册: 2007-10-27 1:04
帖子: 403
送出感谢: 0 次
接收感谢: 1
楼主,你看的代码是哪本书里的?

介绍下,看起来还不错。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-08-01 12:16 

注册: 2007-10-27 1:04
帖子: 403
送出感谢: 0 次
接收感谢: 1
代码:
001 /*
002 * =====================================================================================
003 *
004 * Filename: eg_16.7.cpp
005 *
006 * Description:
007 *
008 * Version: 1.0
009 * Created: 2009年07月30日 21时29分29秒
010 * Revision:
011 * Compiler: gcc
012 *
013 * Author:
014 * Company: University of Science and Technology of China
015 * Copyright: Copyright (c) 2009
016 *
017 *=====================================================================================
018 */
019
020
021 #include<iostream>
022 #include<cstring>
023 #include<typeinfo>
024
025 using namespace std;
026
027 class person;
028
029 class object
030 {
031 protected:
032     char color[10];
033     char type[10];
034 public:
035     object(const char * o_type, const char * o_color)
036     {
037         strcpy(type, o_type);
038         strcpy(color, o_color);
039     }
040     object() {}
041
042     virtual ~object() {}
043     virtual void set_object(person & a_person)
044     {
045         cout << "The set_object(person & a_person) of object is called!" << endl;
046     }
047 };
048
049 class clothes;
050 class pants;
051 class shoes;
052
053 class person
054 {
055 protected:
056     char last_name[5];
057     char first_name[15];
058     clothes * my_clothes;
059     shoes * my_shoes;
060     pants * my_pants;
061     friend class clothes;
062     friend class shoes;
063     friend class pants;
064 public:
065     person(const char * l_name, const char * f_name)
066     {
067         strcpy(last_name, l_name);
068         strcpy(first_name, f_name);
069     }
070
071     void wear(object *);
072     void show_data();
073 };
074
075 class clothes : public object
076 {
077 private:
078     friend class person;
079 public:
080     clothes(const char * type, const char * color) : object(type, color) {}
081
082     void set_object(person & a_person)
083     {
084         cout << "The set_object() of clothes is called!" << endl;
085         a_person.my_clothes = this;
086     }
087
088 };
089
090 class pants : public object
091 {
092 private:
093     friend class person;
094 public:
095     pants(const char * type, const char * color) : object(type, color) {}
096
097     void set_object(person & a_person)
098     {
099         cout << "The set_object() of pants is called!" << endl;
100         a_person.my_pants = this;
101     }
102 };
103
104 class shoes : public object
105 {
106 private:
107     friend class person;
108 public:
109     shoes(const char * type, const char * color) : object(type, color) {}
110
111     void set_object(person & a_person)
112     {
113         cout << "The set_object() of shoes is called!" << endl;
114         a_person.my_shoes = this;
115     }
116 };
117
118 void person::wear(object * object_ptr)
119 {
120     if ( object_ptr ) {
121         object_ptr->set_object(*this);
122     }
123 }
124
125 void person::show_data()
126 {
127     cout << endl << "My name is " << first_name << " " << last_name << "." << endl;
128     cout << " I wear " << my_clothes->color << " " << my_clothes->type;
129     cout << ", " << my_pants->color << " " << my_pants->type;
130     cout << " and " << my_shoes->color << " " << my_shoes->type << "." << endl;
131 }
132
133 int main()
134 {
135     person John("John", "Kuo");
136     object a_object;
137     clothes a_clothes("T-shirt", "white");
138     pants a_pants("short", "green");
139     shoes a_shoes("gymshoe", "blue");
140
141     cout << "The first testing......" << endl;
142     John.wear(&a_object);
143
144     cout << endl << "The second testing......" << endl;
145     John.wear(&a_clothes);
146     John.wear(&a_pants);
147     John.wear(&a_shoes);
148
149     John.show_data();
150
151     return 0;
152 }


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-08-02 17:09 

注册: 2008-11-14 20:35
帖子: 259
送出感谢: 0 次
接收感谢: 1
dbzhang800 写道:
引用:
请特别注意,set_object函数的声明(第127、135、142行)不可放置在程序区块(即{}
中)的第一行,所以第126、134、141的空行是刻意的,如果放置在第一行,将无法正常
声明函数而产生错误的结果。


你在哪儿看到的这种错误说法呢?

《Linux C/C++入门与进阶》


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 这个怎么解释?
帖子发表于 : 2009-08-02 17:53 
头像

注册: 2008-06-18 22:02
帖子: 186
送出感谢: 0 次
接收感谢: 1
不明白,可能是中文翻译出了问题

首先,要分清楚函数的声明(declaration)和函数的调用(calling),程序中set_object在类中的是定义(defination)
再次,程序中126,134, 141三行也并非空行,无特别之处


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译