「以下のソースに、ひとつバグが含まれています。
具体的には、void func()の中でひとつ処理が抜けています。
このソースはJavaとして動かせばちゃんとうごくそうです。
でも、C++として動かすとコンパイルでエラーになるそうです。」
私、C++を勉強したことがないんです。
このソースの中のバグをさがしていただけませんでしょうか?
これは仕事を依頼してきている会社からの宿題(試されてる??)
なのです。。。
#include <stdio.h>
class Foo
{
public:
int i;
Foo(int j) { i = j; }
Print() { printf(%d, i); }
};
void func()
{
Foo* foo = new Foo(5);
foo->Print();
return;
}
int main()
{
func();
}
>C++として動かすとコンパイルでエラーになるそうです。
コンパイルしてみましょう。コンパイラがエラーを教えてくれます。
まず、『試されてる??』と思うなら自分でやるべきではないですか?
C++を勉強したことがない、のなら『これをたたき台にC++を勉強してみろ』
という意味で試されているのかもしれませんよ。
>Javaとして動かせばちゃんとうごくそうです
試しましたか?動きませんよ。というより全然違う。
コンパイルとおらないしトップレベルに関数置けない。
>このソースの中のバグをさがしていただけませんでしょうか?
最終的にどうなっていればいいのか(このプログラムが何をすればいいのか)
がわからないのに、バグを探せ、といわれても何も出来ません。
コンパイルエラーをなくせというのならPrintの戻り値が表記されてないので
voidにデモしてあげてください。
あと、動くのと、コンパイルが通るのは全然別問題なので、
用語も気をつけたほうが良いかと。
>>C++として動かすとコンパイルでエラーになるそうです。
>コンパイルしてみましょう。コンパイラがエラーを教えてくれます。
ぜんぜん関係のない個所でwarningが2個出ますな ^^;
問題自体に誤りがありそうです。
> 問題自体に誤りがありそうです。
あ、ひょっとして '問題がヘン' と答えれば合格?
だとすると出題者は賢いヒトだ。
あ、戻り値無いのは警告にしかなりませんか。
メモリリークのことではないですか
newがあるのにdeleteが無い
> newがあるのにdeleteが無い
それが理由でコンパイルエラーにはなりませぬ。
# おそらく実行時エラーにもならんな。
こういうのその出題した人が見たらどう思うんでしょう。
class Foo
{
public:
int i;
Foo(int j) { i = j; }
// i の初期化が冗長になる。
// Foo(int j): i(j) {} とすべきである。
Print() { printf(%d, i); }
// 戻り値が無いため警告となる。
// 内容を変更しないため、constとすべきである。
// void Print() const { printf(%d, i ); }
};
void func()
{
Foo* foo = new Foo(5);
// そもそもヒープに Foo のインスタンスを生成する理由が見当たらない。
// Foo foo(5);
// とすべきである。
foo->Print();
// スタック上に生成したなら
// foo.Print();
// となる。
return;
// ここでfooのスコープから外れ、ヒープ上に生成した場合追跡不可能となり、
// メモリリークが起こる。
// が、この関数自体を一度しか呼ばないのであれば、それはメモリプールであり、
// バグとはいえないかもしれない。
// foncを複数回呼ぶことが考えられるのであれば、
// スタックに生成するようにするかdeleteするか、auto_ptr等を使用すべきであ
る。
}
int main()
// mainは引数int, char** を受けるべきである。
{
func();
// 戻り値がintであるのに値を返していない。
// 適切な return を入れるべきである。
}
はじめまして。
C++ですよね?
ならばコンパイルエラーは
>#include <stdio.h>
ではないかと。
たしかC++では拡張子.hがつくヘッダは使えなくなったはず‥。
違うかな。
>ならばコンパイルエラーは
>>#include <stdio.h>
>ではないかと。
もしそうなら、std::printf(...) でなくては。
ああ、それもあったか。じゃ、追加。
#include <stdio.h>
// C++としては推奨されない
// #include <cstdio>
// とし、適切なネームスペース解決をすべきである。
int i; がpublicなのもいかがなものかと。
# スレ主そっちのけで遊んでるね^^;
# そのくらい'いいかげん'な問題なんだが。
