2

私は単純なC++テストクラスを持っていますが、それは正常に機能してchar * operator()います。問題は、ヒープ上に作成しているときは使用できないということです。

test t;
printf(t);

大丈夫ですが

test *t=new test();
printf(t);

そうではありません。printf(* t)以外にそれを回避する方法はありますか?

4

4 に答える 4

5

暗黙の変換char*は良い考えのように聞こえるかもしれませんが、私を信じてください、そうではありません。なぜstd::string持っていないのかと思います。メソッドを記述してc_strを呼び出すだけprintf("%s", t->c_str())です。またはさらに良いことにoperator<<、クラスのオーバーロード。クラスを見せていただければ、お手伝いさせていただきます。

于 2013-01-15T13:18:47.663 に答える
1

ポインター(ちなみに、正しく初期化する必要があります...) をに変換する必要がある場合char*、これは不可能です。

クラス内のクラスの(または参照)に対してのみ演算子を実装できます。一部の演算子はクラスの外部で定義できますが、キャスト演算子は定義できません (たとえば、operator+2 つのパラメーターを使用して外部で実装できます)。

算術演算子はクラスの外部で実装できる ( は算術演算子です) という事実を考えると、ポインターを使用してもoperator<<たとえば への出力用にストリーム演算子を実装できます。std::cout

std::ostream & operator <<(std::ostream & o, const test & t) {
    return o << t.toString();  // use std::string here, not c-strings!
}
std::ostream & operator <<(std::ostream & o, const test * t) {
    return o << t->toString(); // use std::string here, not c-strings!
}

ライブを見る:http : //ideone.com/BZfcji

于 2013-01-15T13:28:01.637 に答える
0

ヒープ オブジェクトをポインターとしてではなく、参照として格納できます。

test *my_heap_object = new test();
test &t = *my_heap_object;
// now you can use 't', as if it was local,
// instead of dereferencing the pointer each time.
printf(t);
t.do_something();
t++;

ウィキペディアには、さらに詳しい説明があります。

于 2013-01-15T13:22:54.053 に答える
0

使用する前にメモリを割り当てる必要がありtest *tます。そうしないと、ポインタはメモリを指しません。

あなたはそれを次のようにします:

test * t= new test();

完了したら、もう一度リリースする必要があります。

delete t;

また、何*tを印刷しようとしていprintfますか? それが指すアドレス、またはそのメンバーのコンテンツ? 後者の場合は、そのために適切な演算子をオーバーロードする必要があります。

printfもう 1 つ、C++ では使用しないでください。クラスで使用std::coutしてオーバーロードoperator<<しますtest

于 2013-01-15T13:17:07.803 に答える