[英]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.