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

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()継承された関数を呼び出す方法はありますか?

4

2 に答える 2

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(){while ループの代わりに for ループを使用してください。これは混乱を招きます。また、作成された最初の 3 つのアイテムのみをスキャンしているため、作成されたすべてのアイテムをスキャンする必要があります。ここでは a を使用するvectorと役立ちます。
  • aproductが破壊された場合 (これは非常に一般的です)、この設計全体が失敗し、その修正は非常に複雑になります。何をしているのかわかりませんが、今すぐやめることをお勧めします。

私はそれをすべて手に入れましたか?

于 2012-11-14T00:44:43.457 に答える
-1

コンテナを使用して「配列」を実装する必要があると思います。std::list は良いスタートです。この記事を見て、for ループを含む例まで下にスクロールします。これは、コードをクリーンアップし、メモリ アクセスの問題を修正するのに役立ちます。オブジェクトへのポインターだけでなく、オブジェクト全体をリストに格納できることに注意してください。
また、コードからデータを分離しようとする場合もあります。データに構造体を使用してみてください。

于 2012-11-14T00:07:36.750 に答える