トップページソフトウェア系

不正確なことも多いけど自分なりにまとめてみる。


CLI(Common Language Infrastructure:共通言語基盤)

CLIとは.NET Frameworkの基本仕様のこと。
特定のプログラミング言語やコンピュータアーキテクチャに依存しない。


C++/CLI

C++/CLIとは、「C++で作成したプログラムをCLI(.NET Framework)上で動かせるようにするプログラミング言語」。
C#やVB.NETと同じような.NETプラットフォームのプログラミング言語の1つ。

これのデメリットとしては、C言語で作られたライブラリ(アンマネージ)などへ .NETのプログラム(マネージド)から文字列を渡す場合、

System::String ^
から
char *
へ変換する必要がある、など。


継承の書き方

C++/CLIでクラスを宣言するには、キーワードrefとclassを用いて次のように記述する。 これを参照クラス宣言という。

ref class クラス名:継承元のクラス名
public ref class UltraTabControl  :  public System::Windows::Forms::TabControl
    {
    ・・・
    }


名前空間

名前空間は、名前の衝突(同じ名前を付けることで呼び出し先が曖昧になること)を避けるために有効に働きます。
例えば、「stdio.h」には「remove関数」が存在します。
そのため、プログラマが「remove」という名前の自作関数を作ると、stdio.hにあるremove関数なのか自作関数のremove関数なのか、見分けがつかなくなります。
名前空間は、関数などの「名前」が存在する「住所」を定義するようなものです。
同じ「山田さん」でも、「1丁目の山田さん」と「2丁目の山田さん」は別の人であると識別できます。
この「1丁目の」「2丁目の」が名前空間に当たります。
先ほどのremove関数の例で言うと、それぞれを「stdio.hのremove関数」「自作関数のremove関数」と呼ぶことで、別の関数と識別することができます。


for each文

for each (DataRow ^ row in dt->Rows)
    {
    //行追加
    dgvVirtuaroidInfo->Rows->Add();

    //値の設定
    dgvVirtuaroidInfo->Rows[i]->Cells[j]->Value = row["colNo"];
    dgvVirtuaroidInfo->Rows[i]->Cells[j]->Value = row["colKataban"];
    dgvVirtuaroidInfo->Rows[i]->Cells[j]->Value = row["colName"];
    dgvVirtuaroidInfo->Rows[i]->Cells[j]->Value = row["colBGColor"];
    dgvVirtuaroidInfo->Rows[i]->Cells[j]->Value = row["colチョメチョメ"];
    }
    //dtはデータテーブルとする。dgvVirtuaroidInfoはデータグリッドビュー。
    //データグリッドビューに行を追加している
    //for文が変数を定義してループ処理ごとにインクリメントしているのに対し、foreach文では型名とオブジェクト名の定義だけになっており、コレクションの要素数を取得しない

言語ごとの比較

空ポインタアクセス演算子名前空間usingディレクティブオーバーライドカレントオブジェクトインスタンスの構築
C++NULL . および ->Name1::ClassAusing namespace 名前空間;void func() {}thisnew
C++/CLIアンマネージド:NULL
マネージド:nullptr
 ->Name1::ClassAusing namespace 名前空間;
またはusing 名前空間;
void func() override {}thisアンマネージド:new
マネージド:gcnew
C#null .Name1.ClassAusing 名前空間;override void func() {}thisnew

「::」はスコープ解決演算子(大域解決演算子)と呼ばれる。

Ufcpp.Collections.Vectorというように、名前空間をすべて指定した形式の名前を完全修飾名(fully qualified name)という。


オーバーライド

派生クラスでは、基底クラスで定義されているメソッドを上書きして新しいものにすることができる。
これをオーバーライドという。(override=上書き、優先)


カレントオブジェクト

オブジェクト指向言語において、インスタンスメソッドが起動されたオブジェクトのことをカレントオブジェクトという。

// 
// SomeListenerのManagedWrapper
//
ref class ListenerWrap {
public:
    // コンストラクタ
    ListenerWrap(SomeListener* cb)
    : cb_(cb)
    {

    }
    // デストラクタ
    ~ListenerWrap()
    {
        // ファイナライザへ委譲
        // C++CLIの場合, GC::SuppressFinalize(this)は無条件で行われるので呼び出しは不要.
        this->!ListenerWrap();
    }
    // ファイナライザ
    !ListenerWrap()
    {
        // ポインタを使った終了処理など.
        if (cb_) {
            cb_->close();  // Unmanaged オブジェクトの cb_ の後始末(★ ここが問題)
            cb_ = nullptr;   // ListenerWrapとSomeListenerポインタの関連付けを解除.
        }
    }

    virtual void Exec(int param);
protected:
    SomeListener* cb_;
};

マネージド・アンマネージ

マネージドコード(C#、Visual Basicなど、.NET 上で実行可能な高水準言語)とは、その実行がランタイム(run-time)によって管理されるコード。
対して、アンマネージコード(CやC++)は、メモリ管理からセキュリティの考慮事項まで、多くのことをプログラマが担当する。
C++/CLIのgcnewなんかはマネージドコード。


共通言語ランタイム(CLR, Common Language Runtime)

Microsoftの.NET Framework上でサービスやアプリケーションを実行するための仮想マシンの名称。


ハンドル(handle)

C++/CLIには、共通言語ランタイムが管理しているインスタンスを参照する変数を表現する手段として、
ハンドル型がある。
これは性質的にはポインタと類似している。
しかし、C++ のポインタ型 * や参照型 & よりも安全にオブジェクトを参照することができる(らしい)。
ハンドル型はクラス名 ^という構文を使う。
またハンドルからメソッドやプロパティへのアクセスはアロー演算子 -> を用いる。


別ページにまとめたもの

MessageBox クラス

Object クラス


★Form クラス

名前空間:System::Windows::Forms アプリケーションのユーザーインターフェースを構成するウィンドウ、またはダイアログボックスを表す。


★Message 構造体

名前空間:System::Windows::Forms

Windowsメッセージを実装する。(どゆこと?)


Console クラス

名前空間:System
アセンブリ:mscorlib.dll

コンソール アプリケーションの標準入力ストリーム、標準出力ストリーム、および標準エラー ストリームを表す。 このクラスは継承できない。

代表的なメソッド

WriteLine(String)

★TabPage クラス

名前空間:System::Windows::Forms

その名の通り、タブを作れる。


★DataGridViewColumn クラス

名前空間:System::Windows::Forms

DataGridView コントロールの列を表します。


「L" "」 という文字列の表現の意味


ワイド文字(wide character) は、環境が対応しているすべての文字が表現できる。
マルチバイト文字を char型で表現するのに対し、ワイド文字は wchar_t型で表現する。
ワイド文字やワイド文字列のリテラルには、L というプリフィックスを付加して、L’x’ や L“abc” のように表す。

文字列リテラル(string literal)

文字列リテラルは文字のシーケンスを表し、その全体が、null で終わる文字列を形成する。
文字列は二重引用符で囲む必要がある。

文字リテラル(character literals)

文字リテラルは、定数文字で構成される。 これは単一引用符で囲んだ文字によって表される。
出典 - https://learn.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=msvc-170


Cプリプロセッサ

Cプリプロセッサとは,C言語のコンパイラが機械語への翻訳を始める前に、
指示され た内容の前処理(プリプロセス)を行うプログラムのことをいう。
Cプリプロセッサへの指示は次のようなプリプロセッサ指令として、
C言語のソースプログラ ム中に記述しておく。

#プリプロセッサ指令の種類

プリプロセッサ指令(プリプロセッサディレクティブ)の種類には,主なものとして次が用意されている。

#define <ファイル名>
        //標準ライブラリ用のヘッダファイルを読み込む
#define "ファイル名"
        //自作・ローカルなヘッダファイルを読み込む
#define 定義したい名前 置換内容
        //定数などの定義
#pragma プラグマ名 プラグマ用の記述
        //そのコンパイラ専用に特別に用意されたプリプロセッサ指令
#pragma once
	// MSVC(Microsoft Visual C++)環境でのインクルードガード
	//インクルードガードは、includeディレクティブによる相互インクルードの無限ループを防ぐために利用される


プリプロセッサ指令は、C言語の文法とは関係ない別の文法なので注意すること。
特に,文末に「;」は必要なく,逆に 「;」を書くとエラーの原因となる。


ヘッダファイル windows.h

windows.h は Windows API を利用するために必要なヘッダファイルです。

windows.h は幾つかの子ヘッダファイルをインクルードするマスターインクルードファイルで,例えば次のようなヘッダファイルをインクルードします。

場所 - C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um

Tweet