0

わかりましたので、このすべての演算子のオーバーロードについて混乱しています。構文は私にとって奇妙であり、とにかくプログラミングが得意ではありません。したがって、インターネットを見回すと、オブジェクトを使用して印刷する唯一の方法cout <<は、それをオーバーロードすることだと思います。したがって、オブジェクトのベクトルがあり、通常、intまたは文字列の通常のベクトルがあれば、イテレータを使用してそれぞれを調べ、逆参照してその内容を出力しますが、そうは思いませんそのテクニックはオブジェクトに対して機能しています:-/これが私がこれまでに持っているものです...助けてください!

BarOne.h   //my header file
#include <string>
#include <vector>

using namespace std;

class BarOne
{
private:
    string name;
    string type;
    string size;
    vector<BarOne> bar;   //vector of BarOne objects
    vector<BarOne>::iterator it;  //iterator for bar
public:
    BarOne();    //constructor
    void addBottle(string, string, string);  //adds a new bottle to bar
    void revealSpace();
    void printInventory();
    friend ostream& operator<<(ostream& os, const BarOne& b);
};

私の実装は次のようになります。

BarOne.cpp    //implementation
#include "BarOne.h"
#include <iostream>
#include <string>

using namespace std;



BarOne::BarOne()
{
    //adding 4 default bottles
}


void BarOne::addBottle(string bottleName, string bottleType, string bottleSize)
{
    name = bottleName;
    type = bottleType;
    size = bottleSize;
}


void BarOne::printInventory()
{
    for (it = bar.begin(); it != bar.end(); ++it)
    {
        cout << *it << endl;
    }
}


ostream& operator<<(ostream& os, const BarOne& b)
{
    os << b.name << "\t\t\t" << b.type << "\t\t\t" << b.size;
    return os;
}

では、メインで printInventory を呼び出しても何も起こらないのはなぜですか? オーバーロードが間違っていましたか?構文ミス?

これもメインです:

#include "BarOne.h"
#include <iostream>
#include <string>

using namespace std;




int main()
{

    string Tiqo, Peruvian, Wellington, Smooze;
    string vodka;
    string rum;
    string whiskey;
    string small;
    string medium;
    string large;

    //default bottles
    vector<BarOne> bar;   //vector of BarOne objects
    vector<BarOne>::iterator it;  //iterator for bar

    BarOne Inventory;   //BarOne object
    Inventory.addBottle(Tiqo, vodka, large);
    bar.push_back(Inventory);
    Inventory.addBottle(Peruvian, rum, medium);
    bar.push_back(Inventory);
    Inventory.addBottle(Wellington, vodka, large);
    bar.push_back(Inventory);
    Inventory.addBottle(Smooze, whiskey, small);
    bar.push_back(Inventory);

^^^それはほんの一部です...残りは、プログラムの実行時にどのように表示されるかをフォーマットするだけです。わかりましたので、誰かが提案したようにクラスを分けてみます。AddBottle は、そのオブジェクトの情報をベクターに追加しますよね? 情報を取得し、それを変数の名前、タイプ、サイズに追加してから、ベクター「バー」に入れます。それともいいえ?

4

1 に答える 1

2

main()あなたは私たちにあなたのプログラムを見せません。そのコードは、バーのコンテンツとバーを混同するクラス設計とともに、表示される動作を引き起こしています。

operator <<実際にボトルのデータを出力してもOKです。BarOneしかし、それが呼び出される には空のbarベクトルがあると確信しています。どこにも何も追加しませaddBottle()ん(特に、含まれている には追加しませんbar)。BarOne代わりに、外側のオブジェクト のプロパティ (データ メンバー) を設定するだけです。

その混乱の原因はクラスの設計にあり、BarOne明らかに a はボトルとバー (ボトルを含む) の両方として機能することを意図しています。

Bar再起動して、別のクラスとクラスを試してみることをお勧めしますBottle

ところで: ローカル ループで使用する反復子をクラス メンバーとして保持することはお勧めできません。遅かれ早かれ、このようなアプローチでは再入可能性の問題に遭遇するでしょう。ループ反復子はローカル変数である必要があり、できればループにスコープを設定します。

于 2013-02-10T18:22:22.507 に答える