1

コードは正常にコンパイルされますが、特定のセクションで正しい出力が表示されないという問題があります。

これが私の基本クラスです

class Item
 {
 protected:

//int count;
string model_name;
int item_number;

 public:

Item();
Item(string name, int number);
     string getName(){return model_name;}
int getNumber(){return item_number;}

これが私の派生クラスです:

 class Bed : public Item
 {
 private:

string frame;
string frameColour;
string mattress;

 public:

 Bed();

 Bed(int number, string name, string frm, string fclr, string mtres);

関数の定義:

 Bed::Bed(int number, string name, string frm, string fclr, string mtres)
{
model_name=name;
item_number=number;
frame=frm;
frameColour=fclr;
mattress=mtres;
cout<<model_name<<item_number<<frame<<frameColour<<mattress<<endl;
}

問題を引き起こしているメインセクション:

 Item* item= new Bed(number, name, material, colour, mattress);
 cout<<"working, new bed"<<endl;
 v.push_back(item);
 cout<<"working pushback"<<endl;
 cout<<" this is whats been stored:"<<endl;
 cout<<v[count]->getName<<endl;
 cout<<v[count]->getNumber<<endl;
 count++;

プログラムが実行されると、コンストラクター内のcoutは正しい出力を表示しますが、メイン関数からgetnameとgetnumberを呼び出すと、そこに何が格納されていても、プログラムは両方に対して「1」を出力します。派生クラスは基本クラスのメソッドを使用できると思いましたが、何を見逃しましたか?どんな助けでも素晴らしいでしょう

ありがとうHx

4

4 に答える 4

2

さて、あなたの例はポリモーフィズムとは関係ありません。ここでの理由は、仮想関数を使用していないためです。使用できるコードは次のとおりです。

class Item
{
protected:

    std::string model_name;
    int item_number;

public:

    Item();
    Item(std::string& name, int number) : model_name(name), item_number(number) {};
    std::string getName(){return model_name;}
    int getNumber(){return item_number;}
};

class Bed : public Item
{
private:

    std::string frame;
    std::string frameColour;
    std::string mattress;

public:

    Bed();

    Bed(int number, std::string& name, std::string& frm, std::string& fclr, std::string& mtres) : Item(name, number), 
                                                                                                  frame(frm),
                                                                                                  frameColour(fclr), 
                                                                                                  mattress(mtres) {};
};

int main()
{
    int count = 0;
    std::vector<Item*> v;

    Item* item = new Bed(2, std::string("MyBed"), std::string("wood"), std::string("red"), std::string("soft"));
    std::cout << "working, new bed" << std::endl;
    v.push_back(item);

    std::cout << "working pushback" << std::endl;
    std::cout << " this is whats been stored:" << std::endl;
    std::cout << v[count]->getName() << std::endl;
    std::cout << v[count]->getNumber() << std::endl;

    ++count;

    getchar();
}    
于 2012-05-02T12:53:12.703 に答える
1

countあなたのサイズのようvectorです。最後の要素をプッシュバックした後は、インクリメントcountしないので、古い要素を印刷します。

試してみませんか:

cout<<v[v.size()-1]->getName<<endl;
cout<<v[v.size()-1]->getNumber<<endl;

また、コンストラクターで初期化リストの使用を開始する必要があります。

Bed::Bed(int number, string name, string frm, string fclr, string mtres) :
  Item(name,number),
  frame(frm),
  frameColour(fclr),
  mattress(mtres)
{
}
于 2012-05-02T12:37:09.720 に答える
1

これは正しくないように見えます(そしてこれがどのようにコンパイルされたかはわかりません):

cout<<v[count]->getName<<endl;
cout<<v[count]->getNumber<<endl; 

asgetNamegetNumberはメソッドです。への変更:

cout<<v[count]->getName()<<endl;
cout<<v[count]->getNumber()<<endl;

さらに、の初期化countは投稿されません。ゼロであることを確認してください。

于 2012-05-02T12:49:21.010 に答える
0

派生クラスから基本クラスのコンストラクターを呼び出していません...最初の行であるはずですが...コードを更新すると、動作を開始すると確信しています。

編集

そうでない場合は、おそらく、他の人が指摘しているように、カウント変数の処理方法も確認する必要があります。

于 2012-05-02T12:37:36.833 に答える