MENU

C++むずくね(part2)

こんにちは、ごまあぶらです。

カテゴリーを日記のほうにしたいと思います。はじめてのC++を正しいことだけ書くのは無理すぎました。

日記は適当に書く用のやつです。

家計簿作ろうぜチャンネルです。前回はHello worldで終わってました。続きやります。

何すればいいんですかね。

変数の型とか、条件分岐とかがありました。あと、Cといえばポインタとかもありましたね。それやります。

と思いましたが、ファイル分けの方法からやりたいと思います。組み方を覚えても、どうやって組み込むかがわからないと実行できないですからね。

目次

ファイル分け

mainがある奴と、下の変数を試しましたファイルを分けてやりたいですね。C++はヘッダーファイルとソースファイルでcppファイルとhファイルで分けてやっていくのが基本らしいので、そういう感じでやります。

ヘッダーファイルにh.ファイルを作る

ソースファイルにcppファイルを作ったときみたいに、ソリューションエクスプローラーからヘッダーファイルを右クリックして追加からできるかと思ったんですが、それだとなんかcppファイルが作られました。

なんかすべてのテンプレートを表示とかありますね。ポチッ。

hファイル作ったらあとコード書きまくり侍ですね。

調べた感じ、一番最初に実行されるmain()→hファイル→cppファイルみたいな感じの流れにするのが基本っぽいです。

書き方はサンプルがないとよくわからんので、とりあえずMicrosoftの解説してるやつから勝手に持ってきました。

https://learn.microsoft.com/ja-jp/cpp/cpp/header-files-cpp?view=msvc-170

↑これ

一番下にあるなっがいやつではなく、その前のmy_classとかのやつです。

コードだけ見てもなんもわかんねえですね。

namespaceが結構出てきてますが、調べたら名前の被り防止みたいな面が大きいみたいなので、全部取っ払ってみます。

なんかシンプルになりました。やったことは、namespace全消し、my_classのiostreamを使ってるcoutとendlにstd::つけただけです。

こういうのは処理される順番で見ていったら割とわかる気がするので、main.cppから見てみます。

#includeでmy_class.hを持ってきてます。なのでmy_class.hを見ます。

class my_class
{
public:
    void do_something();
};

さっきのMicrosoftの記事によると、ヘッダーファイルがコンパイラに伝えるべきなのはmy_classあるぞ!ってことと、do_something使えるぞ!ってことだけみたいです。何言ってるかよくわかんねえと思いますので、厳密にいうと間違ってるタイプのたとえ話をします。

こっから話しぐちゃぐちゃなので飛ばしてください。

#includeでmy_class.hのパッケージの箱がmainに送られてきます。mainさんはmy_classのdo_somethingを使うことだけは知ってたので、この箱を見てああこれねとなり、箱を開けます。その中にはmy_class.cppが入っているのでその処理をすることができる的な。そういうことが起きてると思います。

上の文をAIに読ませたら、

mainさんはmy_classというものを使いたいのですが、まだその正体を知りません。

そこで#include "my_class.h"を使って、my_classの説明書を持ってきます。

説明書には、

my_classというクラスがあります」
「そのクラスにはdo_something()という機能があります」

と書いてあります。

mainさんはこの説明書を読むことで、「なるほど、my_classにはdo_something()があるんだな」と分かります。

ただし、この説明書には**do_something()が実際に何をするのかまでは書いてありません**。

実際の処理はmy_class.cppに書かれています。

そのため、mainさんがmc.do_something()とお願いすると、最終的にはリンカーさんが「その処理ならmy_class.cpp側にあるよ」と見つけて、mainさんと実際の処理をつないでくれます。

と言われました。多分こっちのほうが正しいです。

もう適当に書いちゃお。classって多分コーディングするやつ全部今中に入ってますよね。というかさっきから予測変換がくそ過ぎてきれそうです。余計なことしかしないじゃないか!このやろう!

リンカーがいろいろやってるのが分かったところで、何の話をしていたんでしたっけ。

あ、コードがどんな感じでつながってるかでしたっけ。

これは厳密にC++のコンパイルの順序というか、やってることで覚えたら絶対理解できないと調べてて思いました。↑のやつが個人的な最適解です。

