c++/cliでのクラス作成方法について

このQ&Aのポイント
  • C++/CLIを使用してクラスを作成する方法について教えてください
  • 現在、VC++2008のC++/CLIを使用してプログラムを作成していますが、クラス化する方法がわかりません
  • 試行錯誤しているが、うまくいっていません。どなたか助けていただけませんか?
回答を見る
  • ベストアンサー

c++/cliでのクラス作成方法について

現在,VC++2008のC++/CLIを用いて以下のようなプログラムを作成しました。 String^ moji = textBox1->Text; Double num; Double const; Double kekka; Const = 10; Bool bRet2 = double::TryParse(moji,num); If (Const > num){ Kekka = num; } form上のtextBox1内の文字が数値に変換でき,且つ,10未満ならkekkaにその値をいれるというものです。 上記の処理をクラス化するためには,どのように記述すればよいでしょうか? C++の参考書などを読んで試してみたのですが,うまくいきませんでした... わかる方がいらっしゃいましたら,ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hideishi
  • ベストアンサー率55% (5/9)
回答No.1

VisualStudioの「プロジェクト」ー「クラスの追加」メニュー等で クラスを追加します。 例.CAppUtilクラスを追加 クラスを利用する方は以下のとおり String^ moji = textBox1->Text; //インスタンス生成 CAppUtil^ util = gcnew CAppUtil(); //メソッド呼び出し Double kekka = util->exec(moji); 追加クラスのサンプルコードは以下のとおり AppUtil.h #pragma once using namespace System; ref class CAppUtil { public: CAppUtil(void); virtual ~CAppUtil(void); Double exec(String^ moji); }; AppUtil.cpp #include "StdAfx.h" #include "AppUtil.h" CAppUtil::CAppUtil(void) { } CAppUtil::~CAppUtil(void) { } Double CAppUtil::exec(String^ moji){ Double num; Double kekka=0; int maxnum = 10; bool bRet2 = Double::TryParse(moji,num); if (maxnum > num){ kekka = num; } return kekka ; }

con014057
質問者

お礼

ご回答ありがとうございます。 上記のコードで,必要な機能を実現することが出来ました。 今回のサンプルをもとに勉強を続けたいと思います。 ありがとうございました。

