我想创建一个包含该类实例地址的指针数组,这样当我调用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()
函数?
答案 0 :(得分: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
被摧毁(这是非常常见的),那么整个设计将失败并且修复将变得非常复杂。我不知道你在做什么,但我建议你现在就停止。我得到了所有这些吗?
答案 1 :(得分:-1)
我认为你需要尝试使用容器来实现你的“数组”。 std :: list将是一个好的开始。看看at this article,向下滚动到带有for循环的示例,这应该可以帮助您清理代码并修复内存访问问题。请记住,您可以将整个对象存储在列表中,而不仅仅是指向它们的指针 此外,您可以尝试将数据与代码分离。尝试使用结构作为数据。