0

オブジェクトのすべてのデータを返すオーバーロードされた挿入演算子を作成しました。何らかの理由で私がそれを呼び出そうとしているとき。cout << *pkgArray[index] 何も表示されていませんが、* なしで実行すると、メモリ アドレスが返されます。以下は、オーバーロードされた演算子とそれを使用する私の試みです。

ostream& operator<<(ostream& o, const OverNight& bObj) {
  stringstream ss;
  ss << bObj.getAddress() <<  ", " << bObj.getCity() << ", " << bObj.getState() << ", "     << bObj.getZip();
  string fullAddress = ss.str();
  ss.str("");
  int newWeight = bObj.getWeight();
  ss << "$" << bObj.getUnitPrice() + bObj.getAdditional() << "/ounce";
  string costPerOunce = ss.str();
  o << left 
      << setw(1) << "|"
      << setw(20) << bObj.getsname() 
      << setw(1) << "|"
      << setw(20) << bObj.getName() 
      << setw(1) << "|"
      << setw(60) << fullAddress 
      << setw(1) << "|" 
      << setw(10) << bObj.getType()
      << setw(1) << "|"
      << setw(10) << costPerOunce
      << setw(1) << "|"
      << endl;
  o << left << "+" << setfill('-') << setw(136) << right << "+" << endl;
  o << setfill(' '); // clears the hyphen filler.
  return o;
  } 

int main() {
    Package *pkgArray[15]; // package class is abstract.
    OverNight *onObj; // assigned to pkgArray later on.
    TwoDay *tdObj; // assigned to pkgArray later on.


    // pkgArray is a pointerArray filled with objects of 2 derived classes.
    for (int index = 0; index < max; index++) {
        cout << pkgArray[index];
    }
}

*pkgArray[index] と &pkgArray[index] を試しましたが、後者はメモリ アドレスを返し、最初のものは何も返しません。私はC ++にかなり慣れていないので、この問題を解決するためにあらゆることを試したような気がします.

編集: pkgArray の宣言とそれに割り当てられるオブジェクトを追加しました。割り当てに従ってベクトルを使用できません。

問題をさらに調べた後、何が起こっているのかを発見しました。オーバーロードされた演算子が、渡されたオブジェクトを認識していないことです。私は pkgArray の逆参照を試み、基本クラスでオーバーロードされた挿入演算子の機能を完成させました。今私の問題は、動的配列から派生クラスのオブジェクトを取得する必要があることです。逆参照中に優先順位を適用しようとしましたが、役に立ちませんでした。ここでも、宣言は次のとおりです。

一晩 * onObj; // 派生クラスのオブジェクトに割り当てられるポインタ。TwoDay * tdObj; // 派生クラス Package のオブジェクトに割り当てられるポインタ * pkgArray[15]; // これは基本クラスである Package 型の動的配列です

OverNight オブジェクトと TwoDay オブジェクトが作成された後、それらは Package 配列に割り当てられます。

動的配列に格納されている派生オブジェクトを使用してオーバーライドされた << 演算子を呼び出すループを実行しようとしています。私はこの作業で苦労して多くのことを学びましたが、問題を解決するにはまだ十分ではないようです.

4

3 に答える 3

1

ポリモーフィック階層内のオブジェクトで I/O を実行する通常のパターンは、すぐにはわかりません。ただし、通常は大まかに次のように実装します。

#include <iostream>
#include <vector>

class Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Base\n";
    }
};

class D1 : public Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Derived 1\n";
    }
};

class D2 : public Base {
public:
    virtual std::ostream &write(std::ostream &os) const {
        return os << "Derived 2\n";
    }
};

std::ostream &operator<<(std::ostream &os, Base const &b){
    return b.write(os);
}

int main(){
    std::vector<Base *> objects;
    Base b;
    D1 d1;
    D2 d2;

    objects.push_back(&b);
    objects.push_back(&d1);
    objects.push_back(&d2);

    for (int i=0; i<3; i++)
        std::cout << *objects[i];
    return 0;
}

この場合、結果は次のようになります。

Base
Derived 1
Derived 2

...あなたが望むように。

于 2012-04-26T16:38:50.553 に答える
0

*pkgArray[index]ポインターとして定義されていないオブジェクトを逆参照しようとするため、 * はコンパイラーにとって意味がありません (ポインター変数に含まれる最初のバイトと型記述を使用して、メモリにあるデータを解釈します。これは単なるバイトです)逆参照による詳細情報が提供されるまで)。

オーバーロードされた ostream の適切な解釈を定義していないオブジェクト参照を受け取っている可能性があります。

于 2012-04-26T16:46:24.143 に答える
0

私は何が起こっているのかを理解しました。派生クラスのオブジェクトを基本クラス型の動的配列に割り当てると、メモリ アドレスのみが基本クラス型として格納されます。したがって、ループを実行していると、基本クラス (Package) 型のオブジェクトしか取得できなかったため、OverNight 型と TwoDay 型のオブジェクトを探しているオーバーロードされた演算子は呼び出されませんでした。

于 2012-04-27T01:20:16.220 に答える