1

我想创建一个指针数组来保存该类中对象的地址,因此当我调用扫描仪函数时,它会读取 pcode 并搜索具有相同 pcode 的对象。我声明数组错误吗?还是我误解了静态概念?或者是其他东西 ?

无论如何,我想必须发布整个代码

#include <string>
using namespace std;
class product{
    public:
        product();
        product(long&,string&);
        void setCode();
        void getCode(long);
        void static scanner();
        void const printer();
        static product *point[3];
        static int a;
    private:
        string pname;
        long pcode;

};/*
class PrepackedFood:public product{
    public:
        PrepackedFood(long&, string&,double);
    private:
        double uPrice;
};
class FreshFood:public product{
    public:
        FreshFood(long&,string&,double,double);
    private:
        double weight;
        double pricepk;

};*/


#include "product.h"
#include <iostream>
product::product(){pcode=0;pname="unknown";
point[a]= this;
a++;}
product::product(long& c,string&n){pcode=c;pname=n;
}
//void const product::printer(){cout<<getCode()}
void product::setCode(){ cout<<"enter product name\n  ";cin>>pname;
cout<<"enter product code _____\b\b\b\b\b";cout<<"\a";
cin>>pcode;cout<<endl;
cout<<pname<<endl;
cout<<pcode<<endl;
}

void product::getCode(long s){
    if ((*this).pcode=s){
    printer();
    }
}
void product::scanner(){
    long a;
    cout<<"SCANNING!\a_____\b\b\b\b\b";cin>>a;
    int i=0;
    while(i<3){
        if (point[i]->pcode==a){point[i]->printer();
        break;
        }
        i++;    
        //(i==3)?cout<<"try again\n":"\a";
        }
}
void const product::printer(){
    cout<<pname<<endl;
    cout<<pcode<<endl;

}



#include "product.h"
int main(){
    product a[3];
    int i=0;
    while(i<3){
    a[i].setCode();
    i++;
    }

    product::scanner();

    return 0;
}

我知道它可以更容易地完成我只是在学习所以只想修复扫描仪功能。它不编译

1>product.obj:错误 LNK2001:未解析的外部符号“public:静态类产品 * * product::point”(?point@product@@2PAPAV1@A) 1>product.obj:错误 LNK2001:未解析的外部符号“public : 静态整数产品::a" (?a@product@@2HA)

4

2 回答 2

1

代码看起来很乱。

链接器问题的解决方案是定义已经声明的静态point成员:

product* product::point[3];
于 2012-11-13T19:19:46.120 回答
0

是没有编译,还是编译崩溃了?发帖时,请务必准确说出问题所在。不过,我可以很容易地看到其中的一些运行时问题。

在您的循环中,您总是在点[0]、点[1] 和点[2] 处触摸指针。但是,您永远不会将它们初始化为 null 或进行 null 检查。因此,如果您在调用扫描仪之前没有调用构造函数 3 次,则会出现段错误,因为这些指针中的一个或多个将无效。

此外,您的构造函数从不检查溢出,因此如果您调用构造函数超过 3 次,它将出现段错误。如果您曾经直接从函数中来回传递对象,请记住编译器可能会插入临时对象构造函数。

于 2012-11-13T18:37:51.763 回答