StupidBeauty
Read times:3177Posted at:Sun Oct 1 11:45:12 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:2.7由对象组成的数组,2.7 Arrays of Objects

就像可以定义由内置数据类型组成的数组一样,我们也可以定义由对象组成的数组,其中,所有的元素都是属于同一个类。该数组中,每个元素都是该类的一个对象。能够声明由对象组成的数组,这一点,就相当于再强调了一次,这个事实:一个类,与一个类型是类似的。

声明由对象组成的数组

要创建由Frame 对象组成的数组,最简单的方式即是,按照以下方式来声明:

Frame windowList[5];     // 一个数组,其中包含 5 Frame对象

在以这种方式声明由对象组成的数组的过程中,狠重要的一点就是,数组中的所有对象,都必须以相同的方式来构造。在这种声明语句中,无法为数组中的每个不同的对象提供不同的构造参数值。并且,由于未提供任何构造函数参数,所以,这个类中,必须包含一个不带参数的构造函数。在以下情况下,这种形式的数组狠有用:所有的对象应当按照统一的方式来构造;或者,“真正的”构造函数信息,目前尚是未知,需要在日后进行一些计算才能得知。在后面一种情况下,可以先声明数组,并在日后获取到对应的信息之后再对其中具体的对象做操作。例如,我们可能需要由用户提供某个文件的文件名,该文件中包含着windowList 中各个对象的预期位置和形状。我们可在稍后读取这个信息,并对应地将各个数组元素移动到对应的位置,改变成对应的大小。

在其它情况下,可能会要求数组中的每个对象都不一样,要在声明数组时对每个元素进行单独的构造。对于这个要求,可按照以下方式来实现:

Frame windowList[5] = {Frame("Window 0",    0, 100, 100, 100),

Frame("Window 1",   25, 100, 100, 100),

Frame("Window 2",   50, 100, 100, 100),

Frame("Window 3",   75, 100, 100, 100),

Frame("Window 4",  100, 100, 100, 100)

};

在这个数组中,每个对象,都是使用显式指定的构造函数参数值来构造的。这样,程序猿就能够对数组中对象的初始化过程进行完全的控制。

如果类中提供了重载的构造函数,比如说Frame 类就有重载的构造函数,那么,就不需要明确指定所有的构造函数参数了。数组中的对象,可以使用它的任意一个构造函数来构造。举个例子,如果只需要为数组中每个对象指定名字和初始位置,而无需指定形状的话,那么,以下声明就足够了:

Frame windowList[5] = {Frame("Window 0",    0, 100),

Frame("Window 1",   25, 100),

Frame("Window 2",   50, 100),

Frame("Window 3",   75, 100),

Frame("Window 4",  100, 100)

};

在这种情况下,重载的构造函数会自行确定每个对象的形状。另外,也可以为每个对象使用不同的构造函数,如下所示:

Frame windowList[5] = {Frame("Window 0",    0, 100, 100, 100),

Frame("Window 1",   25, 100),

Frame("Window 2"),

Frame(),

Frame("Window 4",  100, 100, 100, 100)

};

在这个版本中,第一个和最后一个对象,都是通过显式提供所有的构造函数参数的方式来构造的。对于名为"Window 1"的对象,其构造函数中只指定了位置。对于名为"Window2"的对象,其构造函数中只指定了名字。在下标为3 处的那个对象,其构造函数中未指定任何的构造函数参数,使得,全部的参数都使用默认值,包括名字也使用默认值。

操作数组中的对象

数组 中的对象,可通过配套使用下标操作符 [] (用于选中数组 中要操作的对象 )和小数点操作符(用于 将对应的操作应用到选中的对象上 )来进行操作。例如

windowList[3].MoveTo(100, 50);

会将下标为 3 的对象移动到新的位置。(记住,下标以0 开始。)

在使用由对象组成的数组时,一个好处就是,可以轻易地通过编程来对所有对象执行相同的操作。例如,按照以下代码,即可在单个循环中将所有窗口的大小缩小 10%:

for (int i=0; i<5; i++)

windowList[i].Resize(0.9);

同样地,也可以对数组中的元素执行更复杂的操作。例如,以下循环中,将所有窗口按照从左上角到右下角的对角线排列,并将它们的尺寸设置成相同大小:

for (int i=0; i<5; i++) {

windowList[i].MoveTo(10*i+1, 10*i+1);

windowList[i].Resize(50, 50);

}

任务

  1. 1.妳认为,有没有可能创建一个由对象组成的二维数组?编写一个小的测试程序来验证妳的理论。

  2. 2.框之波:编写一个程序,其中有10个窗口。这些窗口,形状相同,水平方向对齐,相邻窗口的竖直连线紧紧挨在一起。从左到右,每个窗口中都显示一个数字,从1 到10。在每一“波”中,从最左边的窗口开始,依次向上移动,再回到原来的位置。将这种波动重复若干次。在这个版本中,声明数组的时候,使用不带参数的构造函数。

  3. 3.修改前面的“框之波”程序,对于数组中的每个对象,在构造函数中都指定全部的参数。

  4. 4.对前面任一个“框之波”程序进行修改,使得,当前面一波动作到达中间的窗口时,就启动下一波动作。

  5. 5.移动的球:编写一个程序,其中有10个窗口,全部是相同的尺寸,并且排成水平的一行或者竖直的一列。在第一个(最左边或最上边)窗口中,画出一个圆。这个圆,应当从当前窗口移动到下一个窗口。当它到达最后一个(最右边或最下边)窗口之后,又再出现在第一个窗口中。将这个过程无限重复。

  6. 6.对角棋:编写一个程序,其中有10个窗口。其中9个窗口(游戏窗口)按照3乘3的网格排列,第10个窗口(重置窗口)放置在旁边。初始状态下,所有的游戏窗口都是空白的。当用户在某个空白的游戏窗口中点击鼠标左键时,就会在其中出现一个"O"或"X",第一个出现的是"O",之后就交替出现。利用一个圆来表示"O",利用两条线段来表示"X"。如果所点击的游戏窗口不是空白的,那么,没有效果。点击第10个窗口,会导致,所有的游戏窗口变成空白。

  7. 7. 跳蛤蟆:编写一个程序,其中有5个窗口,所有窗口的尺寸相同,y 坐标相同。第一个窗口,放置在屏幕的左边缘附近。第二个窗口,放置在第一个窗口右侧,并与第一个窗口重叠一部分;第三个窗口也是类似,放置在第二个窗口右侧,并重叠一部分;依此类推。在接下来的迭代过程中,最左侧的窗口,移动到最右侧窗口的右侧,并且重叠一部分。刚刚发生移动的窗口,现在变成新的最右侧窗口。继续将这种移动进行若干次。

異星引力

这场悲剧的受害者人数仍在统计中

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands