• 締切済み

VC++.NETと標準C++とSTLの相性などの質問事項

自己研鑽のために、標準C++を学習し、STLについても学習しました。仕事で、Javaの経験が半年以上あります。正直な感想、勉強してみると、C++のほうが、気に入ってしまいました。 マイクロソフト関連の仕事をしたことがなく、VisualBasicすらありません。最近では、C#.NETなどがでてきています。 C#2.0やjavaのJ2SE5.0ででてくるGenericや、コレクションクラスにGenericを考慮したものが でてくる。など、C++のSTLの模倣のように感じました。 C#にはデリゲートがあるようですが。関数ポインタや関数オブジェクトそのまんまに見えます。 C#2.0が気になりますがまだ、ベータ版で未来の話なので、Visul C++.NETに興味を持ちました。せっかく勉強した標準C++やSTLの知識はそこでは役に立つのでしょうか。.NETにはそちのほうで独自のstring型やコレクション型があるのではないでしょうか? .NETだと、マネージコードなどガベージコレクトがあるようです。STLのコンテナはそれぞれ内部でデストラクタがヒープの内容を廃棄してくれますが、ガベージコレクトの環境で普通にSTLを使うとどういうことになるのでしょうか? 今度、Visual C++.NETの学習をはじめるかどうかの判断材料にしたいので、現時点までの知識が有効活用できるかどうかを知りたいです。宜しくお願いいたします。

みんなの回答

回答No.3

STL.NET が計画されているようです。 STLコンテナのManaged対応版といえばいいでしょうか。 アルゴリズム等は今ある<algorithm> etc がそのまま使えるはずです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

マイクロソフトの環境に特化した部分と、それ以外ははっきり分けて設計することで、STLをはじめとした標準C++の知識や経験は存分に生かすことができます。 また、そうすることで、他の環境への移植性も高くなります。 逆に環境に強く依存した部分(GUIなど)は、どうせ移植性はないので、言語は何でもよいと思います。C++のマネージ拡張は、環境依存部と非依存部のブリッジにだけ使えば十分でしょう。(環境依存部もC++にするなら、そこではマネージ拡張のオンパレードでしょうが)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

別に言語やSTLに限らず、鵜呑みにした知識でなければ役に立つでしょう。 直接的に役に立つかといえば、言語に依存する知識は似てはいても言語が変わると役に立たないとも言えるでしょう。 アルゴリズム、考え方のような物はどこでも同じです。STLも単に使い方でなくジェネリックプログラミングという考え方で身につければ役立つでしょう。 デリゲートは、単に関数ポインタやオブジェクトの変わりでしょう。他に同様なことの実現手段なかったと思います。 STLとマネージコードではメモリの管理は独立してるでしょうから、独立して使う分には特に問題無いだろうと思います。 変にまぜて使うとどうなるかわかりませんが。 また、C++.NETでもマネージコードを使わないという選択(今まで通りのネイティブコードを使う選択)も可能ですね。 というか、C++使うならマネージコードを避けたほうがいいかも知れません。 そういえば、VS6のC++でもMFC使うとC++のクラスとMFCのクラスでややこしいことになったりしますね。 String系のクラスがいくつも・・・。

gootarojp
質問者

補足

回答ありがとうございます。 >また、C++.NETでもマネージコードを使わないという選択(今まで通りのネイティブコードを使う選択)も可能ですね。 へぇ、そういう風な選択が可能なんですかぁ。 マネージコードってなんでしょう。 .NETのランタイム上で実行されることを想定した ガベージコレクトがなされるコードという認識でしょうか? マネージ・アンマネージの切り替えは、クラス単位で やるのでしょうか? マネージコードの対象として定義したクラスを 使っているクラスがアンマネージコードの時、 newした後のdeleteはしなくてよいのだろうか? .NETフレームワークのクラス郡はC#やVBなどでも、 使用しているのと、おなじシステムで用意された アセンブリ .dllファイルを使うのかな? だとしたら、.NETで用意されているクラス群は マネージコードに思われる。 自分が定義したアン・マネージドなクラスから .NETで用意されているクラス群をヒープに newして作ったらdeleteはいるのだろうか? newしているところのコードがマネージドか アン・マネージドか、 newされた側のクラスがマネージドか、アンマネージド か 4通りのパターンがありそうですが、それについて どのような挙動になるかの具体的な解が分かれば、 私が質問したSTLをVC++.NETで使用した時にどうなるかが わかりそうですが・・・・。 それは、実際に学習してみて詳細を知るのでしょうが、 今回は、VC++.NETを学習することが、他にいろいろやり たいことに優先させてでもすべきかを判断したいが ための質問で。 なので、例えば、上記の4通りの挙動をうまくプログラマ が選択して、コントロールしながら、問題なくやっていけるような仕組みに実際もんだいなっているかどうかを 知りたいです。 なお、詳細は本格的に学習してみてからになりますし、 掲示板で詳細に説明するのも限界があるので、 概要程度の説明で、上記のようなことが可能なのかを 知りたい。 >別に言語やSTLに限らず、鵜呑みにした知識でなければ役に立つでしょう。 >直接的に役に立つかといえば、言語に依存する知識は似て>はいても言語が変わると役に立たないとも言えるでしょう。 おっしゃることはよくわかりますが、 いくら将来の自己研鑽のためであっても、あまり実際上役に立ちそうにない、 PascalやSmallTalkを自らすすんでやる人もいないです。 考え方が将来役にたち、かつ、直接的にも役にたつ。 ものをできれば選択したいのではないでしょうか? STLと.NETをつなぐようなアダプターのようなクラスが あると、よいのですが。 Javaなどでもデコレーターパターンやアダプタパターン で使っている側にはあたかも、別のインターフェースで あるように見せるような考え方があると思います。 要求している側が.NETのコレクション型を欲している から、実態はSTLだけどそれを意識させないような インターフェースの調整するための仕組みが 既にマイクロソフトまたは、オープンソースなどで、 用意されているなどが、 あれば、直接的にSTLを役にたてるように もっていけるのでしょうが、それがあるかどうかとか そういう知識が私にはないので、それを収集するために たてた質問スレなんです。

関連するQ&A

  • C言語の標準関数リファレンス

    C言語の勉強を始めたのですが、C言語はweb上に標準関数リファレンスはないのでしょうか? あると便利なのですが、自分で探しても見当たりませんでした。 javaのjavadocとか.netのMSDNみたいなリファレンスがあったら教えてください。 よろしくお願いします。

  • Javaでデリゲート

    C#ではデリゲートで関数を変数的に扱うことが出来ますが Javaでそのようなことはできますか?

  • 制御系ってSTL必要なんですか?

    私は、制御系・組み込み系の業務経験がありません。 UNIX C, Java, C#の経験があります。 最近、J2SE 5.0やC# 2.0などで、 「ジェネリック」という概念がでてきました。 C++のSTLがとても似ているように思えました。 自分の認識では、C++は今後、制御系などの分野 ぐらいしか用途がないように思っているのですが・・・ 制御系のC++でも、STLはバリバリ使うのでしょうか? それとも、制御系や組み込み系では、すべての ロジックが自作オンリーで、そのような汎用的な 車輪を使うことは不可能な世界なのでしょうか? この質問を至った経緯を以下に書きます。 1)Java 5.0, C# 2.0のジェネリックの概念を  学習するにあたって、C++のSTLを同時に学習した  ほうが、効果的ではないかとおもった。 2)Java, C#でプログラムを組む以上。C++の存在価値が  制御系・組み込み系への準備という位置づけでしか  見出せなかった 3)しかし、コレクションクラスなどを使った。  Java, C#の開発になれているため、すべてのロジック  をゴリゴリ書く開発に戻りたくないので、  C++なら、STLを使いたいと思った。  そして、それは(1)の目的を果たす意味で  重要だと感じた。 4)しかし、私は制御系、組み込み系の経験がないので、  C++でSTLというやりかたがその分野で通用するのか  わからなかった。  いくら、(1)の目的で勉強になるからといって、  学生がPascalを勉強するような、実務に  あまり関係のないことをやりたいとはおもわなかった  ので、制御系、組み込み系でC++でSTLという  組み合わせが現実的に有りえるのかどうかを  制御系バリバリの方にいろいろ聞いてみたいと感じた。 以上がこの質問をした経緯です。 よろしくおねがいいたします。

  • C++STLについての質問です。

    C++STLについての質問です。 Visual C++ 2008 Express Edition を使用してDirectXアプリケーションを 作成しています。 その折、std::listテンプレートを使用する機会があったのですが、このリストを 使用しますと、 リンクしています... LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 fatal error LNK1120: 外部参照 3 が未解決です。 とのエラーが吐かれます。 ネットで検索すると、ソリューション構成をDebugからReleaseにすれば良いとの記述が ありましたので、実行してみました。しかし、 リンクしています... error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileExW@56" は未解決です。 error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です。 error LNK2001: 外部シンボル "_D3DXGetImageInfoFromFileW@8" は未解決です。 error LNK2001: 外部シンボル "_Direct3DCreate9@4" は未解決です。 fatal error LNK1120: 外部参照 4 が未解決です とのエラーが吐かれてしまいました。 尚、コード生成モードは、マルチスレッド(/MT)で作成しています。 どなたか、この問題を解決する方法をご存知ないでしょうか? よろしくお願いします。

  • Linuxで、標準Cライブラリが読み込まれず、C言語プログラミングができません・・・

    僕の問題はタイトルの通りで、標準Cライブラリが読み込まれていないようで、C言語プログラミングができません。 ubuntuのオフィシャルから日本語ローカライズドDesktopCDをダウンロードして、空のHDDにインストールしました。 ですが、gnome-terminalからccコマンドでプログラムをコンパイルしても、標準Cライブラリにあるはずの<stdio.h>が認識されず、続くprinft関数も読んでくれません。 これはどうしてでしょうか?LinuxはデフォルトでCやらJAVAやらのプログラミングの環境が整っているものだと思っていたので、戸惑っています。何か、セットアップが必要なのでしょうか。 ちなみに、gccでも、標準ライブラリは読み込まれませんでした。

  • 親クラスから呼ぶ

    Javaで親クラスから子クラスを生成して、子クラスから親クラスのメソッドを呼ぶことが できますか? Cなら関数ポインタで呼ぶことができました。 また、C#ならデリゲートなどを使用して呼べました。 可能であれば小さいサンプルでいいので、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • こんな内容の本を探しています

    1.C++/CLI 2.ポインタの高度な使い方(関数のポインタのような初心者向けの本には載ってないようなやつ) 3.クラスの高度な使い方 4.STL 5.標準関数 膨大な本があって、探すのが困難です。何冊掛かってみましたがなかなか当たりが出ません。 内容が被りすぎて買った意味がなかったりして大変です。

  • 実行時にコントロールのイベントの登録/解除を、イベントハンドラのメソッドをあらかじめ知っていないロジックから実施する方法

    実行時にコントロールのイベントの登録/解除を、イベントハンドラのメソッドをあらかじめ知っていないロジックから実施する方法 通常、実行時にコントロールにイベントの登録/解除 を行う際は。 AddHandler 対象コントロール.イベント名, AddressOf メソッド RemoveHandler 対象コントロール.イベント名, AddressOf メソッド や AddHandler 対象コントロール.イベント名, メソッドのデリゲート型 RemoveHandler 対象コントロール.イベント名, メソッドのデリゲート型 を行うと思います。 しかし、この方法では、これを実施するロジックが AddressOf メソッド や メソッドのデリゲート型 を知っていなければなりません。 そうではなく、それをあらかじめ、知っていなくても 対象コントロール から AddressOf メソッド や メソッドのデリゲート型 に該当するオブジェクトを取得するなどして、 実施できる方法を教えてください。 言語は、.NET系であれば。。 VB.NET, C#, C++のいづれかでもよいです。 できさえすればよいです。 J#とか、Delphi.NETとかマイナーなのは、厳しいです。 なお、C++でもしできるのであれば。 2003のマネージC++と、 2005のC++/CLIの両方について知りたいです。 以上、よろしくお願いします。

  • C#のdelegateをC++とjavaで?

    C#のデリゲードを javaとC++でできないでしょうか。 ただし、質問内容を勘違いされそうなので、求めている内容と、 求めていない内容を、詳しく 書きますと。 インタフェース委譲を使った例は、求めていません。 あらかじめ、委譲先に静的に仕組みを 作っておかなく手も、C#のデリゲードのように、シグニチァが同じなら 委譲先をはめ込めれるのが欲しいです。 単なる関数ポインタの例は、求めて いません。 C#でdelegate型を引数にとる ところに、あるインスタンスの メソッドを渡すと。 どのインスタンスのどのメソッドかまで、 認識して、コールバックできます。 関数ポインタでは、これができない。 STLの関数オブジェクトとか、古い感じの情報にヒントがあるか。調べてみましたが。よくわかりませんでした。 結局、この関数オブジェクトは、僕が求めているモノとは、違うような気がします。 よくわかりませんが。 欲しいのは、どのインスタンスのどのメソッドかまでを特定して、 記憶できる型をどうやって javaや、C++で実装できるか。 それをインタフェース委譲のように、 委譲先にあらかじめ、仕込んでおくことなしに。 ただ、メソッドのシグニチァが同じであるだけで、どのインスタンスのどのメソッドかまでを特定して記憶できる C#のデリゲードのような型を。 特殊なコンポーネントを利用せず。 標準的な言語構文のみをつかって、 どのようにしたら、 javaや、C++で、実装できるか? です。 詳しい方が、いらっしゃいましたら、 教えてください。

  • JavaからCへ

    僕は今までJavaを勉強していたのですが、 つい最近になって、C言語に手をつけ始めました。 Javaを知っていればC言語は結構とっつきやすいのではないかと思って始めたのですが、Javaに慣れすぎたせいか、C言語の文法がどうもしっくりきません。 特に関数あたりが・・・・。 C言語の関数って、Javaでいうところのメソッドですよね? 僕はそのように解釈しているのですが、あまり自信がないので、ご存知の方がいましたらどなたか教えてください。 あと、Javaを学習した人のためのC言語の本、もしくはC言語を学んだ人のためのJavaの本がありましたら教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう