[解決済み] C言語のOOPでは、暗黙のうちにselfをパラメータとして渡します。
質問
C言語でOOPを学ぶための例題に取り組んでいます。現在、このようなコードを作成し動作していますが、メソッドに暗黙的にselfをパラメータとして渡すようにすることに興味があります。
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//#include "Stopwatch.h"
typedef struct stopwatch_s
{
unsigned int milliseconds;
unsigned int seconds;
unsigned int minutes;
unsigned int hours;
bool is_enabled;
void ( *tick ) ( struct stopwatch_s* );
void ( *start ) ( struct stopwatch_s* );
void ( *stop ) ( struct stopwatch_s* );
void ( *reset ) ( struct stopwatch_s* );
} stopwatch_t;
static void tick (stopwatch_t* _self)
{
stopwatch_t * self = _self;
if (self->is_enabled)
{
self->milliseconds++;
if (self->milliseconds >= 1000)
{
self->milliseconds = 0;
self->seconds++;
if (self->seconds >= 60)
{
self->seconds = 0;
self->minutes++;
if (self->minutes >= 60)
{
self->minutes = 0;
self->hours++;
}
}
}
}
}
static void start (stopwatch_t* _self)
{
stopwatch_t * self = _self;
self->is_enabled = true;
}
static void stop (stopwatch_t* _self)
{
stopwatch_t * self = _self;
self->is_enabled = false;
}
static void reset (stopwatch_t* _self)
{
stopwatch_t * self = _self;
self->is_enabled = false;
self->milliseconds = 0;
self->seconds = 0;
self->minutes = 0;
self->hours = 0;
}
void * new_stopwatch()
{
stopwatch_t * newInstance = (stopwatch_t *)calloc(1, sizeof(stopwatch_t));
newInstance->is_enabled = false;
newInstance->milliseconds = 0;
newInstance->seconds = 0;
newInstance->minutes = 0;
newInstance->hours = 0;
newInstance->tick = &tick;
newInstance->start = &start;
newInstance->stop = &stop;
newInstance->reset = &reset;
return newInstance;
}
void main()
{
struct stopwatch_s * Stopwatch = new_stopwatch();
printf ("Initial: %d\n", Stopwatch->milliseconds);
Stopwatch->start (Stopwatch);
Stopwatch->tick (Stopwatch);
Stopwatch->tick (Stopwatch);
Stopwatch->tick (Stopwatch);
printf ("Started: %d\n", Stopwatch->milliseconds);
Stopwatch->stop (Stopwatch);
Stopwatch->tick (Stopwatch);
printf ("Stopped: %d\n", Stopwatch->milliseconds);
Stopwatch->reset (Stopwatch);
printf ("Reset: %d\n", Stopwatch->milliseconds);
}
を読み込んで、次のようにしてみました。 ANSI-Cによるオブジェクト指向プログラミング の代わりに、quot;object" をどのように構成すればよいのか、理解できないのです。
Stopwatch->tick(Stopwatch);
を書くことができます。
Stopwatch->tick();
解決方法は?
<ブロッククオートオブジェクトをどのように構成すればよいのかがわかりません。
Stopwatch->tick(Stopwatch);
を書くことができます。
Stopwatch->tick();
これは標準的なC言語では不可能で、レシーバを
明示的
を持つC++とは対照的に、C関数の正式な引数です。
this
として
暗黙の
形式)。
しかし
-
一般に、すべてのメソッド関数を1つの
struct
へのポインタで開始するようにします。struct
). について読む vtable -s. -
を与えないようにするためのマクロ(あるいはインライン関数)を用意することができます。
Stopwatch
を2回書くことになります。TICK(Stopwatch)
ではなくStopwatch->tick();
を使用します。 statement-expr の拡張機能です。 GCC が便利かもしれません。
GTKとその ゴブジェクトシステム C のためのかわいいオブジェクトシステムの一例として ObjVLispモデル というウィキページがあります。 仮想メソッドテーブル . たぶん 本案 報告書と RefPerSys と、また 故J.Pitrat氏のブログ .
ところで、ファーストクラスのメソッドセレクタ(おそらく整数値か、何らかの共通のセレクタ型へのポインタ)を持っていると判断し、バリアディックな
send
ディスパッチ
関数(つまり
send(StopWatch,TICK_SEL)
の代わりに、夢のような
Stopwatch->tick()
)またはマクロを使用します。例えば
libffi
が便利です。昔の
Xview
はインスピレーションを与えてくれるかもしれません。
最後に、多くの空想的なオブジェクトレイヤーの実装者のように、メタプログラミングを使用して、いくつかのCコード生成ツール(例えば
moc
Qtの場合)。をカスタマイズすることを検討してもいいかもしれません。
GCC
でコンパイルします。
MELT
そのような目的のために を作ったり
トランスレータ
(参照
これ
のように)あなたの空想的なOOP方言からCに変更することができます。
VALA
または
スウィッグ
または
ビッグルー
または
チキン・スキーム
も参照してください。
これ
). あるいは、外部のプリプロセッサ(あなた自身のもの、あるいは
m4
または
GPP
など...)。
関連
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み] テスト
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?