簡體   English   中英

動態對象指針數組C ++

[英]dynamic object pointer array C++

我想創建一個指針數組,該指針數組包含該類的實例的地址,因此,當我調用scanner函數時,它將搜索具有相同pcode對象並將其打印出來。 我確實做到了,但是現在當我嘗試使用其他繼承的類對象時,出現“內存訪問沖突”,並且無法通過基本靜態掃描功能訪問繼承的類函數。

很抱歉這里是我的代碼

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()函數?

好了,既然我終於簡化了您的問題文本,下面是答案:

  • 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被銷毀(這是非常普遍的),那么整個設計將失敗,並且修復將非常復雜。 我不知道您在做什么,但我建議您立即停止。

我明白了嗎?

我認為您需要嘗試使用容器來實現“數組”。 std :: list將是一個好的開始。 看一下本文 ,向下滾動至帶有for循環的示例,這應該可以幫助您清理代碼並解決內存訪問問題。 請記住,您可以將整個對象存儲在列表中,而不僅僅是指向它們的指針。
另外,您可以嘗試將數據與代碼分離。 嘗試對數據使用結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM