質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

C++っぽい書き方とは

解決済

回答 5

投稿

  • 評価
  • クリップ 3
  • VIEW 4,099

score 38

 先生にC++で書いたゲームのコードを見せたところ、Javaっぽい書き方していると言われました。
 おそらく、1つのファイルにまとめすぎているのが原因だとは思います。
 現在は先生が書いたコードを真似して直そうとしているのですが、C++の良い書き方、悪い書き方について教えていただけないでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2015/04/17 21:09

    javaっぽいと言われたコードがどんなものか気になるので一部分貼ってもらえるとありがたいです。

    キャンセル

  • albacrow

    2015/04/17 21:21

    すみません、コードを貼るのは遠慮したいので要点だけ書きます。
    ・if文のブロックが3重4重になっている
    ・文が横に長い
    ・コピペが多い
    ・関数を分割しきれていない
    などが自分でも悪いとは考えています。

    キャンセル

回答 5

checkベストアンサー

+3

C++でJavaっぽいコードというとむしろ褒め言葉のように感じるのは私だけなんでしょうか…

・if文のブロックが3重4重になっている
・文が横に長い
・コピペが多い
・関数を分割しきれていない

このあたりはJavaの特徴と合致するものではありません。
先生が何か先生の思うフィーリングみたいなものを言っただけかもしれません。
例えば昔、似たソースコードを見た…とか。


C++ のコーディングスタイルの話に関して言えば、私は以下のスライドで紹介されているJeff Bayの手法がかなり好きです。

http://www.slideshare.net/MoriharuOhzu/ss-14083300

全部実践する必要性は無いし、そもそも実践しようとしてもとてもしんどくて全部は無理なのですが、Jeff BayのObject Calisthenicsは私にコードの理想像を一つ教えてくれた気がします。

後は書籍リーダブルコードは良書です。
全部ここで伝えようとしても伝えきれないほどソースコードを綺麗に書くコツというのはたくさんあります。

まずはこういうところから見てみてもいいかもしれませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/18 23:46

    ありがとうございます。精進します。

    キャンセル

+1

1つのファイルにまとめすぎる、という点で言うとC++の場合、ヘッダファイル(*.h)にクラスの宣言(定義も兼ねる)を書きますが、メンバ関数(Javaでいうメソッド)は宣言だけ書いておいて、実際の定義は別のファイル(*.cppなど)に書きます。
ただ、セッター・ゲッターなどはクラス宣言の方に書くことが多いです。

ヘッダファイル(MyClass.h)に記述

class MyClass {
public:
    // コンストラクタ
    MyClass();
    // デストラクタ
    ~MyClass();

    // セッター・ゲッター
    void SetCount(int value) {
        Count = value;
    }
    int GetCount(void) const {
        return Count;
    }
    // 計算
  int Calc(int x, int y);
private:
    // メンバ変数
    int Count;
    
}

MyClass.cppに記述

#include MyClass.h
MyClass::MyClass()
{
    // 初期化処理
}
MyClass::~MyClass()
{
    // 後片付け
}
int MyClass::Calc(int x, int y)
{
    int Ret = 0;
    // xとYを使って計算
  ...
    return Ret;
}
こんな感じで書くと体裁はJavaっぽくなくなります。

あとは、メンバ関数内でなにがしかオブジェクトを使う場合
MyObject obj1;   // 1
MyObject* obj2 = new MyObject();  // 2
と2種類の書き方ができます。
よほどサイズの大きいオブジェクトでなければ 1 の書き方で構わないと思いますが、サイズが大きい場合、2の書き方にしないと、メモリが不足してしまいビルドは成功しても実行時に不正終了したりします。
じゃあ2の書き方の方がいいか、というと、C++はnewしたものはどこかで確実にdeleteしないとメモリリークになりますので、スコープを抜ける際に自動で破棄してくれる1の書き方が楽ではあります。
逆に1の書き方をしている場合、スコープ外に出ると破棄されてしまうので、そうなっては困る場合には2の書き方をする必要があります。

このあたりの使い分けは慣れるしかないと思いますが、Javaとはだいぶ違うと思える部分です。
こんな感じでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/18 23:49

    ありがとうございます。コード見直して、直せる部分は直したいと思います。

    キャンセル

0

C++とJavaは兄弟みたいなものなのでそんなに違いが出るとは思わないのですが
Javaっぽい書き方ってなんなんでしょうね。
クラス名が無駄に長いとか・・・

ゲームだと、効率を重視するためにあんまりインスタンスを作らなかったり
newしないことがあるので、もしかしたらnewしまくってるとか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/18 23:47

    ゲームのキャラクターを破棄する際にdelete、新たに作成するたびにnewしている事があるので、それが原因かもしれません。
    ありがとうございます。

    キャンセル

0

他の方の回答にもありますが、
1つのファイルにまとめすぎている
という特徴は「Javaっぽい」には合致しないと思います。
C++でもJavaでも、1ファイルが数千行というコードは何度も見たことがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/18 23:50

    ありがとうございます。ただ、数千行は見づらいと先生によく言われたので、適度な行数に押さえたいと思います。

    キャンセル

  • 2015/04/18 23:56

    すみません、肝心なことを書き忘れていました。
    悪い意味で1ファイルが数千行というコードはC++でもJavaでもあるということです。先生のおっしゃるとおり、適度な行数に抑えたほうが良いです。

    キャンセル

0

他の方からも回答されているので別の情報を。
GoogleのC++スタイルガイドは、C++でどう書くべきか理由も含めて詳しく書いてありますので一読を勧めます。
http://www.textdrop.net/google-styleguide-ja/cppguide.xml

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/21 20:27

    ありがとうございます!
    今日、先生からソースコードもらえたので、見比べながら勉強します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る