PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   可以請問一下這程式的問題在哪嗎? (https://www.pcdvd.com.tw/showthread.php?t=341504)

poenxu 2004-06-05 12:04 PM

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
本來是想把上面的文章重新編輯的,可是伺服器不給我改~"~a...
只好重新另外po了
以下是我的程式碼↓
這是我宣告的一個物件.
首先我宣告了兩個字串陣列button_list和button_action.
再來呢,我在她的function定義了get_outside_button_list
此function是要印出button_list的第六跟第七字串.
可是每次印出的卻都是亂碼...
翻過課本也問過同學了,但是感覺上我看的課本對字串陣列的說明都很少.有一本甚至根本沒教怎麼宣告字串陣列.
其中一本的範例是
char string[4][20]=
{
{"abc"},
{"def"},
{"ghi"},
{"jkl"}
};
而當她cout<<string[3]<<endl;的時候,他的確可以印出jkl.
我的程式碼也跟她一樣(起碼在我看來是一樣...)
可是我的卻是亂碼,實在是令我頭大~"~a...
====================================================
代碼:
class button_class
{
	char button_list[7][20];
	char button_action[7][20];
public:	
	button_class()//建構
	{
		char button_list[7][20]=
		{			
			{"1F"},		//0
			{"2F"},		//1
			{"3F"},		//2
			{"開門"},	//3
			{"關門"},	//4
			{"往上"},	//5
			{"往下"}	//6
		};
		char button_action[7][20]=
		{			
			{"按下1F按鈕"},	//0
			{"按下2F按鈕"},	//1
			{"按下3F按鈕"},	//2
			{"按下開門按鈕"},	//3
			{"按下關門按鈕"},	//4
			{"按下往上按鈕"},	//5
			{"按下往下按鈕"}	//6			
		};
	}//建構結束
	void get_outside_button_list()
	{
	cout<<button_list[5]<<button_list[6]<<endl;
	}
};

=====================================================

8:5 2004-06-05 03:19 PM

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
嗯•••不知道您們教過變數的 scope(中文怎麼說?範圍?生命期?) 了沒?
先看一下以下的程式碼,注意到:x() 與 main() 都有「int a;」的宣告。
代碼:
void x() {
   int a;
   a=1;
   cout << a;   // a 是 x() 的區域變數(==1)。
}

main() {
   int a;
   a=0;
   cout << a;    // a 是 main() 的區域變數 (==0)。
}


如果您同意上面出現在 main() 跟 x() 裡的 a 是不同變數的話,
那就可以很清楚的看到,在下面您的程式裡•兩個黃色顯示的 button_list 是不同的變數 (同樣的狀況也發生在 button_action)。

代碼:
class button_class
{

	char button_list[7][20];

	char button_action[7][20];
public:	
	button_class()//建構
	{

		char button_list[7][20]=
		{			
			{"1F"},		//0
			{"2F"},		//1
			{"3F"},		//2
			{"開門"},	//3
			{"關門"},	//4
			{"往上"},	//5
			{"往下"}	//6
		};

		char button_action[7][20]=
		{			
			{"按下1F按鈕"},	//0
			{"按下2F按鈕"},	//1
			{"按下3F按鈕"},	//2
			{"按下開門按鈕"},	//3
			{"按下關門按鈕"},	//4
			{"按下往上按鈕"},	//5
			{"按下往下按鈕"}	//6			
		};
	}//建構結束
	void get_outside_button_list()
	{
	cout<<button_list[5]<<button_list[6]<<endl;
	}
};

所以呢?您先想想好了••,

註1:
如果可以在宣告成員變數的時候同時設定值,就不需要在建構式做這些事了。
不過,您之前提到成員變數不能在宣告的時候同時設定值 (太久沒用,不大清楚),
如果真是這樣的話,只好在建構式作值的設定。
但要設定二維陣列的值,好像沒有簡單的、內建的指令或函數,
也許您就只能使用類似於 harrisonlin 提到的方法了。

如果這個變數可以給同一個類別的所有物件共用的話,
您也可以使用靜態成員變數,那就可以在宣告的時候設定初值了。
(使用全域變數當然也可以達到相同效果,不過有違封裝原則)

註2:
另一個問題很難答,如果要仿效現實生活中的狀況•••
先想一下,使用者需不需要知道電梯目前在幾樓 → 不需要。
(所以電梯目前的所在樓層設為 private 有點道理)
但電梯系統需不需要知道幾樓有人按鈕了 → 需要。
(所以?嗯•••我想清楚再說吧•••)

edited:
也許,可以替電梯系統加一個 public 成員函數 invite(int f, int up_down),
使用者類別加上 up()/down() 兩個 public 成員函數表示使用者要上或下。
當 user.up() 或 user.down() 被呼叫時,即以本身“所在樓層”及“往上或往下”當參數,執行 elevator_invite(x,x)•••
也有想過更複雜的方式,另外設定樓層類別 floor,並建立三個物件 f[0], f[1], f[2] 分別表示 1-3 樓,
樓層物件有 public 成員函數 up()/down() 供使用者呼叫,當 f[1].up() 被執行的時候,便會•••如此就不需要使用者設定個 public 成員函數•••。
可能會更貼近現實生活的狀況,不過好像太複雜了。


所有的時間均為GMT +8。 現在的時間是02:47 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。