嗯•••不知道您們教過變數的 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 成員函數•••。
可能會更貼近現實生活的狀況,不過好像太複雜了。