「Cpp クラス」の版間の差分

提供:yonewiki
(ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) クラス</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </t…」)
 
 
41行目: 41行目:
まずは、ヘッダファイルと呼んでいる.hの拡張子ファイルでクラスを以下のように定義するだけのパターンが多い。<br />
まずは、ヘッダファイルと呼んでいる.hの拡張子ファイルでクラスを以下のように定義するだけのパターンが多い。<br />
CMyClass.h<br />
CMyClass.h<br />
<syntaxhighlight lang="cpp" line start="1">
<syntaxhighlight lang="cpp" line start=1-1+1>
class CMyClass{
class CMyClass{
     int nValue;//メンバ変数 何も書いてないけどprivate:っていう領域
     int nValue;//メンバ変数 何も書いてないけどprivate:っていう領域
52行目: 52行目:
で、Cppファイルには<br />
で、Cppファイルには<br />
CMyClass.cpp<br />
CMyClass.cpp<br />
<syntaxhighlight lang="cpp" line start="1">
<syntaxhighlight lang="cpp" line start=1-1+1>
#include "CMyClass.h"
#include "CMyClass.h"


94行目: 94行目:
でメイン関数を書くmain.cppとかに<br />
でメイン関数を書くmain.cppとかに<br />
main.cpp<br />
main.cpp<br />
<syntaxhighlight lang="cpp" line start="1">
<syntaxhighlight lang="cpp" line start=1-1+1>
#include <iostream>
#include <iostream>
#include "CMyClass.h"
#include "CMyClass.h"

2022年10月25日 (火) 12:36時点における最新版

C++に戻る


本来の表記は「C++(Cpp) クラス」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ クラスになっています。

クラス

クラスはC++でCには無かった機能としては、かなり重要な要素です。
Cの文字列ポインタや関数ポインタで躓いた経験のある人なら、
C++で、また躓きやすいところです。

WindowsアプリケーションがVCで組まれていたなら、間違いなく登場する構文です。
複雑なアプリケーションを作るときに、骨格だけがクラスという形で与えられ、
そのクラスを補うことでアプリケーションの一部の機能を簡単に作成できるというのが、
大きな目的でもあり、小さな目的としては変数や定義の衝突を避けるということもあります。

小さな規模のアプリケーションでも、Windowsアプリケーションはとんでもなく多くのコーディングを必要とします。
提供されているクラスをうまく流用しないと、時間がいくらあっても足りません。
過去の資産を大切に。そして、仕様に忠実に従うならば、クラスを使いこなす必要があります。

クラスを覚えたからといってWindowsアプリケーションが作れるわけではありません。あしからず。
覚えないと、その域にも行けない。険しいぜ。プログラミング。

クラスは自分で定義するなら、以下のようにして作ることができます。
最初は自分で定義するというよりも、定義されているクラスを使うという作業の方が多いので
役にたたない情報です。クラスはどうやってつくられているか、基本はおさえなきゃね。

CMyClassという名前のクラスを作る場合は以下のようになります。
機能としては、クラスにする意味あるのかっていうくらい無意味ですが、
int型の変数nVlaueっていう値をクラスの中で扱って、メンバ関数SetMyClass_nでnValueの値の設定。GetMyClass_nで値の取得。
という1行でやれる変数の代入をあえてクラスでやるという。恐るべしクラスなのです。
この面倒くさい作りがやがて膨大になるにつれて、「おぅっと、クラスって便利!」になるのやもしれません。


まずは、ヘッダファイルと呼んでいる.hの拡張子ファイルでクラスを以下のように定義するだけのパターンが多い。
CMyClass.h

class CMyClass{
    int nValue;//メンバ変数 何も書いてないけどprivate:っていう領域
public://この宣言からpublic:って領域
    void SetMyClass_n(int nSetValueRcv);//メンバ関数 
    int  GetMyClass_n(); 
};


で、Cppファイルには
CMyClass.cpp

#include "CMyClass.h"

void CMyClass::SetMyClass_n(int nSetValueRcv){
    nValue = nSetValueRcv;
}
      
int CMyClass::GetMyClass_n(){
    return nValue;
}


クラスをヘッダファイルとプログラムファイルとに分けましたが、ヘッダファイルの中身をプログラムファイルの中に
まとめて書いてしまっても問題ないです。そうすると#include""が省略できるけど、他の関数を別のファイルに書いてる場合は
#include "xxxx.cpp"とかになるかな…
ですが、通常は分けて置きます。ディレクティブ(#ifdefとか)というもので、宣言が重複しないようにしたりしやすくなります。
ヘッダファイルの1行目でclass CMyClassって感じでクラスを宣言しました。宣言の中身は{}で囲いますが、最後には;が必要です。
宣言だから、納得しやすいよね。…} CMyClass_A;という具合についでにここでクラス変数を作ることもできるけど、あんまりやらない。
それとクラス名CMyClassの先頭のCはクラスのC。よく使われる命名法です。

privateな領域で宣言したnValueは自分自身のクラス意外からはアクセスできないようになります。たとえばmain()関数からとかは
アクセスできないようになります。
publicな領域で宣言した2つの関数は、自分自身以外からもアクセスできます。main()関数からもアクセスOKです。

プログラムファイルでそのメンバ関数の中身を記述しますがこのときに出てくる変な記号が、まずはひとつ覚えにくいところになります。
クラスの中の関数なので、それをあらわすために、クラス名とメンバ関数名の間に::という記号が必要になります。覚えるしかないと思います。
::はスコープ解決演算子という名前がついています。演算子の呼び方までは覚えなくてもいいけど、覚えると同じ仲間との会話が成立しやすくなります。
専門用語は2ちゃんねるやなんとかオタの間でも飛び交います。その人たちと関わるなら覚えた方がいいし、関わりたくなければ覚えなくてもいいのです。
覚えてなくても付き合いをしてくれる仲間を探すというのも、生き方なのです。

一つの変数に値を代入したり、値を読み込んだりするだけのクラス。ながい。とてつもなく覚えることが多すぎる。
自分は最初そのように感じました。そして、これがまだクラスという概念の序章に過ぎないと知った時。なんでこんなむずいことするん?
嫌がらせか?とか思ってましたが、世界中の人がクラスを使いまくって、いろいろな便利なものを作っているいう状況になっているのでした。
やっぱ覚えるしかないんだね。

そして、それを乗り越えてこそ、たどり着ける場所がきっとある。
映像・音楽・科学・自動化・利便性の向上・情報の整理・作業の高速化。世界をひとつにできるかもしれない、そのなにか。

そのなにかがなにかさえもわからず。なにかをしなくちゃ。
でメイン関数を書くmain.cppとかに
main.cpp

#include <iostream>
#include "CMyClass.h"
int main() {
    int nCMyClass_nValue = 0;
    CMyClass* CMyClass_A;
    CMyClass_A = new CMyClass;
    CMyClass_A->SetMyClass_n(10);
    nCMyClass_nValue = CMyClass_A->GetMyClass_n();
    std::cout << nCMyClass_nValue;
    delete CMyClass_A;
    return 0;
}

って定義したクラスを使う。
5行目:作成したCMyClassクラスのポインタの型であるCMyClass_Aを宣言。
6行目:ポインタCMyClass_Aにnew演算子と呼ばれるものをこのように使うことでCMyClassを実体化する。つまり、メモリを確保したって感じかな。
7行目:また来ましたね。変な記号。C -> アロー演算子 "->" アロー演算子です。でもさっきのもこれもC言語でも出てきた構文です。
8行目:同じく。アロー演算子で関数を呼び出しています。さっきのは引数付きだけど、今回は戻り値ありのメンバ関数です。
9行目:これはクラスとは関係ないけどC++の構文ですstd::coutはiostreamをインクルードすることにより使用可能な標準出力でWindowsの場合。
Commandプロンプトに出力されるようになっています。<<は出力演算子と呼んでいます。こういうのはC++の勉強用にしか使わないやり方です。
計算結果がどうだったのかを表示させてみるということですね。入力演算子もあるのですが、あまり役に立たないです。覚えておくというのは大事です。
でも、また違う機会に説明ですね。
アロー演算子は近いうちに復習したいですね。って自分は誰に話しかけてるんでしょうね。

なんとなくでこのページ書き始めたので、C++のリファレンスみたいなのが出来上がるといいなと思っただけ。
見直しもしてないし、コード間違えてたりして…コワイ。
このページに今たどり着いた人は残念ですが、また10年後にここにくると何かがかわってるかもしれません。ごめんね。

VisualC++でやるときは空のプロジェクトを作成で、きちんと分類すべくフォルダを作った上、適当な名前のプロジェクトを付けて、
プロジェクトエクスプローラから、ヘッダファイルのフォルダで右クリックして追加のヘッダファイルで、今回のサンプルのヘッダファイルを作って、
CPPファイルのフォルダの上で右クリックして追加のCPPファイルで2つのファイルを作成して、それぞれにコードを打ち込んで、
そんでもってF7キーを押して、ビルドです。

そしたら、プロジェクトを保存したフォルダの中にDebugフォルダがあるので、コマンドプロンプトのカレントディレクトリをそのDebugフォルダにした状態で
Debugフォルダの中にあるexeファイルの名前を入力してEnterキーを押したら、コマンドプロンプトに実行結果として10って表示されます。


C++に戻る