バーラル @ ウィキ

C++の覚書

VC++/CLIの勉強のメモ書き Total《 -
『●作って覚える● VisualC++2008 出版社:秀和システム ¥2400+税』を参考に書いています。
かなり勉強になります。目標はVisual C++ 2008 Express Editonを完璧に使いこなし、いろんなソフトを短期間で開発できるようになること。

≪目次≫
①プログラミングの基礎
②C++/CLIの専門用語一覧
③オブジェクト指向
④プログラム作成
⑤簡単なアプリケーション製作


①プログラミングの基礎

①-1≪プログラム言語の種類の推移≫
言語(wikipediaへ) 特徴 プログラム例 公開年度
機械語 コンピュータが直接理解 0100110010とか・・・ 1940年頃?
アセンブリ言語 限りなく機械語に近い命令文で書く MOV AL 1とか・・・ 1940年頃?
FORTRUN(フォートラン) 科学技術計算向け言語 WRITE(6,*) 'Hello' 1954年
COBOL(コボル) 事務処理用言語 めんどくさい・・・ 1959年
BASIC FORTRUNを元に初心者用として開発 10 PRINT"Hello" 1960年頃
C言語 セミコロンで終わる!フリーフォーマット形式!現在(2009年)の標準的な言語! printf("Hello"); 1973年
C++ C言語を拡張。クラス採用。オブジェクト指向。 cout<<"Hello"<<endl; 1983年
VisualBasic BASICを基にしたQuickBasicをさらに拡張 Console.WriteLine("Hello") 1991年
Java 組み込み用プログラミング言語。オブジェクト指向強化。 System.out.println("Hello"); 1995年
C# .NET環境用言語。C言語、C++を元に拡張。.NET FrameworkもC#で書かれている。 Console.WriteLine("Hello"); 2000年
C++/CLI C++を.NET Frameworkに対応させるべく誕生した言語 Console.WriteLine("Hello"); 2005年

C++/CLI は【C++ Common Language Infrastructure】の略で【C++/共通言語基盤】と訳される。
Microsoft.NETに対応した言語は、ある一定のお約束(実行環境の仕様)が必要ですが、その仕様がCLIです。

①-2≪C++/CLIの特徴≫
《やさしい》
  • 初心者でも習得しやすい。つまりC言語を知っている人は余裕。
  • 画面デザインが簡単。ツールボックスが用意されている。
  • 感覚的、イベントドリブン方式(イベントハンドラが使用できる)。
  • コーディングの補助機能付き。インテリセンス機能付き(途中まで書くと続きを示してくれる)。
《本格的》
  • 大規模開発も可能。
  • .NET Framework上で動作。豊富がクラスライブラリ。
  • オブジェクト指向に完全対応。


①-3≪Windowsアプリケーションの特徴⇒.NET Framework≫
外観、Windowsの操作、アプリケーションの起動仕方(アイコンをクイック)とか・・・
似ているところがたくさんある。
このようにWindowsOS上で起動するアプリケーションの共通的な動作を共通化させて、一貫した操作を実現するための画面を【Windowsフォーム】と言います。このWindowsフォームをいちいちプログラミングに組み込むために記述するとめんどくさい・・・。
アプリケーションを作る場合、短時間・少ない労力でアプリケーションを作る仕組みが用意されている!!この仕組みを提供するものが【Microsoft.NET】です。

【Microsoft.NET】とは、単純に言ってしまうと、2000年6月にMicrosoftが発表したビジョンと戦略に名前をつけたものです。そのビジョンとは「いつでも、どこでも、どんなデバイスにも優れたソフトウェアで人々の可能性を広げる」で、このビジョンを実現するために開発されたのがMicrosoft.NETです。
Microsoft.NETの中で生まれたものに【.NET Framework】がありさまざまな技術が組み込まれている。

.NET Frameworkに組み込まれた技術
項目 .NET Frameworkとの関係説明
OS Windows系のOSなら種類を問わず実行できる。
開発環境 .NET Frameworkのよいところを引き出すための開発環境であるVisual Studio。
プログラミング言語 Visual Basic、C言語、C#、C++/CLIなど.NETに対応する言語が数十あり、その言語で書くことができる。
実行環境 .NETに対応する言語であれば共通の言語基盤(CLI)という仕組みにより、言語の種類を問わず実行することができる。
クラスライブラリ 料理にたとえると、巨大な冷蔵庫のようなもの。これにより、食材に困ることはない。.NET Framework3.5には3000を超えるクラスライブラリがある。Windowsアプリケーション用のクラスライブラリもある。
フレームワーク アプリケーションを作るための機能がワンセットになったもの。アプリケーションを作成する際、ある特定の処理をルールに基づいて行ってくれる枠組みにあたる。メモリ管理や例外といった複雑な処理を代わりにやってくれる。
その他・・・アーキテクチャ、セキュリティ、相互運用

