私は単純なC++テストクラスを持っていますが、それは正常に機能してchar * operator()
います。問題は、ヒープ上に作成しているときは使用できないということです。
test t;
printf(t);
大丈夫ですが
test *t=new test();
printf(t);
そうではありません。printf(* t)以外にそれを回避する方法はありますか?
私は単純なC++テストクラスを持っていますが、それは正常に機能してchar * operator()
います。問題は、ヒープ上に作成しているときは使用できないということです。
test t;
printf(t);
大丈夫ですが
test *t=new test();
printf(t);
そうではありません。printf(* t)以外にそれを回避する方法はありますか?
暗黙の変換char*
は良い考えのように聞こえるかもしれませんが、私を信じてください、そうではありません。なぜstd::string
持っていないのかと思います。メソッドを記述してc_str
を呼び出すだけprintf("%s", t->c_str())
です。またはさらに良いことにoperator<<
、クラスのオーバーロード。クラスを見せていただければ、お手伝いさせていただきます。
ポインター(ちなみに、正しく初期化する必要があります...) をに変換する必要がある場合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
ヒープ オブジェクトをポインターとしてではなく、参照として格納できます。
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++;
ウィキペディアには、さらに詳しい説明があります。
使用する前にメモリを割り当てる必要がありtest *t
ます。そうしないと、ポインタはメモリを指しません。
あなたはそれを次のようにします:
test * t= new test();
完了したら、もう一度リリースする必要があります。
delete t;
また、何*t
を印刷しようとしていprintf
ますか? それが指すアドレス、またはそのメンバーのコンテンツ? 後者の場合は、そのために適切な演算子をオーバーロードする必要があります。
printf
もう 1 つ、C++ では使用しないでください。クラスで使用std::cout
してオーバーロードoperator<<
しますtest
。