class 指標的問題

2009-11-28 1:11 am
我寫了一個簡單的class,遇到了一個問題希望有人能指點一下

class Drink
{
private:
string name;
int quantity;
int price;
public:
void setName(string n);
void setQuantity(int q);
void setPrice(int p);
string getName();
int getQuantity();
int getPrice();
};
Drink d1,d2;
d1.setName("可口可樂");
d1.setQuantity(375);
d1.setPrice(20);
...
...
這裡我ㄧ開始先設定好了 名稱 容量 價格
可是不實用,我想改成 能讓自己輸入設定
不過 d1 d2是飲料的種類,本來想要用for來循迴設定
可是一直卡住...希望有人能指點一下
如果可以用C++ 指標 更好

回答 (4)

2009-11-28 11:20 pm
✔ 最佳答案
// IDE: Visual C++
// 迴圈輸入設定值
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
// 類別名稱通常以 C 為開頭
class CDrink
{
public:
CDrink(string name, int quantity, int price)
{
this->m_name = name;
this->m_quantity = quantity;
this->m_price = price;
}
void print(void)
{
cout<<this->m_name<<", ";
cout<<this->m_quantity<<", ";
cout<<"$"<<this->m_price<<".-"<<endl;
}
private:
// 資料成員通常以 m_ 為開頭
string m_name;
int m_quantity;
int m_price;
};
// STL container
// 自 STL vector 繼承
class CVcd: public vector<CDrink>
{
public:
// 增加列印函式
void print(void)
{
// 迭代器:類似陣列的指標
for ( CVcd::iterator it = this->begin(); it != this->end(); it ++)
{
it->print();
}
}
};
typedef CVcd Vcd;
void main(void)
{
Vcd vcd;
bool bWhile = true;
// 持續輸入
while ( bWhile )
{
string name, ans;
int quantity, price;
cout<<"Input name: ", cin>>name;
cout<<"Input quantity: ", cin>>quantity;
cout<<"Input price: ", cin>>price;
// 物件放入容器儲存
vcd.push_back(CDrink(name, quantity, price));
cout<<"Continue? [Y/N]", cin>>ans;
switch ( ans[0] )
{
case 'n':
case 'N':
bWhile = false;
break;
}
}
vcd.print();
system("PAUSE");
}



2009-11-28 17:55:09 補充:
我張貼的程式碼,裡頭只用了類別與繼承,以及 STL。

在程式碼裡,我把所有的飲料(物件)集合在同一個 vector 內,其實這個 vector 與 C 語言的陣列相類似。

你要寫成 d1(飲料一)與 d2(飲料二)也是可以的,但是直接宣告成物件,或是宣告成指標,這兩種看起來其實相同,只是先 new d1,用完後還要 delete d1,多一個動作而已。

通常寫 C++ 宣告物件時,尤其是大型程式,最好是盡量避免編寫指標的部分,除非程式有特殊的需求,或是你有信心可以掌控程式整體的指標部分。
2009-12-01 5:45 am
C 之所以能揚名立萬,指標絕對是不可缺少的要素!
用指標,可打破蕃籬,以貼近組語的程式碼存取記憶體,所以能「快」,
指標還有其他特異功能的優點,所以可以用來寫OS。
因此,我支持且贊同 Jacob大 的論點。
2009-11-30 3:24 am
class function 內,非必要,不要加 this->
STL 知道就好,不要爛用、也不必花太多心思去學!

2009-11-29 19:24:50 補充:
class 裡的 印出,也是鼓勵使用 printf,少用 cout

2009-11-29 19:35:29 補充:
尤其是大型程式,最好是盡量 〝大量使用〞指標!

2009-11-30 08:10:13 補充:
我說過 N次了。
我不笑初學者的!

每個人的能力、專長、時間,都有限。
對過去沒機會好好專研的領域裡,
每個人都是初學者。

我看不起井底蛙!
 自己為高手,其實是肉腳!
 被指出錯誤,仍不認錯!甚至
  強詞奪理!
  找人/找分身對罵!
  找人/找分身作票!
在這裡被我罵的,都是這種人。

2009-11-30 08:39:56 補充:
常在這裡看我胡說八道的,應該知道:我會超過 20種 程式語言。