VisualStudio2008はプログラミング言語を選べて、.NET Frameworkを最大限に利用できる統合開発環境である。今、使用しているVisual C++ 2008 Express Editon は機能が制限されているため無料で使用できている!!簡単に言うと、最新のプログラミング言語(C++/CLI)統合開発環境(VisualStudio2008)が1つになったツールがVisual C++ 2008 Express Edition である。

①-4≪①の復習ドリル!!≫
  • .NET Frameworkとは何か?自分なりに理解できているか?
  • 今の.NET Frameworkの最新バージョンはいくつ?
  • プログラミング言語の特性と.NET Frameworkの機能を最大限に生かすための統合開発環境は何?



②C++/CLIの専門用語一覧

といってもC++/CLIだけでなくプログラミングの基本的な考え方から生まれた専門用語が多いです。

≪クラスライブラリのイメージと統合開発環境のイメージ≫
献立・レシピ 自分で自由に決める
巨大冷蔵庫 クラスライブラリ
具財 クラス
台所 統合開発環境(VisualStudio)
これでアプリケーション(料理)を作る。

≪プロジェクトとソリューション(≒アプリケーション)≫
プロジェクト プログラムを製作する単位
ソリューション プロジェクトをいくつもいれる箱
例え・・・肉料理、魚料理、デザート、ドリンクがプロジェクトで、それらを含むフルコースがソリューション。

CLR Common Language Runtime(共通言語ランタイム)・・・共通のランタイムで動かせる。これも.NET Frameworkの恩恵。以前はVB5ランタイム、VB6ランタイムとか入れていたような・・・だからCLRは便利なんですね!


③オブジェクト指向

③-1≪オブジェクト指向が生まれた背景≫
プログラミング言語が生まれた当時は1人の凄腕のプログラマがいればアプリケーションができていました。
この時代に「プログラムは順番に実行される」ことから実行の順番をある程度の大きさにまとめて設計する手法が生まれた。それが【構造化設計】と呼ばれるものです。構造化設計ある程度まとまった単位でプログラマを割り当てて開発するため、大規模アプリケーションを開発できるようになった。
この構造化設計の最大の欠点は、他のアプリケーションを作る場合でもすでに作成したプログラムの再利用が難しかった点です。データがアプリケーション固有のものが多かったので処理にも影響が大きかったのです。

時代が進み、ハードの容量・処理のスピードが劇的に増加すると、データベースが誕生しました。アプリケーションはもともとデータを扱うものなので、データに着目した考え方が生まれます。これが【データ中心アプローチ設計】といわれる設計手法です。これによってデータに関して見通しのよい設計ができるようになる。

しかしながら、処理の部分に関して共通化が図れない状況でした。

そもそも、アプリケーションとはデータ処理の集まりです。ここから、データと処理をひとくくりにする考え方が生まれた。処理の手順でなく処理の対象に注目したのです。
この1つのまとまりをオブジェクトといいます。このオブジェクトの考え方が人間が利用するモノ(=Object)になぞらえて考えられています。この考え方をオブジェクト指向といいます。

これにより、処理とデータをひとくくりにして扱うと他のアプリケーション開発でもまったく同じものが使えるという利点が生まれた。

③-2≪プロパティ・メソッド・イベント・イベントハンドラ≫
●プロパティは、オブジェクトの中の「データ」にあたる部分です。オブジェクト指向の用語では属性とも言います。

例えば、ツールボックスからLabelを選ぶ。ここで、
Lable1・・・・・・・・・・・・・・・オブジェクト。
Lable1->BackColor ・・・・・・・・・Label1オブジェクトのBackColorプロパティ。
Lable1->ForeColor=Color::Red・・・・Label1オブジェクトのForeColorプロパティのデータがRed。
という意味をそれぞれ示す。

●メソッドは、オブジェクトの中の「処理」にあたる部分です。データを操作する処理は、データとともにオブジェクトの内部にあるため、外部から処理内容を隠せます。また、処理を開始させるには、外部や内部から処理を呼び出せます。

例えば、ツールボックスからLabelを選ぶと、
Lable1->Hide();・・・・・・・・・・Label1オブジェクトのHideメソッド呼び出し、を意味する。
また、MessageBoxを選ぶと、
MessageBox1::Show("Hello");MessageBoxオブジェクトのShowメソッド呼び出し、を意味する。

