2012-11-13 156 views
1

我想使指針數組保存該類中的對象的地址,因此當我調用掃描器函數時,它將讀取pcode並搜索對象具有相同的pcode。我宣佈數組錯了嗎?還是我誤解了靜態概念?或者是其他東西 ?指針數組C++

反正我猜必須張貼整個代碼

#include <string> 
using namespace std; 
class product{ 
    public: 
     product(); 
     product(long&,string&); 
     void setCode(); 
     void getCode(long); 
     void static scanner(); 
     void const printer(); 
     static product *point[3]; 
     static int a; 
    private: 
     string pname; 
     long pcode; 

};/* 
class PrepackedFood:public product{ 
    public: 
     PrepackedFood(long&, string&,double); 
    private: 
     double uPrice; 
}; 
class FreshFood:public product{ 
    public: 
     FreshFood(long&,string&,double,double); 
    private: 
     double weight; 
     double pricepk; 

};*/ 


#include "product.h" 
#include <iostream> 
product::product(){pcode=0;pname="unknown"; 
point[a]= this; 
a++;} 
product::product(long& c,string&n){pcode=c;pname=n; 
} 
//void const product::printer(){cout<<getCode()} 
void product::setCode(){ cout<<"enter product name\n ";cin>>pname; 
cout<<"enter product code _____\b\b\b\b\b";cout<<"\a"; 
cin>>pcode;cout<<endl; 
cout<<pname<<endl; 
cout<<pcode<<endl; 
} 

void product::getCode(long s){ 
    if ((*this).pcode=s){ 
    printer(); 
    } 
} 
void product::scanner(){ 
    long a; 
    cout<<"SCANNING!\a_____\b\b\b\b\b";cin>>a; 
    int i=0; 
    while(i<3){ 
     if (point[i]->pcode==a){point[i]->printer(); 
     break; 
     } 
     i++;  
     //(i==3)?cout<<"try again\n":"\a"; 
     } 
} 
void const product::printer(){ 
    cout<<pname<<endl; 
    cout<<pcode<<endl; 

} 



#include "product.h" 
int main(){ 
    product a[3]; 
    int i=0; 
    while(i<3){ 
    a[i].setCode(); 
    i++; 
    } 

    product::scanner(); 

    return 0; 
} 

我知道這是可以做到很多更容易我剛學所以只想修復掃描功能。它不會編譯

1> product.obj:error LNK2001:無法解析的外部符號「public:static class product * * product :: point」(?point @ product @@ 2PAPAV1 @ A) 1> product。 obj:error LNK2001:無法解析的外部符號「public:static int product :: a」(?a @ product @@ 2HA)

+1

老實說,它會更容易上正在做什麼*權*在此代碼註釋,作爲名單要短得多。關於做錯事,從未經檢查的指針取消引用,未初始化的變量,競爭條件,未經檢查的IO,僅舉幾例。 – WhozCraig

+0

我正在學習C++,所以我只是想讓主體儘可能小而易於編寫和複雜。 – meh

回答

1

該代碼看起來像一團糟。

解決您的連接問題是定義已經聲明爲static point成員:

product* product::point[3]; 
+0

是固定鏈接器錯誤之一。現在如何初始化「一個」變量一次? – meh

+0

完全相同的方式,在結尾 –

+0

年= = 0工作太謝謝了 – meh

0

是不是正在編譯,還是正在編譯和崩潰?發佈時總是準確地說出問題所在。但我可以很容易地看到一些運行時問題。

在循環中,您總是觸摸點[0],點[1]和點[2]處的指針。但是,您永遠不會將它們初始化爲null或執行空檢查。因此,如果您在調用掃描器之前沒有調用過構造函數3次,則會發生段錯誤,因爲這些指針中的一個或多個將無效。另外,你的構造函數從不檢查溢出,所以如果你調用構造函數超過3次,它會出現段錯誤。如果你直接從函數來回傳遞對象,請記住編譯器可能會插入臨時對象構造函數。

+0

您還需要將靜態a初始化爲0 – emartel

+0

1> product.obj:錯誤LNK2001:無法解析的外部符號「public:static class product * * product :: point」(?point @ product @@ 2PAPAV1 @ A) 1> product.obj:error LNK2001:無法解析的外部符號「public:static int product :: a」(?a @ product @@ 2HA) – meh

+0

我以爲靜態變量是默認的0,這就是爲什麼我使用// static a和dont知道如果將它初始化爲0,如果它不是情況循環可能? – meh