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:static class product * * product :: point"(?point @ product @@ 2PAPAV1 @ A)1> product.obj:エラーLNK2001:未解決の外部シンボル "public :static int product :: a "(?a @ product @@ 2HA)

4

2 に答える 2

1

コードがぐちゃぐちゃに見えます。

リンカーの問題の解決策は、既に宣言されている静的メンバーを定義することです。point

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

コンパイルしていませんか、それともコンパイルしてクラッシュしていますか? 投稿するときは、常に問題の内容を正確に伝えてください。ただし、いくつかの実行時の問題を簡単に確認できます。

ループでは、point[0]、point[1]、および point[2] のポインターに常に触れています。ただし、これらを null に初期化したり、null チェックを実行したりすることはありません。したがって、スキャナーを呼び出す前にコンストラクターを 3 回呼び出していない場合、これらのポインターの 1 つ以上が無効になるため、segfault が発生します。

また、コンストラクターはオーバーフローをチェックしないため、コンストラクターを 3 回以上呼び出すと、セグメンテーション違反が発生します。また、関数から直接オブジェクトをやり取りする場合は、コンパイラが一時的なオブジェクト コンストラクターを挿入する可能性があることを覚えておいてください。

于 2012-11-13T18:37:51.763 に答える