じゅぴの記録帳

いったイベントや勉強したこと等を記録するブログです 間違ってるとこあれば指摘お願いします

クラスのメンバの関数ポインタを格納したコンテナを作る

UnityのOnCollisionEnterとかの当たり判定をc++で再現する際にとても困ったのでそのメモです。

Gitに上げたソースです。

その1 普通の関数ポインタを試す

LInux上でのネットワークを勉強したときに引数と戻り値の型が同じならなんでもいれれる関数ポインタの存在を思い出しもっと調べてみると関数ポインタを格納できるstd::functionの存在を知り試してみました。

//インクルードは省いて書きます。

void ko(int)
{
    std::cout << "616" << std::endl;
}

int main(void)
{//普通に関数ポインタを格納
     std::function<void(int)> pointer;

     pointer = ko;
 }

普通の関数のアドレスの格納は成功。でもクラスのメンバ関数の格納がうまくいかない・・・
もっと調べてみるとstd::bindという便利そうなやつが!

その2 クラスのメンバ(引数なし)をコンテナに格納する

早速std::bindを使い引数ありのメンバをstd::functionを格納しようとすると失敗・・・
なのでまずは引数なしのメンバを試しました!

class Test
{
public:
    Test(){};
    ~Test(){};
    int member = 0;

    void Print(int num)
    {
        std::cout << "void Print(int)" << std::endl;
        std::cout << member << std::endl;
        std::cout << num << std::endl;
    }

    void Print2(void)
    {
        std::cout << "void Print2(void)" << std::endl;
    }
};

↑試すクラスです メソッド名は適当です

{
        //コンテナにメンバの関数ポインタを格納
        Test test1;
        //関数ポインタをいれるコンテナ
        std::unordered_map<int, std::function<void(void)>> map;

        map[0] = std::bind(&Test::Print2, &test1);

        //実行
        map[0]();
}

実行してみると数字が表示されてとても簡単にメソッドをコンテナに格納、実行できました。

その3 クラスのメンバ(引数あり)をコンテナに格納する

引数ありはしばらく試行錯誤しても実行できなかったのですがstd::bindの説明をよくみたらstd::placeholdersっていうものを発見。
早速使用。

{
        //コンテナに引数ありのメンバの関数ポインタを格納
        Test test2;
        //関数ポインタをいれるコンテナ
        std::unordered_map<int, std::function<void(int)>> map2;

        map2[0] = std::bind(&Test::Print, &test2, std::placeholders::_1);

        //引数を入れて実行
        map2[0](2);

        //本体のほうで引数を変更してみる
        test2.member = 100;

        //引数を入れて実行
        map2[0](200);
    }

クラスはさっきと同じものを使用。
あたりをクラスのほうで変えても表示内容が変わったのでちゃんと渡せてそうです。

最後に

調べるのめっちゃ時間かかりましたが当たり判定はこれを使えば簡単に行けそうです。
コンポーネント指向の当たり判定はこれとメタプログラミングを使えばUnityみたいに記述できそうです。
もしかしてこれはコールバックってやつなのでは…?

参考にしたサイト

std::bind - C++入門

std::function - cpprefjp

【C++】std::bindの使い方 - Qiita

Qrunchに出会えて

この記事はQrunchがサービス終了するのでこういうサービスを使っていたという記録(自分用のメモ?)です。

久々の投稿!

前書いたのが7月末くらいなので前回から3か月ぶりの久々の投稿です。

Qrunchのアクセス解析機能がなくなりGoogle Analyticsを付けてからしばらくアクセスしていなかったのですがこの前久々にアクセスするとまさかのサービス終了の文字が…。

なのでこの機会にQrunchを知った理由とか書いて残しておこうと思います。

Qrunchを知った理由

QrunchはQiitaの「もっと気軽にアウトプットできる技術ブログサービス「Qrunch(クランチ)」をリリースした【個人開発】」 で知りました。

当時はてなブログの方で1~2記事投稿していたのですがアクセスはあまりなくほかに投稿できるとこないかなーと探していました。Qiitaに書くのは「全ての開発者がQiitaへのアウトプットをやめるべき理由 」等の記事を見てやめていました。寄稿ってなんか怖いし

それで見つけたQrunchの投稿された履歴を見れるのを見てここなら書いた記事を見てもらえる!と思い始めました。

Qrunchを使ってみて

機能が使いやすかった

