メモ - TejimaTuyoshi/returnread GitHub Wiki
同じメッセージを送っても受け手によって適切な処理が実行されている「多態性」(オーバーライド)に近い
「union」による、特別な仕様がある。
その機能は「先頭から」同じ「型」であれば変数名が違っても「多態性」のような変数の作り方が可能
↓理由
処理する「CPU」にある「レジスタ」(ハードウェアで作られた変数)しか使えないので、
できる限り、容量を取らないように箱の中身を分けて使用しているため、
そのCPUに対して少なく済むように作れるようにするため。
「push」や「pop」などで管理をよくしている。
構造体は、swichのようにして使用した場合は、あまりメモリを取らずに使用できる。
そのために、「ビットパターン」を作る必要がある。
なら、「変数後」「;」を置いた後で、「桁数」となる数値を入力すれば、「ビットパターン」を作らなくてもよい!
が、場合によっては、元は「右から」だが、「左から」になる可能性もある。
さらに、int型しか使えないし、「unsigned」なので注意!!!
といったように、左右されやすいので、「使う」ところと「使わない」ところが
あるので承知の上で使用しようね(そんなメモリでケチるのか...?)
[void(*po[])() =]
これは「ポインタ」に対して、変数のアドレスが呼ばれるようになる。※1
配列になっていれば
[i]のように、中身を設定して呼び出すことが可能に。
デリゲート = アウトソーシング(外部委託)するようなこと{C#}
これと似たようなものが※1である。
enum(イニューム)ハックは「int型であることを利用したハック」だが、特に大した事はない。
列挙体 ≒ 列挙型
enum eCOLOR { RED = 20, BLUE, GREEN = 5, WHITE = 10, BLACK };
この場合、RED = 20 BLUE = 21 GREEN = 5 WHITE = 10 BLACK = 11 となる。
キャストは4種類
コンスト{禁じ手}
スタティック(静的)
アップ(親から)
ダウン(子から){無理やり}
がある。
MVCパターン => デザインパターンを使用可。
デザインパターン内の中には「GoFデザインパターン」があり、 以下の大きな三つの視点に分けられる。
・「オブジェクトの生成」に関するパターン
・「プログラミングの構造」に関するパターン
・「オブジェクトの振る舞い」に関するパターン
パターンの使用方法によってはPC側の「手間」を省くことが可能に。(時間短縮)
ちなみに全部で23種類ある。
...覚えられるか?これ。
パターンはそれぞれ「状況に対応できる」、あるいは「ギアとして可動部となる」。
これを覚えていないとほぼ終わる。(仕事にならない)。
メッセージ・パッシング=「他のクラスの」関数を「自分のクラスから」呼び出すこと。
継承=「既にある」クラスを利用して「機能を追加」する仕組み
ポリモーフィズム=同じメッセージを送っても受け手によって適切な処理が行われる仕組み(多態性)
オブジェクト指向の関係
C#≒C・C++
継承 = 「インヘリタンス」
多態性 = 「ポリモフィズム」
スーパークラス = 親
サブクラス = 小
小→親
親→親
こんな感じらしい。
インヘリタンスを使う = コードの削減・間違いの減少・オブジェクト関係の明確化、拡張に。
using nameSpace ~~~ =これによってその中で作られた定義だったりを使用することが可能。
ポインター =アドレスの入れ替えが可能。しかし、変数をポインターで変えようとすると、「アドレス」が変わるので落ちてしまうことも。
参照 = アドレスの入れ替えが不可能。ただし、ポインターよりも安全で使用頻度がポインターより多い。
std = 「cout」や「endl」などを使用する際に使う。
const = 定数にする=>これ以降の訂正はできないようにする。
もし、別の変数から入れようとした場合はエラーになる。
処理内容に対してconst = この処理には手を付けられないようにする。という意思表示になる。
{}より前に設定することで、後からプログラムを書き替えられないようにする。
==コンスト関数(コンストメンバー関数)
ポインター同士の比較 = 絶対にtrueにはならない。
したいなら、「equals」を使う。
配列は「先頭のみ」アドレスを持っているので{全ての配列}を把握することが不可能。
cinやcoutが左になければならない。
using namespace 変数で(stdが基本)使用できるが、変数::型::変数名でも可。
cin = 入力を取得
cout = 出力する。
endl = 処理(文字)を終了する。
C++では、入力された値が型に合っているかを自動処理する。(型が違うとそれに合うように処理される。)
Parseなどは必要なし。
cinは[>>]で次に、coutでは[<<]で次に行く。
coutでは連結が(<<,>>)あるので、いちいち入れなおす必要が無い。
cin は「半角スペースまたは改行まで」を一つの入力として扱う。
C# では型の前に[]だが、 C++は変数の後に[]しかも、ある程度要素が決まっていないと作ることが不可能。
C++には、Lenghtが無い。(intのため)
System.Collections.Generic.List に相当する vector クラスを使うことが多い。こちらには要素数を返す size() メソッドがある。
しかし、配列はあまり使わない。
iostream = cin,coutを使用する。
何かするたびにこれを読み込む必要があるため、注意すること。
C++にも「マイクロソフト用」と「それ以外」で用途が異なる(使える物と使えないものが異なる。)
また、「環境」によっても異なるので注意すること。
文字列の長さを取得する string::length(), string::size() メソッド
文字列に文字・文字列が含まれているか調べる string::find() メソッド
部分文字列を 抽出する string::substr() メソッド
プロパティがないので、()は忘れないように使用する。
size_t = unsing intと同じ。
C++ はreferenceが表示されないことがあるので注意!
string::npos = 「含まれませんよ~」マイナスが使えないのでめっさ大きい数字が出る。
auto = C#のvar。
string::nposは、スコープの内容を解決するための予備軍。
(npos = no scopes)
:: = C#の[.]。
#include // to_string(), stoi() を使うために必要
to_string(n);//メソッドではなく、ただの関数
n = stoi(nstr); // 整数に変換する{エストゥアイ}
(型 to{から}型)
C言語はクラスごとにまとまっていないため、「独立して覚える」必要がある。
char = 実際は文字コードを入れている「int型」。
substr = 抽出。
virtual = 仮想関数。これがあるクラスを抽象クラス(abstractは不必要)。これしかないのを純粋仮想関数という。
抽象クラス = 方向性を決めるだけ。やった方がいいかな?ぐらい。
インターフェース = やらなければならない。
(100 == a)と書く方がエラーが出て見やすい。
ポインタによる変数
変数-> というようにアローを使用する
CPPにもListはある。
#include で可能。ただし、「仕様」が変わっている。
std::List dates;や、dates.emplace_back(数値等)などがある。
ちなみにListなので、List元の変数を呼び出すと全て出る。
また、元を壊すといろいろと不都合が起こるので注意。
コンテナ(List等の個々の変数の中身)を操作 => イテレーターが必要。
std::List::iterator it = dates.begin();と書き、
While文で書く。
While (it != dates.end()){
printf("%d\n", it);//変数前にがないと「変数の入れ物」だけを消すので、数字が残ってしまいバグる。
dates,erase() //で中にある変数のコンテナごと外に出す。この後、continueが必要。(そうしないと、戻ってこれない。)
dates.Clear//()その中身のすべてを破棄する。
it++;
}
emplace.insart =好きなところに入れられる。
newは重いので、あらかじめ「メモリプール」(入れ場所)に入れておいて、そこから好きな形に出す。
初期化をしないとバグる。=>メモリ内に「元から適当な数字が入っている」ので、初期化はしっかりやろうね。
マジックナンバーが出て「エラー」が発生する。これは対処しないと「滅・殺」されるので注意。
_objectType = (int)GameObjectType::Player; これでタグを作成しているので、「自分で作成する」必要がある。
autoはあまり書かない方がよい。 => たまに変な挙動をする。
増殖するときがあるので基本的には使わない方が良い。
円の時は四角と違って大きさの構造がことなるため、正直大分時間がかかりやすい。
作り方によっては、ハックを起こされやすいため注意が必要。
バッファオーバーフロー=>数字の情報を余分に作成、編集することで変更されてしまうこと。
基本は脆弱性が発見されてしまうとすぐやられてしまう。
昔のゲームはそういった脆弱性によるチートによってしっちゃかめっちゃかに。
難しい書き方にはなるが、安全にチートを使われることなく作成することが可能に。
メモリ=>大きさによって計算の速度や最大数などが変わる。
32bit => 4GBまで(intが4GBまで)=>最近はもっと大きいものが使えるようになっている。
PCによって計算方法が異なるが、Windosは左から1,10となっているので注意。
CPUはメモリを詰め詰めで行っているのでバグを引き起こしがち。
C++は別のクラスかを把握する際にひと手間必要になる。
C#はエラーを起こしてくれるのでそこまで心配はないが。
ちなみに余談だが、親子関係をコードで行う際には基本的に「警戒」が必要になる。
現在における危険なコードは、安全なコードを発掘されているのでそっちにしよう。
virtualをおかないと、派生クラスのデストラクター(~)が呼ばれなくなる場合があるので注意しよう。
インターフェースはないので、もし作ったなら「I」と名前を頭につけよう。
list = 添え字が使えない(決まったアドレスでないため)。
vector = 添え字が使用可能。
const =定数は△。
実はCPPではいろんな扱い方ができる。
定数として「扱う」。要は定義に近い。
constをうまく使えていないと就職候補から「弾かれる」。
参照型に限り、先にクラス名を作成していてもok(前方宣言)
イベントコール=>その状態になった際に起こす行動。
Quaternionは計算式上では掛けているが、実際は+=(インクリメント)と同じ。
カメラの位置計算に、座標の指定分(正規化済み)を入れることで実際に「背中についている」ようにすることが可能。
skebox では光が変に入らないようにすることが大事。
diffuse = 反射光
ambient = 環境光
specular = メタリックにする。
emissive = 光源化
ライブラリのmain上に入っている物は、基本的には制作者以外はいじらないようにする。
Drowは勝手にしてくれるものもあるが、基本的には自分たちで制作したほうが良い。
ヘッダークラスのコードはできるだけいじらないが、増やさなければならないクラスや変数のみ制作する。
Unityはコンポーネントで動くので、それ専用のmanagerを作ったりしておくことは無理だが、C++では必須。
ステート管理をする場合、参照として別のスクリプトで管理する。ただし、一つで全て行う必要は無い。
当たり判定は「一か所」に集めて判定する。
別々に判定してしまうと、同じ当たり判定で何度も反応してしまったり、一度だけでいいのに複数のエネミーやオブジェクトで何度もフラグが起こってしまう可能性がある。
一か所にまとめた当たり判定は、タグにした状態で使用すると尚よい。
SetUpCollider = コリジョンを作成可能。
新しい言語を使用する際、ポインタなどのメモリを意識する。
UTF8で表示するのが基本だが、C++より後に作成されたものなので文字列より前にu8とつける必要がある。
C++にinterfaceはない。多重継承はできるが、基本的には避けた方が良い。
「intはそのまま使わない」= 環境によってバイト数が変わってしまう。
セーブデータをintで作成 = 環境によっては使えない可能性がある。
template ≒ generic
ただし、バグりやすい関数なので注意。
frind => private関係なく入れてしまう。はっきりいってカプセル化とは...まさに不用心である。
使えるが、乱用ダメ。絶対。
一旦仕様は無視。その方が覚えるからね。
とりあえず、Unityで作ったことがあるやつでもいいからマネしてみよう。
inculde = クラス内の内容を把握する。 namespace = usingに近い。
siv3D => CPPで動かすものの、ライティングを行うのは別の媒体で書かれる。
constexpr =>「Csharp = CPP」では readme = const(実行時に決まるもの。起動時のみ変更可能。),
const = constexprなのである。(コンパイル時に決まっているもの。変動しない。)
ファイル分けは出来るものなので、できる限るまとめるものをまとめて区分けする方が良い。
のように形をそのまま形成できることも。
auto と var は同じ。
できるかぎりマジックナンバーはやめよう。どこからその数値が来たか分からなくなる。
foreach でなくとも、 forで書くことが可能。ただし見づらいので注意しよう。
変数での「計算」は場合によっては別の場所での数値の変動によりerrorを引き起こす可能性が高いため、
計算後の数値を補完する変数を用意する必要がある。(直接的に入れない方が良い。)
動的に動いているメモリに対して「削除」を行うことが不可能である。
普通の配列はパフォーマンスはいい。が、errorを起こしやすく他の人も見にくいためやめておいた方が良い。
配列の数値を図る関数は無い。が、Sizeofを活用して数値を切り出す。そのままではバイトの大きさで書かれるので注意。
ref=>inとoutの可能な部分がある。
in=>書き換え不可
out=>書き換え厳守
戻り値、値、メモリ、メンバー変数の書き換えが不可にできるなど場所によって変わる。
noexcept エラーを出させない。
exturn=>外部あるいは内部のファイルを取ってくることが可能。ただし、基本Cベースになっている可能性もあるので注意。
constを使えばある程度近くすることができるが挙動が怪しくなる恐れがある。
staticを使えばその関数内のみで使用するものとなるが...すべての変数、定数に着けるのは....
namespaceによって内部のみにすることが可能(内部リンケージ)。ただし、ネーム付けないのが原則。
匿名にしないと伸びるからね。「名前::その変数」みたいに。
匿名にすれば変数のみで可能になるよ。ほんと。
ヘッダーファイルを変更する=>時間めっちゃ食う...
それを避けるためにexturnで入れたりする。
でもクラスで対応できるのでそこまでかわらん。
絶対変更を通したくない=>イディオムを使うことで、ヘッダーでプライベートに入れたクラスに入れることで一切触れなくするというもの。
クラスの定義としてプライベートになる。なので、プライベートの宣言が必要。
コンストラクタ―、デストラクターが必要。
コンストラクタ―の横に:で変数(コンストラクタ―の変数名)を書いて初期化する必要がある。
デストラクターは~(チルダ)を頭に着ける。
お作法的にデストラクターには継承する場合、virtualを付ける必要がある。
理由として、コンストラクトは親子関係で深く継承する可能性があるため、元の方でメモリ開放を行わなければならない。
また、継承しない場合、finalを付ける必要がある。(変数名の後に着ける。)
また、その場所が最後の継承先である場合、overrideのあとにfinalを付ける必要がある。
stract = classとはあまり変わらない。(就職先がpublicが先かprivateが先かとなっている)
基本はclassを使用する。(というかC#に似た形になってしまっている...)
draw = 描画するのだが、Mainで行う際は順番に注意したうえで作成しなければならない。(描画する対象がdrawより下であればエラーが発生する。)
「クラス名.変数名;」 => stract(実体がない場合がある為、エラーが発生してしまう。)
「クラス名* 変数名;」 => ポインター(実体がなくともエラーは発生しない。)
ただし、数値移動不可の状態にしないとずれてしまう可能性がある。
& => 参照。右辺に参照先がないとエラーが出てしまう。なお、ポインタの中に入れる際にも右辺の変数の頭に使う必要がある。
ポインターで入れる際、その方にあう「初期化」されているものを入れる。
終わる際に、「作成したポインター先を開放しなければならない。」(mainの最後の方にdeleteする必要がある。)
プレフィックス => p(ポインター)のように特殊なものがある場合、クラス名の頭にpをつけることでポインターであることがわかる。
-> = アロー演算子は、ポインターの中身を出す際に使用する。
ポインターが入った変数の頭に*をつけると、ポインターを外すことが可能になる。(.を使用したコードが通るようになる。)
基本的に推奨はされない。(先ほどと同じエラーが発生しやすいため。)
動かしたい≠draw(あくまで「描画の為」なので、動かすために使用すると明らかにメモリ使用量が半端ないことになる。)
それぞれのクラスにdrawがあり、そこからmainに差し込む形の方が見やすかったりする。
動かしたいなら、「引数として float delta_time 」を使用している関数を作成する必要がある。
配列のように複数あるものに対してポインタを使うことは"控えた方"が良い。(100ぐらいなら...)
配列自体が「連続した値型」となるため発見しやすい。が、ポインタである場合「不連続な参照型」となり、
あまり良くない。というかとてもではないが作成しにくいと思う。だが、使わないとも限らないので注意。
Size = 配列
初期化式 => クラス名() : 変数(),変数()....のようにつないで書く。
初期化式時に引数を書く際、型と{}で書く方法が推奨されている。
やる事が同じ=やり方は様々。
シンタックスシュガー = やり方は同じでも、省略することが可能なやり方。ラムダ式のようなもの。
特に理由がなければポインタでいい。
使われたい側が 「frind 型 変数名」を書く(privateなのに...)
virtual void 名前() "=0;"override しないとエラーするぞというもの。なんで...
void func(){};この状態でもオーバーライドできる。変わってほしくないのに...
継承 => : public クラス名{}; ちなみに、publicのところを変えると、親元の部分も変わる為参照できなくなる。
キャストすればいけるけど、使い方あってるのか...?