2011-01-26 15 views
4

のコメント欄のは、標準のC++/Qtの方法で動作しますか?Qtオブジェクトを暗黙的にQStringに変換する方法は?

class A { 
public: 
    A() { } 
    virtual ~A() { } 
    virtual QString toString() { return "A"; } 
}; 

class B: A { 
public: 
    B() { } 
    ~B() { } 
    QString toString() { return "B"; } 
}; 

int main(int argc, char *argv[]) { 
    QCoreApplication a(argc, argv); 

    A a_; 
    B b_; 

    // qDebug() << a_; // I can make this work by overloading << yes? 
    // qDebug() << b_; 

    // QString x = a_; // How do I make this work? 
    // QString y = b_; 

    QString s = a_.toString(); // What I'm doing at present 
    qDebug() << b_.toString(); // What I'm doing at present 

    return a.exec(); 
} 

私はすべてが同じ基本クラスから派生した独自のQtクラスのインスタンスの階層を持っています。

上記のtoStringのような私自身の標準的な方法では、上記のように明示的に自分自身で行うことができますが、それは暗黙的ではありません。私はこれを暗黙のうちに、私が気づいていない人がいると思うので、むしろQtまたはC++のコンベンションに従います。

文字列は最終的にはoperator <<がオーバーロードされていると思うQ * Viewコントロールに表示されます。ただvirtual operator QString()virtual QString toString()を交換する、あなたのケースでそう

struct foo 
{ 
    operator int() { return 5; } 
}; 

foo f; 
int i = f; // uses operator to convert to int 

+0

ところで、空のパブリックコンストラクタと空のパブリック非仮想デストラクタを定義することに意味はありません。 – GManNickG

+0

@GMan:ありがとう、上記のデストラクタは 'public virtual'です。 –

+0

@Petermcg:1つは、はい(私のリストがそれを確認したことを確認しました)、もう1つは明示的に定義する必要はありません。 – GManNickG

答えて

13

あなただけの、いわゆる変換機能を追加します。


言い換えれば、暗黙的な演算子は一般的には眉をひそめています。キャストは目立つだけでなく、暗黙のうちにキャストが起こるようになっています。 C++ 0xは実際に変換関数に対してexplicitを明示的にキャストできるようにしていますが、どのコンパイラがそれをサポートしているか分かりません。

私はあなたが持っているものを残しオフはるかに良いと思う、とだけ追加:

// I assume qDebug() is convertible to std::ostream 
std::ostream& operator<<(std::ostream& stream, const A& val) 
{ 
    stream << val.toString(); // would need to make function const, of course 

    return stream; 
} 

を明示的な休息を残します。

+0

明示的なことはC++ 0xでは新しくなく、C++ 03で既にあった。したがって、すべての標準準拠のコンパイラはそれをサポートする必要があります。 – hmuelner

+2

@hmnuelner:キーワード 'explicit'は確かですが、変換関数での使用は全く新しいので、私たちが使用するセーフ・ブール・イディオムのようなものがあります。 C++ 03では、コンストラクタのみが使用されていました。 – GManNickG

関連する問題