0

我想创建一个指针数组来保存该类实例的地址,所以当我调用我的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;
};

产品.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

主文件

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

4

2 回答 2

0

好吧,既然我终于简化了您的问题文本,那么答案如下:

  • void const printer();这不编译。如果您希望调用函数以调用最派生类型的函数,则必须标记该函数virtual。此外,在const名称之后
  • void setCode();商店产品直接从控制台读取通常不是一个好主意。它的工作是成为一个项目,项目不解析数字。外部函数应该解析输入。
  • static product *point;这可能应该替换为std::vector<product*>. 这是一个指向单个产品的动态指针数组。指向每个产品的指针允许virtual函数的多态性以您希望的方式工作。
  • product *product::point=new product [15];product创建一个包含 15 个对象的数组。NotPrepackedFood或任何其他类型的对象,这些只是 products. 不多也不少。此外,您正在泄漏此内存。用一个vector
  • point[a]= this;这甚至不能编译,因为point[a]is aproductthis是一个指针。
  • product::product(long& c,string&n)此功能不注册产品。使用此制作的任何产品都未在您的阵列中注册,因此无法找到。幸运的是,您没有使用它。
  • void getCode(long) {我什至不确定这段代码做了什么,这太糟糕了。
  • void product::scanner(){使用 for 循环而不是 while 循环,这只是令人困惑。此外,您只扫描制作的前三个项目,它可能应该扫描所有制作的项目。在这里使用 avector会有所帮助。
  • 如果 aproduct被破坏(这是非常常见的),那么整个设计将失败并且修复将非常复杂。我不知道你在做什么,但我建议你现在停下来。

我得到了这一切吗?

于 2012-11-14T00:44:43.457 回答
-1

我认为您需要尝试使用容器来实现您的“数组”。std::list 将是一个好的开始。看看这篇文章,向下滚动到带有 for 循环的示例,这应该可以帮助您清理代码并修复内存访问问题。请记住,您可以将整个对象存储在列表中,而不仅仅是指向它们的指针。
此外,您可以尝试将数据与代码分离。尝试为您的数据使用结构。

于 2012-11-14T00:07:36.750 回答