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

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

ただいまの
回答率

90.60%

  • C++

    3337questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

C++で複数メソッドに対してクラスを作成

受付中

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 196

tomato1278

score 3

以下のざっくりとした(pcが手元に無いため)ソースでプログラムしていたのですが、先生からクラスを「必ず」作りなさい。
と言われました。
現状、これで動いているのになぜクラスがいるのか?
そして、どのようにしたらクラスを作成出来るのか?(必ずとの事なので悩んでいます)
教えて頂きたく思います。

int x = 0;

int main (int argc,char* argv[]){
 char* A = argv[1];
 char* B = argv[2];
 char* C = argv[3];
 int z = 0;

 aaa(A,B);
 if(z == 0){
  bbb(B,B,C);
 }
return 0:
}

int aaa(char* AA,char* BB){
int z = 0;
~~~~
 z = x;
  return z;
}

int bbb(char*BBB,char*BBB,char*CCC){
 int v = 0;
~~~~
 v = x;
 return v;
}


色々な語弊を招いてしまっているので簡潔に述べますと、
class C{
public:
int main;
int aaa;
int bbb;
}
のように書き換えるにはどうしたら良いのかが知りたいです。
私としては、main(class(aaa,bbb))のイメージで、どうしてもclass(main,aaa,bbb)となるイメージが湧かないです。
(もしかしたら、私の先生からの指示の聞き間違い・捉え間違いの可能性?)

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+2

現状、これで動いているのになぜクラスがいるのか?

それはあくまで、指導上の方針です。C++言語はJavaとは違って、クラスに入れない関数も書ける言語です。


(追記を見て)

C++の場合、コードはクラスに属さないmain関数から始めることになっているので、すべてをクラスに収めることは無理です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 10:33

    方針なんですね。
    ありがとうございます。
    しかし、今回は入れなければならないみたいでして、そこで特に悩んでいます。

    キャンセル

+1

こんにちは。

先生からクラスを「必ず」作りなさい。
と言われました。
現状、これで動いているのになぜクラスがいるのか?

クラスを使わないプログラミングで十分な時にクラス化する必要は全くありません。時にはクラス化しない方が好ましい時さえあります。しかし、逆にクラスを使った方がよりメンテナンス性が高いプログラムになることもあります。前者と後者では後者のケースの方が(はるかに)多いです。

「先生から」ということは、教育の場面ですね。であれば、後者を想定してクラスの使い方を学んで欲しいということと思います。

そして、どのようにしたらクラスを作成出来るのか?(必ずとの事なので悩んでいます)

ご提示の情報だけではクラス化するメリットが見えるような設計ができませんので、具体的な方法をアドバイスすることはできません。
クラスは内部にデータ(メンバ変数)とメソッド(メンバ関数)を持つことをご存知と思います。まずは、どんなデータをクラスで管理するのか決めることがクラス化のポイントです。データを管理せず、関数しか持たないクラスは単なるグローバル関数と大差ないのです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

これで動いている

本当に動いていますか?
int bbb(char*BBB,char*BBB,char*CCC)・・・これがエラーにならない処理系って??

あと、argcのチェックもない、A,B,C とか意味のない変数名など

「追記」
グローバル変数(x)だけでもクラスは作れます。

usr~/test % ./a.out
0
111
usr~/test % cat t.cpp
#include <iostream>

using namespace std;

class X{
    int x;
public:
    X():x(0){}
    int get()const{ return x; }
    void set(int n){ x= n; }
};

int main()
{
    X x;
    cout << x.get() << endl;
    //
    x.set(111);
    //
    cout << x.get() << endl;
    //
    return 0;
}

usr~/test %

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 10:31

    誠に申し訳ありません。
    処理云々はざっと書いたものなので動く動かないは気にしないで下さい。
    誤解を招く書き方をしてしまい申し訳ありません。

    キャンセル

  • 2018/06/20 10:57

    仕様(処理内容)が分からなければ、分割(クラス)出来ないと思いますが?
    今ざっと言えるのは、aaa(),bbb()をクラスとして作るぐらいでしょうか?・・・処理内容によっては親クラス作ったほうがいいかも?
    また、int x = 0;(グローバル変数)はどのように使用されるのでしょうか?

    キャンセル

  • 2018/06/20 11:26

    getter/setterはあまり好きじゃないんだけど^^; 取り敢えず・・・

    キャンセル

0

クラスとは、「小さなデータ構造と、それに付随する操作(メソッド)をまとめたもの」です。
言い換えると、「完結した、小さなプログラム」であり、大きなプログラムを作るための部品となる物です。

なぜクラスがいるのか、というならば、「今は小さいから要らないように見えるけど、すぐにあった方が楽になる」から、としか言えません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

2点考えられます。
1点目として、オブジェクト指向のプログラミングをさせたいのだと思います。
しなくてもできますが、高度なことをしようとするとオブジェクト指向の考え方が必須になります。
クラスを作ってメンバ関数にしなくてもグローバルな関数を作れば動くプログラムは書けます。
同様にグローバル変数を作れば別に関数に引数を渡さなくても処理はできますよね?
ですが、後々の保守性がかなり悪いのです。

クラスは関数と引数をひとまとめにして関連付けを行っています。
例えばshowListといった漠然とした関数があったとしても、グローバルな関数では引数の型がなんだろう?これは何を表示するんだろう?といったことをいちいち関数の宣言、定義を見に行かないとよくわかりませんが、クラスのメンバ関数であれば、何となく、あークラスについての何かを表示するんだなってことがわかります。
グローバル変数を使うとそもそも関数が何を変更するのか関数の処理について全部見ないと保証できませんが、引数に渡したもの以外変更しないといった保証が前提条件としてある場合、引数についてだけ考えれば済みます。
これがたった100行とかのプログラムだったらいいのですが、数千行、数万行あるプログラムで新しくプログラムを開発するときにいちいち全部の関数と引数の処理をチェックするのでしょうか?無理ですよね?

これはオブジェクト指向を強制しない言語の悪いところなんですが、簡単にプログラムが書ける反面、それで済ます癖がついてしまいます。
エラーが出るからクラスを作りたくない、関数に渡す引数をどうやって渡したらいいかよくわからないからグローバル変数にしちゃう、、、といった癖がつくと後々大変になりますよ。

そのため、そういう癖をつけないためにもクラスを作りましょうって言ってるんだと思います。

2点目として、もしかしたら継承とかをやりたいのかもしれません。
これは根本的にクラスで書かないとできないです。
オブジェクト指向についての授業かなにかですかね?

何かしら意図があると思うので先生に聞いてみるのもいいかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 11:16

    クラスを作るとのことですが、main関数はグローバルな関数として、ほかのaaとかbbとかをクラスにするべきなんだと思います。main関数はグローバルな関数なのでC++ではクラスにできません。aaとbbに関連性がないのであれば、aaとbbは別なクラスにするべきです。(Utilityとか言った名前のクラスを作ってそれに二つとも入れてもいいですが、クラスとかよりも名前空間のほうがよさそうです。)

    キャンセル

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

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

関連した質問

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

  • C++

    3337questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。