C++/CLIでは、プロパティやメソッドを使用するときに「->」または「::」を使います。「::」は静的メンバを呼び出すときに使います。静的メンバとは、MessageBox::Show()など、よく使うプロパティやメソッドを簡単に扱うための仕組みです。クラスはインスタンス化して使用する必要があります。しかしよく使用するプロパティやメソッドで毎回インスタンス化を行うとコードが非常に煩雑になります。そのためインスタンス化を自動で行ってくれる仕組みとして静的クラスが用意されています。通常のコントロールのプロパティやメソッド、インスタンスのプロパティやメソッドを使用するときは「->」を用いて、これ以外MessageBox::Show()のようなプロパティやメソッドの場合は「::」を使います。つまり、通常は「->」を使用するってことかな。たぶん。。。

●イベントは、オブジェクトの処理を行うきっかけにあたる言葉。そのまんまイベントって感じです。
例えば、ツールボックスから、Button1オブジェクトを選ぶと、プロパティのイベントのほう(雷)に色々なイベントが載っています。
「Button1をマウスがクリックする」=「Clickイベント」がきっかけでオブジェクトが何か処理をします。
「Button1をキーボードで押したとき」=「KeyDownイベント」がきっかけでオブジェクトが何かする。など・・・
イベントは処理のきっかけなのでプログラムコードは存在しません。要するに用語を覚えろってことです。

●イベントハンドラ
イベントハンドラは、イベントが発生したときに実際に呼ばれるメソッドのことです。名前は、イベント(Event)を扱う・処理する(Handle)からイベントハンドラ。

Visual C++ 2008 Express Edition では、イベントメソッドイベントハンドラと言う仕組みで対応させることによって、ドラック&ドロップで画面開発できるようになっています。1

例えば、button1をクリックするとbutton1_Click()イベントハンドラが呼ばれます。クリックするという動作をメソッドと結びつけるものがイベントハンドラなのです。サンプルコード↓
private:System::Void button1_Click(System::Object^ sender,System::EventArgs^ e){
   //処理
}

また、イベントハンドラには必ず引数が2つあると言う約束があります。
この引数でメソッドを呼び出す際に、
壱:どのオブジェクトから呼ばれたかの情報・・・System::Object^ sender
弐:どんな手段で呼ばれたかの情報・・・・・・・・・・・System::EventArgs^ e
を示している。
slenderにはどのオブジェクトから呼び出されたかと言う情報が入っており、今回はボタン(System::Windows::Forms::Button)と言う情報が入っています。
eにはマウスの左ボタンをクリックした場合(Ssytem::Windows::Forms::MouseButton::Left)と言う情報が入っています。


③-3≪クラス・インスタンス≫
●データと処理を1つにまとめたものをオブジェクトと言いましたが、さらに共通の目的を持ったデータを処理を集めたものをクラスを言います。

●インスタンスはクラスを基にして、実際にデータを扱うものを言います。インスタンスとは「実体」と言う意味でひとつのクラスから多くの実体であるインスタンスが生成されます。処理を行うときも、クラスを処理するのでなく、インスタンスに対して処理を行います。

例えば、ツールボックスにあるButtonは《Button》型クラスであり、Button1、Button2、・・・はそれぞれインスタンスです。

●コードの書き方↓
//Windowsフォームのコード 
public ref class Form1{
    //Windowsフォームの処理やデータのコード
}
refの横のclass・・・クラスであることを示すためにつける。
form1・・・・・・・・・・・・クラスの名前(任意で作ることもできる。)

次にクラスの定義・インスタンスの生成のコード↓
//動物クラス
ref class Animal{
   public:int Age;
   public:System::String^Sing(){
       return"動物の鳴き声";   
   }
};
※注意・・・クラスの定義のときは最後に;(セミコロン)を忘れないように!

public ref class Form1:public System::Windows::Forms::Form
{
//動物クラスのインスタンス呼び出し
  private:System::Void button1_Click(省略){
   Animal^ani1;            //Animalクラス型のani1変数を参照型で宣言している。
    Animal^ani2;
    ani1=gcnew Animal();        //gcnewキーワードで、Animalクラス型のインスタンスが作成され、
                                    //宣言した変数「ani1」に代入されます。
    ani2=gcnew Animal();
    ani1->Age=5;          //インスタンスに対し、プロパティを呼び出している。
    TextBox1->Text=ani1->Sing();    //インスタンスに対し、メソッドを呼び出している。
    ani2=gcnew Animal();
    TextBox2->Text=ani2->Sing();
  }
};

●変数宣言における値型と参照型について
int Age;    値型の変数宣言
Amimal^ani1;  参照型の変数宣言
「^」は正式には「トラッキングハンドル」ですが単純に「ハット」とも呼ばれる。

●宣言と同時にインスタンスの作成
Animal^ani1=gcnew Animal();
でAnimalクラス型変数の宣言とAnimalクラス型インスタンスの生成を同時に行えます。