結構間が空いたのでおんなじの貼りました。

これを見ると、includeはmy_class.hはmainにもmy_classにもやっているのがわかります。ということは、これを最初に作ったほうがいろいろと楽なんじゃないかと思いました。

あとはmainに処理をつけるのと、cppのほうで処理内容を書くだけなんですが、処理内容を先に決めといたほうがいろいろと楽そうなので

h→cpp→mainの順番で今後はやっていきたいと思います。

まだclassの作り方ぴんと来てないですが、作るときに流れでやります。

my_class.h

さっき決めた順番でやっていきます。

// my_class.h

    class my_class
    {
    public:
        void do_something();
    };

これですね。

やってるぽいことはmy_classを作ってそんなかにvoid do_something()でこれがあるよって言ってるんでしょうか?よくわかんないのでAIに聞いてみました。

どうやらpublicが外部から呼び出せるぜゾーンの始まりの合図らしく、そこにvoid do somethingをかまして外からでも使える関数を作ったていうことらしいです。privateとかもpublicみたいにゾーンを作れるらしいんですが、長くなりそうなんで次に回したいと思います。

ここまででdo somethingを作ったのはいいんですが、中身がないですね。ということなので、my_class.cppで中身を作りましょう。

my_class.cpp

// my_class.cpp
#include "my_class.h" // header in local directory
#include <iostream> // header in standard library


void my_class::do_something()
{
    std::cout << "Doing something!" << std::endl;
}

処理内容はいいんですが、その前のmy_class::do_something()はなんでしょうか?と思ったんですが、これ、どう考えてもさっきのmy_class.hで作ったdo_somethingの中身ですよってことですよね。そのためにmy_class.hをincludeしてるんですね。多分。

次mainです。

main.cpp

// my_program.cpp
#include "my_class.h"

int main()
{
    my_class mc;
    mc.do_something();
    return 0;
}

これはincludeしてmc作ってmy_classを使えるようにしてから使ってるだけですね。特にどうということもなさそうです。

変数の型

C++は型を指定しないと変数が使えないタイプのやつみたいなので、結構型を覚えとかないとだめかもしれんすね。

https://learn.microsoft.com/ja-jp/cpp/cpp/cpp-type-system-modern-cpp?view=msvc-170

↑参考にしたやつ これ見たほうが勉強になると思います

なんかめっちゃくちゃ種類があるようなので、基本的な奴だけ表にしました。

何を入れる?
int整数42
double小数3.14
booltrue / falseTRUE
char1文字A
std::string文字列アンパンマン号

とりあえずこれを使って、あとから軽量化とかを目指すときに変えるって感じがいい…のかは知らないですが、そんな感じでやりたいと思います。

これでちょっと試して気づいたんですが、std::stringとかで日本語を使おうとすると、utf-8にしないとエラーが出ることがわかりました。これどうやって直すかよくわかんなかったので、取り合えずアルファベットのみでとりあえずやります。

条件分岐

これは言語によって違いがあんまりないやつなので、たぶんC++でもそんな変わらんでしょう!

これでクッソ特徴的な奴だったら面白かったんですが、すげえ普通でした。

if (条件) {
    // 条件がtrueなら実行
}
else if (別の条件) {
    // 最初の条件がfalseで、こっちがtrueなら実行
}
else {
    // どちらもfalseなら実行
}

いつものやつですね。

条件記号もほぼJavaとおんなじですね。

a == baとbが等しい
a != baとbが違う
a > baがbより大きい
a < baがbより小さい
a >= baがb以上
a <= baがb以下

ORは(~~~ || ~~~) ~~~は条件

ANDは( ~~~ && ~~~)

NOTは(!~~~)

でJavaとおんなじでした。

まとめ

今回はファイルわけのしかた、型をちょっとだけ覚える、条件分岐使えるようにする的な感じのやつでした。めっちゃ適当にまとめてるのでめっちゃ読みづらかったと思いますが、日記なので許してください。次はclassの書き方をちゃんとするのと適当になんか作ってみようと思います。あと日本語を使えるようにしたいです。

コメント

コメントする


目次