2012-11-13 63 views
0

我想打一個指針數組保存該類的實例的地址,所以當我把我的scanner功能將搜索具有相同pcode,並打印出來的對象。我這樣做,但現在當我嘗試使用不同的繼承類對象時,我得到了「內存訪問衝突」,我無法通過基本靜態掃描函數訪問繼承的類函數。動態對象指針數組C++

對不起,這裏的混亂是我的代碼

using namespace std; 
class product{ 
    public: 
     product(); 
     product(long&,string&); 
     void const printer(); 
     void setCode(); 
     void getCode(long); 

     void static scanner(); 
     static product *point; //when this was static did compile but not now 
     static int a; 
    private: 
     string pname; 
     long pcode; 

}; 
class PrepackedFood:public product{ 
    //snip 
private: 
    double uPrice; 
}; 
class FreshFood:public product{ 
    //snip 
private: 
    double weight; 
    double pricepk; 
}; 

product.cpp

product *product::point=new product [15]; //when i use try to use dynamic cant 
int product::a(0); 

product::product(){ 
    pcode=0; 
    pname="unknown";    
    point[a]= this;       //here works for normal arrays not now 
    a++; 
} 
product::product(long& c,string&n){ 
    pcode=c; 
    pname=n; 
} 
void product::scanner(){ 
    long a; 
    int i=0; 
    while(i<3){ 
     if (point[i]->pcode==a){ 
      point[i]->printer(); 
      break; 
     } 
     i++;  
    } 
} 
void product::setCode(){ 
    cout<<"enter product name\n "; 
    cin>>pname; 
    cout<<"enter product code _____\b\b\b\b\b\a"; 
    cin>>pcode; 
} 

//blah blah for other members 

的main.cpp

#include "product.h" 
#include <iostream> 
int main(){ 
    int i=0; 
    cout<<"enter fresh foods"<<endl; 
    FreshFood f[3]; 

    for(int a=0;a<3;a++) 
     f[i].setCode(); 
    product::scanner(); 

    return 0; 
} 

是它的內存地址的問題或完全不同的東西?爲什麼scan{this->print()}調用基本函數?有沒有辦法調用繼承的print()函數?

+2

請將您的代碼修剪到最小的可重複樣本。在那裏有很多代碼是完全不相關的。 –

+0

對不起,我真的很累,不知道哪一個是相關的 – meh

+3

那是你的工作,你討價還價的結束。你需要幫助,而不是我們,所以你應該讓我們很容易幫助你。你不會把完全測試的工作交給我們。期待您在發佈之前完成一些工作是完全合理的。 –

回答

-1

我認爲你需要嘗試使用容器來實現你的「數組」。 std :: list將是一個好的開始。看看at this article,向下滾動到帶for循環的示例,這應該可以幫助您清理代碼並修復內存訪問問題。請記住,您可以將整個對象存儲在列表中,而不僅僅是指向它們的指針。
此外,您可能嘗試從代碼中分離數據。嘗試使用數據結構。

+0

'list'?我從來沒有見過一個情況,那就是'std :: list'是最好的容器。 (儘管我承認它們可能存在),我想這個代碼的'std :: vector'或'std :: map'。解耦數據和代碼似乎是一個壞主意。你爲什麼會推薦? –

+0

我建議'列表'作爲一個簡單的理解容器和更重要的迭代器。同樣的原則適用於重新分離的建議 - @meh在他的代碼中需要一些「空間」,因爲在我看來,目前他對於他所做的事情有過於複雜的解決方案。他**可能不需要使用繼承,而是在結構中爲這樣簡單的任務設置一個標誌。 –

+0

用'std :: list'替換他的數組將顯示當前代碼的所有相同問題。這沒有修復。將整個對象存儲在容器中是問題。 –

0

好了,現在我終於簡化你的問題的文字,這裏的答案:

  • void const printer();這並不編譯。如果要調用某個函數來調用派生類型最多的函數,則必須標記函數virtual。此外,const的名稱。
  • void setCode();商店產品直接從控制檯讀取通常不是一個好主意。這是一個項目,而項目不會解析數字。外部函數應該解析輸入。
  • static product *point;這也許應該用std::vector<product*>取代。這是對單個產品的動態指針陣列。指向每個產品的指針允許virtual函數的多態性按照您希望的方式工作。
  • product *product::point=new product [15];創建一個包含15個product對象的數組。不是PrepackedFood,或任何其他類型的對象,這些都是只有products。沒有更多或更少。另外,你正在泄漏這個記憶。使用一個vector
  • point[a]= this;這甚至沒有編譯,因爲point[a]是一個product,並且this是一個指針。
  • product::product(long& c,string&n)此功能不註冊產品。由此製成的任何產品未在您的陣列中註冊且無法找到。幸運的是,你沒有使用它。
  • void getCode(long) {我甚至不確定這段代碼是如此糟糕。
  • void product::scanner(){使用for循環而不是while循環,這只是令人困惑。另外,你只掃描前三個項目,應該掃描所有的項目。使用vector將在這裏幫助。
  • 如果一個product被破壞(這是非常普遍的),那麼這整個設計將失敗,修復將是非常複雜的。我不知道你在做什麼,但我建議你現在就停下來。

我已經完全掌握了嗎?

+0

不知道向量,所以我不知道atm我會看看 – meh

+0

,第一個代碼是// static product * point [3]; // product * product :: point [3];沒有編譯和工作,但當繼承afew類內存泄漏,我試圖使用動態,但我必須改變它編譯//點[a] = * this;它並沒有在我心中編譯:D – meh

+0

反正謝謝你的幫助生病嘗試完成向量在幾天 – meh