③-4≪カプセル化≫
構造化設計の時代にはデータの扱い方について間違った使い方をしないようにチェック用のメソッドを作っていました。例えば、年齢を入力するBOXに文字が入力されたとき、何がなんだか判りません。
これでは使い方をあまり知らない人がプログラムをいじると、チェックを行わずに処理を実行し、データを壊してしまうかもしれませんでした。

オブジェクト指向では、データとチェックの処理が一緒にあるので値を代入する際、必ずチェックしてからデータに値を入れることができるようになりました。また、チェックなしではデータに直接触らせないようにすることもできるようになったのです。

外部からデータが直接触れられないようにするために、オブジェクトの中に処理とデータを隠し、オブジェクトを操作するために必要な処理のみを外部に公開することをカプセル化と言います。カプセル化することで、データを安全に確保することができるようになりました。

例えば、プロパティでBackColorにありえない色を入力すると、「プロパティの値が無効です」と言われて、元の値を代えることができません。

●アクセス修飾子
private・・・外部(自分以外のクラス)から見えないようにする(非公開)
public・・・・外部に公開する

●サンプルコードについては割愛します。イメージだけでオッケーです。


③-5≪クラスの継承≫
●プログラムの共通の目的の部分(ボタンとかテキストボックスとか)をクラスとしてまとめたように、さらにクラスの共通している部分を抜き出して基本的なクラスにすることで、その基本的なクラスをうまく使って楽ができます。この共通部分を抜き出して、作成した基となるクラスから新しいクラスを作成することを
クラスの継承といいます。クラスの継承では、その名のとおり、元のクラスの「データ」や「処理」を継承したクラスを作ることができます。

●サンプルコード(クラスの継承の記述例)
//継承のサンプル
public:ref class Animal{
 public:String^color;//色
 public:String^smell;//匂い
 public:String^taste;//味
 //処理
}

public:ref class Cat:Animal{
 public:String^ear//耳の形
 //処理
}
Animalクラスをはじめに定義(作成)しています。Animalクラスにはcolor,smell,tasteの3つのプロパティがあります。次に、【public:ref class Cat:Animal】でAnimalクラスを継承したCatクラスが定義(作成)されます。【:Animal】はAnimalクラスを継承するという意味です。これにより、Catクラスはcolor,smell,taste,earの4つのプロパティを持つクラスになりました。

このように同じコードを何度も書く手間が省ける差分コーディングが可能になりました。

③-6≪ポリモーフィズム(多様性)≫

③-7≪抽象クラス≫

③-8≪インターフェイス≫

③-9≪③の復習ドリル!!≫


③-10≪オブジェクト指向を理解・深めるためのリンク≫
オブジェクト指向を正しく理解する(日経ソフトウェア)
オブジェクト指向wikipedia
オブジェクト指向プログラミング
このくらいのリンクを読めば、ほぼ完全にオブジェクト指向について理解できるでしょう。・・・でも、きっと読む気になりません!!!


④プログラム作成

④-1≪アプリケーション作成の流れ≫
1.完成イメージを絵に描いて、画面に対する機能を書いてみる。
2.Visual C++ 2008 Express Edition で画面を作成する。
3.画面のプロパティ(属性)を設定する。
4.コードを書く。
5.動かしてみる。
6.修正する。
7.完成したアプリケーションを配布する準備をする。

④-2≪入力データの処理の注意事項≫・・・随時追加形式
  • 大文字を小文字に注意すること。インテリセンス機能が動かないときは要注意! -- 全般 (2009-09-17 10:32:55)
  • この属性は文字列型(String)なので数値を入れさせたいときは、【変換後の変数=データ型::Parse(変換前の文字列);】Parseは「解析する」という意味、まず文字列を解析してから別のデータ型に変換する処理を行う。変換前の文字列には【コントロール名->プロパティ;】がくることが多いと思う。 -- TextBox->Text (2009-09-17 10:40:07)
  • この属性に文字列型以外の変数を入れたいときは、【変換後の文字列型変数=変換前の変数.ToString();】で変数の型を変換する。Cで言うキャスト演算子だとおもう。・・・調べたらちょっと違ってた。。。けど同じようなものでしょ! -- TextBox->Text (2009-09-17 10:43:30)
  • http://www.p-ban.com/http://www.pcbcart.com/http://kibanhonpo.com/first/index.htm -- 基板屋について (2009-11-06 21:44:49)
  • http://stljapan.com/product04.html -- モータについて (2009-11-19 05:30:17)
名前:
コメント:


⑤簡単なアプリケーション製作





タグ:

C++
最終更新:2010年08月07日 09:18