web-dev-qa-db-ja.com

最新のライブラリがOOP

私は初心者レベルのC++プログラマーですが、言語の概念をかなりよく理解しています。 SDLやOpenGLなどの外部C++ライブラリを学習し始めたとき(おそらく他の何かも)、驚いたことに、C++の概念をまったく使用していないことがわかりました。

たとえば、SDLもOpenGLもクラスや例外を使用せず、関数やエラーコードを優先します。 OpenGLでは、glVertex2fのような関数を見てきました。これは、2つのfloat変数を入力として受け取り、おそらくテンプレートとして優れています。さらに、これらのライブラリーはマルコスを使用する場合がありますが、マクロを使用することは悪いことであるという共通の合意があるようです。

全体として、C++スタイルよりもCスタイルで書かれているようです。しかし、それらは完全に異なる互換性のない言語ですよね?

問題は、なぜ現代のライブラリーは、それらが記述されている言語の利点を使用しないのかということです。

20
Saage

OpenGLとSDLはどちらもCライブラリであり、Cインターフェースを他の世界に公開します(ほとんどすべての言語がCとインターフェースできますが、必ずしもC++とはインターフェースできないため)。したがって、これらは、Cが提供する手続き型インターフェイスと、データ構造を宣言および使用するCの方法に制限されます。

Cインターフェースが提供する「他の言語とのインターフェース」の側面に加えて、Cは一般にC++よりも移植性が高くなる傾向があり、これにより、ライブラリのコードの非プラットフォーム依存部分を簡単に取得できます。これらは別のOSまたはハードウェアアーキテクチャで動作しています。ほぼすべてのプラットフォームにまともなCコンパイラがありますが、C++コンパイラが制限されているものや、あまり良くないものもあります。

CとC++は非常に異なる言語ですが、実際には「非互換」ではありません。実際には、C++はCのスーパーセットです。非互換性はいくつかありますが、多くはないため、C++からCインターフェースを使用することは非常に簡単ですする。

31
Timo Geusch

「ライブラリを書く」と「外部にAPIを公開する」は混同していると思います。あなたが言及したライブラリについてはあまり詳しくは知りませんが(それらはCで内部的に記述されている可能性があります)、私自身も含め、他の多くの人がC++ライブラリ/フレームワークを作成してすべての種類のファンシーを完全に利用していることを知っていますOOPプラクティス/パターンですが、CスタイルのAPIが外部に公開されています。

  1. CとC++は完全に異なるシステムではありません。 C++はCの上に構築されており、a)Cコードを簡単に使用でき、b)CスタイルのAPIを完全に提供できます。
  2. Cインターフェースの利点は、他の国々で非常に簡単に消費できることです。 C APIをほぼすべての言語(python、Java、c#、php ...)から使用できるようにする相互運用層があり、C++インターフェースは.....から利用できるため、おそらくC++であり、常に(異なるコンパイラ、同じコンパイラの異なるバージョンは問題を引き起こします)

過去には、作業中のプロジェクトの1つの実験として、C++ DLLから「OO」インターフェースを公開することにしました。内部の詳細を隠し、他の多くのことを回避するために、私はWindows COM(コンポーネントオブジェクトモデル)を再発明することになりました。そのプロジェクトの後、私はCOMが人々がそれをするほど悪くないことに気づきました:a)それが公開するOOPインターフェイス、b)私が遭遇したすべての問題を処理し、c)は他の多くの言語から消費できるように十分に標準。

しかし、COMにはまだ手荷物がないわけではありません。多くの場合、通常の計画CスタイルAPIは、はるかに優れた代替手段です。

10
DXM

OpenGLとSDLはどちらもCライブラリであり、C++ライブラリではありません。これらはC++から使用できますが、Cで記述されており、C API(他の言語からもアクセスできます。C++はFFI経由でアクセスするのが面倒です)を備えています。汎用(および一部の専用)C++ライブラリの大規模な配列については Boost を、C++マルチメディアについては [〜#〜] sfml [〜#〜] を参照してください。図書館。

7
user7043

特にOpenGLと言えば、OpenGLはもともとAPIスタックの一部でした-OpenGLはC(またはFortran)からもアクセス可能な低レベルのパフォーマンス指向のAPIを提供し、OpenInventorは設計された高レベルのオブジェクト指向のAPIを提供しますC++から使用し、高レベルのシーングラフAPIと、シーンをファイルに保存/ファイルから読み取るための抽象化、およびGUI統合の両方を提供します。

OpenGLはOpenInventorよりもはるかに遠くまで行きました(それはより差し迫った必要性を満たし、ビデオハードウェアメーカーに最適化するための何かを与え、3Dアクセラレーションハードウェアを直接扱う代わりに、人々がターゲットにできる一般的な低レベルAPIを提供しました)。しかし、OpenInventorはまだ存在しており、Unix/X11、Windows、およびMacOS X/Cocoaをサポートする優れたオープンソース実装-Coin3D-があります。

3
jimwise