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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

5回答

2194閲覧

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

tomato1278

総合スコア13

C++

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

0グッド

0クリップ

投稿2018/06/20 00:53

編集2018/06/20 01:38

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

C++

1int x = 0; 2 3int main (int argc,char* argv[]){ 4 char* A = argv[1]; 5 char* B = argv[2]; 6 char* C = argv[3]; 7 int z = 0; 8 9 aaa(A,B); 10 if(z == 0){ 11 bbb(B,B,C); 12 } 13return 0: 14} 15 16int aaa(char* AA,char* BB){ 17int z = 0; 18~~~~ 19 z = x; 20 return z; 21} 22 23int bbb(char*BBB,char*BBB,char*CCC){ 24 int v = 0; 25~~~~ 26 v = x; 27 return v; 28} 29``` 30色々な語弊を招いてしまっているので簡潔に述べますと、 31class C{ 32public: 33 int main; 34 int aaa; 35 int bbb; 36} 37のように書き換えるにはどうしたら良いのかが知りたいです。 38私としては、main(class(aaa,bbb))のイメージで、どうしてもclass(main,aaa,bbb)となるイメージが湧かないです。 39(もしかしたら、私の先生からの指示の聞き間違い・捉え間違いの可能性?)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

こんにちは。

先生からクラスを「必ず」作りなさい。

と言われました。

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

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

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

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

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

投稿2018/06/20 04:33

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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


(追記を見て)

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

投稿2018/06/20 00:57

編集2018/06/20 01:57
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato1278

2018/06/20 01:33

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

0

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

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

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

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

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

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

投稿2018/06/20 02:12

m_yoko

総合スコア156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_yoko

2018/06/20 02:16

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

0

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

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

投稿2018/06/20 01:21

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これで動いている

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

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

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

cpp

1usr~/test % ./a.out 20 3111 4usr~/test % cat t.cpp 5#include <iostream> 6 7using namespace std; 8 9class X{ 10 int x; 11public: 12 X():x(0){} 13 int get()const{ return x; } 14 void set(int n){ x= n; } 15}; 16 17int main() 18{ 19 X x; 20 cout << x.get() << endl; 21 // 22 x.set(111); 23 // 24 cout << x.get() << endl; 25 // 26 return 0; 27} 28 29usr~/test %

投稿2018/06/20 01:20

編集2018/06/20 02:20
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato1278

2018/06/20 01:31

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

2018/06/20 01:57

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

2018/06/20 02:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問