投稿する機能やアクセス数を見れる機能が使いやすく投稿を気軽にできました。

投稿した記事がタイムラインに乗る機能もよかったです。

書いた記事のアクセスが増えた

はてなのみで書いていた時は1日に1人のアクセスがあればいいほうだったのですが、Qrunchと同時に投稿するようになり少しずつQrunchとはてなブログのアクセスが増えていきました。

記事を書いている時点ではQrunchのほうは先月(2020年9月)がだいたい合計500アクセス、はてなは合計50アクセス位ありとてもモチベにつながりました。

はてなブログのみで書いていた時より記事が増えたのもあると思うのですが、Qrunchのタイムライン?にのり興味を持った人が見てくれてSEOが上がったのががとても大きかったと思います。

特に「インクルードパスを通す」が一番アクセスが多かったです。ありがとうございました。

これから

めっちゃ悩んでいます。

Qrunchみたいにブログみたいにいろいろな記事を投稿でき、人に見てもらえる可能性が高い所なぁ…。

たぶんZennCrieitを使うと思います。

そのうち書いた記事の書き直しもしたい…。

運営さん、Qrunchを作ってくださりありがとうございました。

とてもいいサービスでした。

記録⑧(なめたねじの取り外し)

学校で推奨されていて買ったパソコンのメモリを交換しました。

その際になめたねじ(4cm)の交換にめっちゃ手間取って時間がかかったのでので今回はこれを書きます。

ねじをなめるまで

Windowsの立ち上げに1分、VS2017の起動はもっと時間がかかりメモリの交換を決意しました。(もともと4GBの搭載PC)

取扱説明書をなくしてしまい、CPU-Zというツールでメモリの規格を調べました。

規格はDDR4-2400みたいでAmazonでcrucialの ノートPC用メモリ DDR4-2400 8GB×2枚を注文しました。

到着していざ開けようとするとパソコンのメモリのところのネジが家にあるドライバー(100均)で回らない…。

いじになってドライバーを回しているとねじのプラス部分がなくなり、なめてしまいました。

ためしたこと

1.輪ゴム

他のサイトで紹介されていた輪ゴムを試してみましたが空回りし続けるだけでした。

2.ねじ救出隊

次にねじ救出隊というのを試しました。これはAmazonだと3個入りしか頼めないみたいだったので家の近くの工具専門店で1個だけ買いました。

ねじ救出隊はねじの頭にいれてドライバーとのかみ合わせをよくするもので、ほぼ溝がなくなっている(もう円)の状態のやつでは効果がありませんでした。

3.瞬間接着剤

ねじ救出隊でもだめだったので、コンビニに走り瞬間接着剤でドライバーとねじをくっつけるのを試してみました。

ねじに瞬間接着剤をつけその上にドライバーを置き、充分な時間がたってから回しました。

結果はドライバーを回すと接着剤の方が負けて失敗しました。(溝に残ったやつをとるの大変でした)

4.専門店に持っていく

かなり家いろいろ失敗してしまったので休日に専門店に持っていきました。

1件目は断られ、2件目は成功するかどうかわからず失敗してもお金をとりますといわれ諦めました。

もっと早く持っていけばよかったです・・・。

店員さんから電動ドライバーを使うといいとアドバイスをもらいすぐにAmazonで安く、使いやすそうな以下の電動ドライバーを注文しました。

5.電動ドライバー、ネジ取り破損スクリュー

電動ドライバーが届きアネックス(ANEX) なめたネジはずしビット3本組 のようなものが必要と知り、よさそうなものを探しました。

なめたねじ外しビットは定規がすぐに見つからずねじのサイズがわからなかったため様々なサイズの入っていたCohotek ネジ取り 破損スクリュー 22点セットを注文しました。

破損スクリューが届き電動ドライバー一番小さいサイズの削る方をつけて2日かけて2~3時間くらい回しました。

全然削れずやばいなぁ…と思っているとき、定規が見つかり図ってみるとねじは4cmでもう一つ上のサイズが試せることがわかりすぐに試してみました。

10分もせずかなり削れもうちょっとやったら外す方のビット?を試そうと思った時削る方のビットでまわりました。

めっちゃくちゃ嘘みたいに回りました。

結論

ネジ取りインパクトを買って使うことも考えましたがHDDは衝撃に弱いらしいことから辞めました。

パソコン等のマジでやらかしたらダメなところのネジは100均のドライバーじゃなくしっかりしたものを買った方がいいと思います。