但,真的差不多可以不用找資料就可以寫一個〝好〞程式出來的,
目前剩下不到 5種。
其它超過15種,『有的』可能慘到下只看得懂一般的程式在寫什麼。
別說是
 除錯
 自己寫一個
 寫個好的
 給人好建議
了。

我就學過 ForTran 一年。
 我的程式作業,每個都是:
  主動要求:機上驗收!
  驗收時,沒放過砲!
  助教看得傻眼!
  都是 100分!沒有 99 這種東西!
 學年成績,90,我很不爽!
 資工的同學看到,說:從沒聽說系上有給外系學生90分或以上的!
如今,誰看過我在這裡答 ForTran 的問題?

2009-11-30 08:40:34 補充:
術業有專攻。
說不定,因程式能力不強而被我看不起的某人,他是修車專長、某醫學全權!
我在這裡笑他:井底蛙!
哪天,我車/身體壞了,他說:
 Jacob, 抱歉,我是井底蛙,不會修車/身體,請另請高明!

但,在程式領域明明不是高手,卻一付高手姿態,那就不同!
我,雖然不弱,真能排到全台(別說全世界)前 1000大高手?
別傻了!
連我這1000以外的人,一看就這裡不對、那裡錯!
何況 Top 10 的人!你要他們怎麼看?

同樣,我不是醫學專長。
你在我懂的部份,都胡說八道;
在我不懂的部份,我怎能相信:你說的是對的?


知之為知之,不知為不知,是知也。
共勉之。

2009-11-30 08:46:04 補充:
你現在是學生。
學生,當然是不會,不然,為何要學?

學生犯錯,理所當然!
因為:就是不會嘛!

等畢業了,還這不會,那給人指導錯,怎麼辦?

= = = =

在學時,趕快把一堆人沒好好學、造成一直出錯、變成惡名昭彰的指標學好!
指標速度很快!
大型程式,不用指標,就算演算法再好,也不會多快!

建議你大型程式不要用用指標的,一定是指標沒學好的人!
那絕對是錯誤教導!

趁現在,多學多做,錯中學!
趕快把指標學好!
免得畢業後指標學不好,誤指導人:不要用指標!
2009-11-29 12:24 am
不能補充...我打在意見這裡

2009-11-28 16:24:43 補充:
TO :耗呆小綿羊 大大
看了好久 還是很難懂...好多都還沒看過...最近會找書來翻翻
之後 我有寫成

2009-11-28 16:24:55 補充:
cout<<"輸入(1)飲料名稱=";
cin >>n1;
d1.setName(n1);

cout<<"輸入(1)飲料容量=";
cin >>q1;
d1.setQuantity(q1);

cout<<"輸入(1)飲料價格=";
cin >>p1;
d1.setPrice(p1);
cout<


2009-11-28 16:26:32 補充:
這樣寫可以嗎?
我現在想 d1 d2的總類 也想要自己加
可是不能用for來解決,想說是不是要用 指標呢?

2009-11-29 20:35:24 補充:
TO : jacob lee & 耗呆小綿羊
this-> 其實我用的編譯器看不懂(dev c)...
其實這題,老師有跟我說用 *d 就可以解決了
完整的code 在這 :
http://docs.google.com/Doc?docid=0AWTf40cMI_QMZGdxYnY1Z25fM2NxampjdmNz&hl=zh_TW

因為我用for迴圈無法解決 Drink d1,d2; 用手動輸入需要的飲料總類
就是 可以輸入 到底要幾種的 飲料(d1 d2 d3....)

2009-11-29 20:39:24 補充:
會寫成這樣,主要是上到class,還有之後我會再加上其他功能
希望 jacob lee 大大不要見笑

2009-11-30 10:07:01 補充:
TO : jacob lee,好犀利

2009-12-01 00:21:34 補充:
各位不好意思,我沒發現 我沒放成功文件
程式原稿在這
http://docs.google.com/View?id=dgqbv5gn_3cqjjcvcs

因為我現在還不是很清楚 Call by reference popointer...等用法
所以還是改不出來...
請各位不另賜教,謝謝


收錄日期: 2021-04-27 17:17:13
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20091127000016KK04940

檢視 Wayback Machine 備份