フューチャーC:OOP

インターネットは1つの興味深いニュースをバイパスしました。おそらく、OOPツール、つまりクラスがCプログラミング言語の次の標準に追加されることが明らかになりました。 同時に、このドキュメントが最終的に採用されず、次の標準のドラフトバージョンに追加されなかったため、これが実装されるかどうかを判断するのは時期尚早です。 これを実装するという提案は、1995年に特定のRobert Jervisによって返されましたが、WG14で承認されたのは今だけです。



殺されていない熊の皮を共有して、それが何を脅かすのか、それが私たちに何を与えるのかを見てみましょう。



これを行うには、このツールのいくつかの領域を考慮してください。



GUI



多くの人は、この場合OOPなしでは賢明なことはほとんど不可能であることを知っています。 そのため、GTK +はGObjectを介してOOPシミュレーションを使用します。



こんにちは世界!
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; gtk_init(&argc, &argv); /* Create the main, top level window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* Give it the title */ gtk_window_set_title(GTK_WINDOW(window), "Hello, world!"); /* Center the window */ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /* Set the window's default size */ gtk_window_set_default_size(GTK_WINDOW(window), 200, 100); /* ** Map the destroy signal of the window to gtk_main_quit; ** When the window is about to be destroyed, we get a notification and ** stop the main GTK+ loop by returning 0 */ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); /* ** Assign the variable "label" to a new GTK label, ** with the text "Hello, world!" */ label = gtk_label_new("Hello, world!"); /* Plot the label onto the main window */ gtk_container_add(GTK_CONTAINER(window), label); /* Make sure that everything, window and label, are visible */ gtk_widget_show_all(window); /* ** Start the main loop, and do nothing (block) until ** the application is closed */ gtk_main(); return 0; }
      
      







ポインタを介したスタック上のデータ管理-Cの古典的な図を見ています。 これには、これらの同じポインターの宣言にさらに注意が必要です。 また、コードのメンテナンスにも大きな影響を及ぼします。



代わりに、GTKMM(C ++)で実装されている「ネイティブ」開発アプローチを使用できます。



こんにちは世界!
 //HelloWorldWindow.h #ifndef HELLOWORLDWINDOW_H #define HELLOWORLDWINDOW_H #include <gtkmm/window.h> #include <gtkmm/button.h> // Derive a new window widget from an existing one. // This window will only contain a button labelled "Hello World" class HelloWorldWindow : public Gtk::Window { public: HelloWorldWindow(); protected: void on_button_clicked(); //event handler Gtk::Button hello_world; }; #endif //HelloWorldWindow.cc #include <iostream> #include "HelloWorldWindow.h" HelloWorldWindow::HelloWorldWindow() : hello_world("Hello World") { // Set the title of the window. set_title("Hello World"); // Add the member button to the window, add(hello_world); // Handle the 'click' event. hello_world.signal_clicked().connect( sigc::mem_fun(*this, &HelloWorldWindow::on_button_clicked)); // Display all the child widgets of the window. show_all_children(); } void HelloWorldWindow::on_button_clicked() { std::cout << "Hello world" << std::endl; } //main.cc #include <gtkmm/main.h> #include "HelloWorldWindow.h" int main(int argc, char *argv[]) { // Initialization Gtk::Main kit(argc, argv); // Create a hello world window object HelloWorldWindow example; // gtkmm main loop Gtk::Main::run(example); return 0; }
      
      







これは間違いなくより冗長に見えますが、メモリリーク、逆参照エラー、NULLポインターの削除など、ポインターに固有の問題はなくなります。 カプセル化、ポリモーフィズム、継承など、OOPの利点もすぐに得られます。 これにより、この分野のアプリケーション、特に継承が明確に見つかります。



低レベルプログラミング



この悪名高い言語が占める主なニッチの1つ。 Cで同様の問題を解決する方法はいくつかありますが、最も一般的なのはマシンレジスタへの直接アクセスです。



 PORTD = 0xff;
      
      





しかし、これには明らかな欠点があります。タイプミスのしやすさ、繰り返されるコードの生成、読みにくい、メンテナンスの複雑さです。



単純なクラスを実装する方が便利です。



 class led { public: led: port {*s}{/*..*/} ledOn(number) {/*...*/}; //... };
      
      





さらに、ポートごとにオブジェクトを作成します。 また、すべてのポートビットなど、複雑な操作のための多種多様なメソッドは言うまでもなく、ポート設定を決定する追加のパラメーターをコンストラクターに追加することもできます。



問題のある問題



いずれにせよ、このツールの範囲は明らかです。 これらは言語の機能を拡張し、効果的であるだけでなく、より便利にします。 客観的な観点からは、これは非常に必要ですが、...これにはC ++があるため、タイトルを読んでも多くの人が内部不協和を感じたと思います。 しかし、これはC自体を制限しますか? 誰を傷つけますか? 言語はもう若くなく、多くの安定したステレオタイプを作成することができましたが、時が経ち、時が変わり、当たり前の必要があります。



All Articles