なめたときは意地になってやるのはだめです。すぐに合うサイズのドライバーを買ってくるなりしたほうがいいです。

記録⑦(one driveのバックアップ)

最近ノートPCのメモリを交換するのに失敗し、ねじをなめました。

そのねじをとるのに電動ドライバー等を用意し、いざねじをとろう挑戦したら1日でとれず、その次の日挑戦する前に起動してみると起動までの時間が長くなっていました。で、バックアップのためone driveの自動バックアップを使ったのですが、めっちゃ時間がかかったのでその記録です。

起こったこと

「one driveはファイル更新しています」とでてファイルのほうは「同期保留中です」から変化がない。

ファイルはデスクトップ上のもの70GBくらい。

やったこと

たぶんですが、one driveは同期するファイルをすべてリストアップしてから同期しているみたいです。
なので、一度C直下にデスクトップのものをすべて移動し、ちょっとずつ(2GB~100MBくらい)デスクトップに戻しバックアップさせることで解決しました。めっちゃ時間かかったので注意が必要です・・・。

記録⑥(tex記法)

tex記法とは

tex記法はLaTeXと呼ばれるテキストツールで数式を入力する際に使用されている書き方のことです。多分正式名称じゃないです

このtex記法はwordやtyporaでも使うことができ、めちゃくちゃ便利です

Typoraとはって人はメモ用アプリは結局Typoraが一番良かった - 盆暗の学習記をどうぞ。

おすすめです。

表示例

例)ルート、分数

\sqrt{a}で

 \sqrt{a}

\frac{1}{2}で

 \frac{1}{2}

等を表示できます。

ほかにもいろいろ表示できます。

よく忘れるので数学のTeX記法をまとめ - Qiita

あとがき

tex記法めちゃくちゃ便利だったのでしばらく勉強したいと思います。

そのうちLaTeXにも触れてみたいなーとめっちゃ思います。

※wordはdocxじゃないと対応していないみたいなのでそこ注意です。

記録⑤(Path Autocomplete)

やっと機能理解した。

Path Autocompleteとは

vscode拡張機能の一つでパス指定の際に候補を出してくれる便利なやつ。
にたものにPath Intellisenseがある。(こっちの方が使っている人多い)

わからなかったこと

c言語のincludeの際にPath Autocompleteがあってもなくても候補が表示されていたので効果がわからなかった。Twitterでみんなが入れるべきっていう理由がわからなかった

わかったこと

おそらく拡張機能c/c++に似たような機能が入っている。(時間がなくてまだ読めてない)
c++のintellisenseの単体の拡張を入れなくても表示されるのもおそらくこいつのおかげ
便利ですねこれ
c/c++の説明ページ日本語ほしいです・・・

記録④(シングルトン)

やっと理解したけど忘れそうなのでメモです。

シングルトンとは

Singleton パターン(シングルトン・パターン)とは、オブジェクト指向コンピュータプログラム)における、デザインパターン)の1つである。GoF) (Gang of Four; 4人のギャングたち) によって定義された。Singleton パターンとは、そのクラス)のインスタンスが1つしか生成されないことを保証するデザインパターンのことである。

引用元Singleton パターン - Wikipedia

つまり1つのクラスに1個だけしか生成できないように枷を掛けれるっぽい。

ソース

```c++ private: Singleton() {} // コンストラクタを private に置く。 Singleton(const Singleton&); // コピーコンストラクタも private に置き、定義しない。 Singleton& operator=(const Singleton&); // コピー代入演算子も private に置き、定義しない。 ~Singleton() {} // デストラクタを private に置く。 public: static Singleton& getInstance() { static Singleton inst; // private なコンストラクタを呼び出す。 return inst; }

const char* getString() const { return "Hello world!"; } }; ```

引用元Singleton パターン - Wikipedia

getinstanceでinstがあればそれを返し、なければ生成している

そもそもstaticとは

最初static忘れていたので理解できませんでした。
staticは変数等のスコープを指定して、破棄できないようにできる識別子。
ローカル変数に使えばその変数は次に呼ばれたときも値を保持している。、
クラスのメンバ変数に使えばそのクラスのものをいくつ宣言しても1つしか生成されない(すべてで共通
の変数ができる。

問題

仕様上グローバル変数のように使用できるのでとても危険らしい。 破棄タイミングも特殊っぽいので注意!

参考

C++ static 修飾子 入門 - ViVi web site