3

私はこのクラスを持っています:

// in Platform.h
class Platform
{
private:
    float y;
    float xi;
    float xf;
public:
    Platform(float y, float xi, float xf);
    virtual ~Platform(void);
    float getxi();
    float getxf();
};

そして、私はこれを行うことができるようにしたい:

Platform* p = new Platform(1.0,2.0,3.0);
cout << p; // should it be *p?

次のように、「<<」演算子をオーバーロードしてみました。

// in Platform.cpp
std::ostream& operator<<(std::ostream& out, Platform* p ) 
{
    out << "Platform: xi=" << p->getxi() << ", xf=" << p->getxf() << std::endl;
    return out;
}

しかし、これはメモリアドレスを出力するだけです(もちろん、pはポインタであるため...)。上記の関数がまったく呼び出されていないことは確かです。

4

3 に答える 3

2

はい、*p: を実行します。

so cout << *p ;

そして、従来のオペレーターは...

std::ostream& operator << (std::ostream& out, const Platform& p) { } 

外部に表示されるように、これをヘッダー ファイルにエクスポートする必要もあります。追加:

friend std::ostream& operator<<(std::ostream& out, Platform* p ) ;

Platform.h へ

于 2012-12-13T03:51:53.613 に答える
2

オーバーロード宣言は、使用する場所から見える必要があります。に変更してPlatform const&使用する*pのが従来の方法です。

于 2012-12-13T03:55:25.700 に答える
0

実際にはこれは g++ 4.7.2 で動作しますが、コンパイラに依存する可能性があります。できるよ:

// in Platform.cpp
std::ostream& operator<<(std::ostream& out, Platform& p ) 
{
    out << "Platform: xi=" << p.getxi() << ", xf=" << p.getxf() << std::endl;
    return out;
}

そして、間接を使用して印刷します ( *p)

于 2012-12-13T03:58:18.133 に答える