関連するQ&A

  • C++/CLIのクラスについて

    現在, VC++2008のC++/CLIを用いてプラグラムを作成しています。 値を与えると,計算した値を返すクラスを一回の処理の何度も使用しています。 Keisa^ kei = gcnew Keisa; kekka1 = keisan->exec(1); kekka2 = keisan->exec(2); kekka3 = keisan->exec(3); delete kei; ///上記のkekkaを使用した処理/// kekka1=0; kekka2=0; kekka3=0; 上記のように書いて,実行すると,  kekka2にはkekka1 + kekka2を合計した値 kekka3にはkekka1 + kekka2 + kekka3を合計した値 のように,積算した値になってしまいます。(しかもなぜか,releaseフォルダ内の.exeファイルから実行した場合のみです...) クラスを使用した後の後処理に問題があるのかもしれませんが,知識がなくわかりません。 お分かりの方がいらっしゃいましたら,ご教授お願い致します。

  • C++/CLI .NetFrameWork

    こんにちは、現在自分はVC++のC++/CLI .NetFrameWorkを使ってソフト開発しています。 それについての質問なのですが、textBoxから取得した文字をシフトJISへシフトJISコードを 文字コードに変換してtextBoxに表示することは可能なのでしょうか?

  • C++/CLIにてForm1の要素に外部から

    C++/CLIにてForm1の要素に外部の関数からアクセスしたいです。 Windows7、Visual Studio2010にてC++/CLIで 簡単なフォームアプリケーションを作成しています。 仮に新規作成し、とりあえずテキストボックスを貼りつけたとします。 この際「Form1.h」が自動的に作成され、Form1クラスの中に textBox1などの要素が自動的に作成されるかと思います。 Form1クラスのメソッドの中からそれにアクセスするには this->textBox1->Text = L"変更"; みたいにするだけで良いですが、 こうしたForm1クラスの要素に対し、 Form1.h以外の場所にある外部の自作の関数から アクセスを行うにはどのようにすれば良いのでしょうか。

  • c++ クラスに関してです。

    うまくクラス同士を連動させることができなくてエラーが出てしまいます。 どこが間違えているのかアドバイスくださると助かります。 #ifndef H22_H_ #define H22_H_ #include <string> #include "account.h" class Bank { public: Bank(); void deposit(double amount, const std::string& accountType); void withdraw(double amount, const std::string& accountType); void transfer(double amount, const std::string& accountType); double getBalance() const; double getSavingsBalance() const; double getCheckingBalance() const; private: Account checking, savings; }; #endif #ifndef ACCOUNT_H #define ACCOUNT_H #include <string> #include "account.h" class Account{ public: Account(); Account(double &amout); double deposit(double amount); double getBalance() const; double withdraw(double amount); double balance; private: }; #endif #include <iostream> #include "acount.h" using namespace std; Account::Account { balance = 0; } Account::Account(double amount) { balance = amount; } Account::double deposit() const { return balance; } Account::double getBalance(double balance) { balance += amount; return balance; } Account::double withdraw(double amount) { if(amount > balance) { balance -= 5; return balance; } elese { balance -= amount; return balance; }} h22.h の中身 #include <string> #include "h22.h" #include "account.h" #include <stdexcept> using namespace std; Bank::Bank() { Account checking; Account saving; } void Bank::deposit(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") throw invalid_argument("Does not compute"); else if(accountType == "S") savings.balance += amount; else if(accountType == "C") checking.balance += amount; } void Bank::withdraw(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") throw invalid_argument("Does not compute"); else if(accountType == "S") savings.balance -= amount; else if(accountType == "C") checking.balance -= amount; } void Bank::transfer(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") { throw invalid_argument("Does not compute");} else if(accountType == "S") { savings.balance += checking.balance; savings.balance = 0;} else if(accountType == "C") { checking.balance += amount; checking.balance = 0;} } double Bank::getBalance() const { return getBalance(); } double Bank::getSavingsBalance() const { return savings.getBalance(); } double Bank::getCheckingBalance() const { return checking.getBalance(); } メイン.cpp http://pastebin.com/rQTj8xciです。 なにかヒントやアドバイスお願いします

  • basic_ostreamクラスについて

    http://msdn.microsoft.com/ja-jp/library/k262esc6.aspx をみると、VC++2010のbasic_ostream::sentryには  operator bool( ) const; がある事になっていますが、実際は無いようです。 VC++2010 Express Edition のostream(C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream)を見ると、sentryにoperator bool() constがありませんでした。 代わりに __CLR_OR_THIS_CALL _OPERATOR_BOOL() const { // test if stream state okay return (_Ok ? _CONVERTIBLE_TO_TRUE : 0); } というのがありますが、 #define _STD ::std:: #define _OPERATOR_BOOL operator _STD _Bool_type と定義されており、operator bool( ) constとは別物でした。 このため、basic_ostream::sentry::operator bool( )を使用しているソースをVC++2010(Express Edition)でビルドしようとするとエラーになります。 ちなみに、このソースをVC++2008 Express Editionでビルドすると通ります。 質問なのですが、 1)basic_ostream::sentry::operator bool( )を使うソースをVC++2010 Express Editionでビルドするにはどうすれば良いでしょうか? 2)なぜVC++2010 Express Editionからbasic_ostream::sentry::operator bool( )がなくなってしまったのでしょうか? ご存知の方、ご教授ください。 よろしくお願いします。

  • 他クラスからForm1内コントロルの操作方法を教えて(C#プログラミン

    他クラスからForm1内コントロルの操作方法を教えて(C#プログラミング) Form1で定義してあるtextBox1のText値を他クラスから操作したいのですが、そのコーディング要領が判らず困っております。どなたか教えてくださいませんか? 我流で下記の様なソース(要点のみ記述、他は省略)を作ってみましたが、コンパイルエラー「'object' に 'textBox1' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」がでます。 このエラーメッセージの意味を理解できず、何故Form1オブジェクトが伝わらないのか判らず、どこをどう直せばよいのか途方に呉れております。 以下我流C#ソースの抜粋 delegate void SetTextCallback(string text); public class Form1 {   通常のForm内コントロールの定義 Object formobj = this;   AAAclass aaa = new AAAclass (formobj);   この後Aclass内の基幹メソッドを走らせる } public class AAAclass { private Object formObject = null; public AAAclass(Object formobj) { formObject = formobj;    様々な初期化処理 } private void textDisplay(string text) { if (formObject.textBox1.InvokeRequired){  //この行の"textBox1"部分がエラー SetTextCallback d = new SetTextCallback(textDisplay); formObject.Invoke(d, new object[] { text }); //この行の"Invoke"部分がエラー } else { formObject.textBox1.Text = text;  //この行の"textBox1"部分がエラー } } この後、複数のスレッドを定義し、走らせている   それらのスレッドで上記の共通テキスト表示メソッドを利用している }

  • C++/CLIでのDataGridViewの使い方

    以前に質問させていただいたのですが、要点を得ていなかったため再度質問させていただいきます。 VC++2005のC++/CLIでプログラムを作成しています。 CSVファイルから内容を読み込み、DataGridVeiwに表示させたいと考えています。 CSVファイルを配列に読み込んで、表示するところまでは出来ています。 以下CSVファイルを読み込んで、コンソール出力するプログラムの一部 int i; StreamReader^ sr=gcnew StreamReader("hoge.csv"); String^ text=sr->ReadToEnd(); array<String^>^ line=text->Split(gcnew array<String^> {"\r\n", "\r", "\n"},StringSplitOptions::RemoveEmptyEntries); array<array<String^>^>^ table= gcnew array<array<String^>^>(line->Length); for (i=0; i<line->Length; i++) { table[i]=line[i]->Split(','); } for each (array<String^>^ output in table){ for(i=0; i<output->Length; i++){ Console::Write(output[i]); //行出力 } } 初歩的なことだとは思うのですが・・・ コンソール出力部分をDataGridViewで出力表示させるには どのように書けばいいでしょうか。 よろしくお願いします。

  • 【C++/CLI】String型文字列の位置を指定して値を取り出す

    VC++2005、.NET2.0、C++/CLIにてWindowsアプリを作成しています。 String型に格納された文字列の、位置を指定して値を取り出すには、 どのような方法を用いればよいのでしょうか? 基本的な質問で申し訳ありませんが、ご教示よろしくお願い致します。 例) String^ st = "abあいcde"; //四番目の値を取り出す⇒「い」を取り出す

  • C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか

    C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか? C#2008ですが、Form1にTextBoxが30個あって、textBox1~textBox30という名前がついています。 このテキストボックスの値をForm2で取得したいのですがなかなかうまくいきません。 ------------------------- Form2: private void Form2_Click(object sender, EventArgs e){  Form1 fm = new Form1();    int No = 15; //ここを1~30まで動的にしたい  string result = fm.textBox15.Text; //直接comboBox_type15と書くのではなく「"comboBox_type" + No.ToString()」のようにしたい  MessageBox.Show(result); } ------------------------- コントロールを配列にして Control[] ctlArray = new Control[30] { fm.textBox1, fm.textBox2, …, fm.textBox30 }; のようにしてみましたが、エラーになってしまいます。 いろいろネットで検索してみたのですが、「コントロール名を動的に文字列で作成して使う」という方法がどこにも載っていなく、数時間格闘しています。 すみませんがご教授願います。よろしくお願いいたします。

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

専門家に質問してみよう