[今さら]C言語でクラスライブラリを作る[Cかよ]
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/09/13(水) 09:45:11OOに慣れてしまって今さら手続き型言語で設計できないorやりたくないのに、
Cで仕事しないといけない、そんなときにちょっと楽ができたらいいなと。
「Cで無理矢理OOすんな」とか言わないでね。
0002デフォルトの名無しさん
2006/09/13(水) 09:46:010003デフォルトの名無しさん
2006/09/13(水) 09:47:24#define _LINKMAP_H_
typedef struct __entry {
char *key;
void *value;
struct __entry *next;
} entry_t;
typedef struct __linkMap {
entry_t *firstEntry;
entry_t *lastEntry;
void (*put)(struct __linkMap *this, const char *key, void *value);
void* (*get)(struct __linkMap *this, const char *key);
void (*destructor)(struct __linkMap *this);
} linkMap_t;
extern linkMap_t *linkMap_newInstance();
#endif //_LINKMAP_H_
0004デフォルトの名無しさん
2006/09/13(水) 09:52:59コメント削りました。こりゃlinkMap.cは無理だな。
こんな風に使えます。
linkMap_t *map1 = linkMap_newInstance();
linkMap_t *map2 = linkMap_newInstance();
map1->put(map1, "key1", "value1");
map1->put(map1, "key2", "value2");
map2->put(map2, "key1", map1->get(map1, "key1"));
これを利用したconfigクラスやloggerクラスがあります。
ソースアップするところは別に考えます。
0005デフォルトの名無しさん
2006/09/13(水) 09:58:21なのがおかしいよね。
コンストラクタとデストラクタはこんな風にした方がいいかなと
思ってるんだけどどうだろう
LinkMap map = new_LinkMap();
delete_LinkMap(map);
あとc++でいうthisポインタを渡すのに、いちいち自信のインスタンスを
引数で渡しているところが冗長で嫌なんだけど、Cでやる以上
仕方ないのかなあ
0006デフォルトの名無しさん
2006/09/13(水) 10:15:5000071
2006/09/13(水) 10:24:10言い出しっぺがつくるの法則でお願いします。
つーかありそうだよね。
0008デフォルトの名無しさん
2006/09/13(水) 11:34:38その調子で、お前はノリだけで生きてきたんだろうな。
そんなんじゃ、どんどんと出来る奴らに追い抜かれるだろうけど、それでいいのか?
0009デフォルトの名無しさん
2006/09/13(水) 11:50:17ちょっと昼休みした後、また再開する。
0010デフォルトの名無しさん
2006/09/13(水) 12:08:34LinkMap_new
LinkMap_put
LinkMap_get
LinkMap_destroy
でいいじゃん。
明示的にthisポインタ渡すのは面倒すぎ。
00111
2006/09/13(水) 12:15:41ここみたいにやった方がいいのかな
map->get(map, "key");
じゃなくて
linkMap_get(map, "key");
どっちもどっちだなあ。この方がメンバ変数にアクセスされないですむけど。
>>10
そのインターフェース例の場合、
インスタンスに対する操作なのかstaticな操作なのかは
引数の最初にthisポインタがあることで判断するってこと?
それとも明示的にthisポインタを渡さないで複数の
インスタンスを切り分ける別の方法をとるってこと?
インスタンスを特定するためのキーはなにか渡さないと
いけないわけでしょ?
0012デフォルトの名無しさん
2006/09/13(水) 12:49:49http://www.sage-p.com/process/cool.htm
ObjC --> C のトランスレータ
http://users.pandora.be/stes/compiler.html
class, self, super くらいならプリプロセッサでナントカ
なるんじゃないの。
0013デフォルトの名無しさん
2006/09/13(水) 12:52:37書き方変だったな。
メソッドを参照するのと引数の二回、同じのを書くのが面倒って事で。
俺的お勧めは linkMap_get(map, "key"); の方かな。
struct __linkMap;
typedef struct __linkMap linkMap_t;
linkMap_t * LinkMap_new (void);
void LinkMap_destroy (linkMap_t *);
のように、構造体の中身を一切見せない、とかもできるし。
0014デフォルトの名無しさん
2006/09/13(水) 12:55:48・それOOと何の関係が?
0015デフォルトの名無しさん
2006/09/13(水) 12:58:460016デフォルトの名無しさん
2006/09/13(水) 12:58:59ttp://pc8.2ch.net/test/read.cgi/tech/1156661024/356-
0017デフォルトの名無しさん
2006/09/13(水) 13:05:19で、linkMapってナニ?
0018デフォルトの名無しさん
2006/09/13(水) 13:08:50Object Oppai の略ですか?
分かりません><;
0019デフォルトの名無しさん
2006/09/13(水) 13:18:210020デフォルトの名無しさん
2006/09/13(水) 13:21:00おまえ、かなり気持ち悪いから早く消えちまえ!
http://pc8.2ch.net/test/read.cgi/tech/1156661024/356-
356 名前: デフォルトの名無しさん 投稿日: 2006/09/13(水) 02:51:48
今更Cで仕事する羽目になったのですが、OOの癖が抜けなくてつらいです。
Cで使うOO風のライブラリってありませんか?
String *str = new_String("abc");
str->add("def");
みたいに書きたいんです。文字列の処理はString.hを見ればわかるっていう感じで
楽がしたいんです。Cではグローバルな関数群から目的のモノを探すだけで時間がかかります。
客(Solaris8)にコンパイルしてもらわなきゃいけないので、
大きくてトラブル対応できないライブラリは不可です。
見あたらなかったんでlinkMapとかloggerとか自分で作ってみたのですが、めんどくさく
なってきました。存在しないなら自作の奴をさらすので意見して欲しいなあと
思ってるんですがいかがでしょうか
363 名前: 356 [ssage] 投稿日: 2006/09/13(水) 08:29:31
10年以上前はCプログラマだった。 郷に入れば郷に従えだとは思うので、
c++で無理矢理Java風に書くのとかは嫌い。でも非OOで書くのはもうキツイ。
複数のインスタンスが生成できるコンテナあるのなら教えて。正直ググったけど
Hashtableのサンプルくらいしか見つからなかった。
Cで仕事することはもうほとんどないし、自作ライブラリよりもちゃんとメンテナの
いるライブラリを利用する方が効率いいからなあと思ったんだけど、
ちょっと別スレ建ててみますわ。まあスレが伸びなきゃ伸びないで終了ということで
0021デフォルトの名無しさん
2006/09/13(水) 13:29:270022デフォルトの名無しさん
2006/09/13(水) 13:34:080023デフォルトの名無しさん
2006/09/13(水) 13:38:200024デフォルトの名無しさん
2006/09/13(水) 13:38:38スレまで立てて、本当はヒマなんじゃねーの
こんなことするなら、自分で作って終わりでしょ
ていうか、そのスキルもなさそうだけどな
ケケケ
0025デフォルトの名無しさん
2006/09/13(水) 13:43:16何がやりたいんだろう?
0026デフォルトの名無しさん
2006/09/13(水) 13:52:090027デフォルトの名無しさん
2006/09/13(水) 13:58:44http://www.sage-p.com/process/cool.htm
COOLとプリプロセッサを駆使した
マクロテンプレートのコンテナとアルゴリズム
CPL
誰か作ってよ。
0028デフォルトの名無しさん
2006/09/13(水) 14:08:24俺用語じゃ伝わらないよ。
0029デフォルトの名無しさん
2006/09/13(水) 14:09:54そんなくだらんこと考える暇があったら、checkでも使ってUnit Test書け
0030デフォルトの名無しさん
2006/09/13(水) 14:47:17>ここはおまえの来るところじゃねーんだよ!
いや、このスレで隔離できるものならそうして欲しい。
003127
2006/09/13(水) 15:15:54こんなイメージ
#define CPL_VECTOR_VALUE_TYPE int
#define CPL_VECTOR_SIZE_TYPE size_t
#define CPL_VECTOR_ALLOCATOR malloc
#include<cpl/vector.h>
void test()
{
cpl_vector_int v;
cpl_vector_int_init(&v);
cpl_vector_init_push_back(100);
cpl_vector_int_finish();
}
0032デフォルトの名無しさん
2006/09/13(水) 15:17:34あー、イライラするwww
003327
2006/09/13(水) 15:17:48修正w
0034デフォルトの名無しさん
2006/09/13(水) 15:22:34int count;
int* array;
}
でいいじゃん。
0035デフォルトの名無しさん
2006/09/13(水) 15:23:560036デフォルトの名無しさん
2006/09/13(水) 15:25:04別にメンバ関数のようなシンタックスにする必要はない
それはオブジェクト指向とは(本当は)関係がない
問題はデストラクタの自動呼出しに集中すると思う
0037デフォルトの名無しさん
2006/09/13(水) 15:29:360038デフォルトの名無しさん
2006/09/13(水) 15:32:35typedef struct Map { void* instance; Map_Implementations* methods; } Map;
typeaef struct Map_Implementations {
void (*add)(self, Key* key, void* value);
void* (*get)(Map* self, Key* key);
} Map_Implementations;
Map* mapNew(void* instance, Map_Implementations* methods) {
Map* map = malloc(/*略*/);
map->instance = instance;
map->methods = methods;
return map;
}
void mapAdd(Map* self, Key* key, void* value) { *(self->methods->add)(self->instance, key, value); }
void* mapGet(Map* self, Key* key) { return *(self->methods->get)(self->instance, key, value); }
こんな感じで、インターフェースを定義しておいて、後で実装。
typedef struct HashMap { ・・・; } HashMap;
Map_Implementations methods = {
// メソッドの登録。
};
Map* hashMapNew() {
・・・;
return mapNew(self, &methods);
}
// メソッド実装の例
void* mapGetImpl(HashMap* self, Key* key, void* value) {・・・; }
利用するときは・・・。
Map* map = hashMapNew();
mapAdd(map, "UNKO", "MANKO");
puts(mapGet(map, "UNKO")); ==> MANKO
0039デフォルトの名無しさん
2006/09/13(水) 15:33:360040デフォルトの名無しさん
2006/09/13(水) 16:16:470041デフォルトの名無しさん
2006/09/13(水) 16:30:3100421
2006/09/13(水) 17:54:28keyはchar*で受け取ってるからコピーしてMapのデストラクタで解放するけど、
valueの方はどうしたらいいんだろうって。勝手に解放しちゃまずいし、かといって
解放しないと同一keyで別のオブジェクトが登録されたときにメモリリークしてもまずいし。
スマートポインタ実装しようにも、ジェネリックがないからメンバメソッド呼出の度に
キャストしなきゃいけないし。あ、でもこれはインスタンスに対してメソッド呼び出し
というシンタックスにこだわらなきゃいけるか。
CoreFoundationはいいかも。>>41はカスとか言ってるけど一緒に勉強する
お友達が欲しかったんでしょ?もうちょっと見てみる。
0043デフォルトの名無しさん
2006/09/13(水) 18:18:3600441
2006/09/13(水) 18:33:00ここから個別にDLするの・・??
http://www.opensource.apple.com/darwinsource/Current/CF-368.27/
調べてる時間あったらStringクラスとArrayクラスくらい書けたなあ
00451
2006/09/13(水) 18:34:300046デフォルトの名無しさん
2006/09/13(水) 18:37:130047デフォルトの名無しさん
2006/09/13(水) 19:26:56そのレスに何の意味があるの?w
0048デフォルトの名無しさん
2006/09/13(水) 21:57:170049デフォルトの名無しさん
2006/09/13(水) 22:33:290050デフォルトの名無しさん
2006/09/13(水) 23:52:4700511
2006/09/14(木) 12:26:13関数テーブルをクラスと分離することでメンバ変数の隠蔽もできるし、
コンストラクタで別メソッドを登録すれば派生クラスも簡単に
つくれるということね、なるほど。派生クラス側でメソッドのインターフェースを
追加したい場合はMap_Implementationをもう一個書けばいいのか。
でもこれ外注さんとか専門卒の一般PGとかメンテできなそうだね・・
00521
2006/09/14(木) 12:32:35listは1次元でmapは2次元です。keyとvalueが組になっていて
連想配列みたいに使うだけだけど、keyは任意の型で構わない。
俺の例でchar*にしたのは文字列じゃないと比較とかめんどくさいから。
で、順序を保持しているのがlinkedなんちゃらで、今回は順序を保持している
MapだからlinkMapにしてみた。linkedMapにしなかったのは、それならHashMapだって
HashedMapじゃねーのか?と思ったからで特に意味はない。JavaのLinkedHashMapは
順序を保持しつつ内部ではHash使ってget時の速度を向上させてる。俺のは
Hashによる検索速度向上がないからlinkMap。
0053デフォルトの名無しさん
2006/09/14(木) 12:34:04Cで自作でOOP近似のことが出来る俺様ライブラリって時点で
かなりNGじゃね?w
00541
2006/09/14(木) 12:40:52コレクション1個で終わりなわけねーだろ!。ちょっと便利な関数つくって
喜んでるわけじゃねーんだぞw
>>27
たぶんね、キミはね、"CPL"の"P"を突っ込まれてるんだと思うよ
>>34
あっちのスレにもstr->add()じゃなくてstrcatでいいじゃんという
人がいたけど、手続きを呼び出すのとオブジェクトにメッセージを投げて
処理してもらうのとでは、設計段階から大分違うよ。詳細設計通りに
作るだけのPGならかえって後者の方が面倒に感じるのかもしれない。
設計自体も手続き型で構造化設計の方が楽だと思ってる人は化石だから、
注意してね。規模が小さければそれでも十分で、生兵法のOOなんかより
よっぽど品質がいいのもいっぱいあるけど。
0056デフォルトの名無しさん
2006/09/14(木) 14:05:55int main(int ac, char *av[])
{
struct window w;
struct button b;
createwindow(&w, "sample");
setsize(&w, 100, 50);
createbutton(&b, "test button", 20, 8);
appenditem(&w, 40, 10, &b);
showwindow(&w, 10, 20);
return 0;
}
0057デフォルトの名無しさん
2006/09/14(木) 14:12:040058デフォルトの名無しさん
2006/09/14(木) 14:12:42マジレスすると、あきれてるんだと思うよ。
0059デフォルトの名無しさん
2006/09/14(木) 14:29:18>>1がバカだったのか……。
0060デフォルトの名無しさん
2006/09/14(木) 14:34:060061デフォルトの名無しさん
2006/09/14(木) 14:38:110062デフォルトの名無しさん
2006/09/14(木) 15:31:48よく動詞の原形を使う俺がいる
0063デフォルトの名無しさん
2006/09/14(木) 16:07:310064デフォルトの名無しさん
2006/09/14(木) 19:37:40きれいな構造化プログラミングですね。
0065デフォルトの名無しさん
2006/09/14(木) 22:54:570066デフォルトの名無しさん
2006/09/14(木) 23:06:050067デフォルトの名無しさん
2006/09/15(金) 01:32:48どれだけ足掻いても、CはCなんだよ。
0068デフォルトの名無しさん
2006/09/15(金) 01:36:440069デフォルトの名無しさん
2006/09/15(金) 03:20:18サンプルコード探してみよ。
00701
2006/09/15(金) 14:00:37OSXCompatibilityHeaders/*.hというヘッダファイル群が必要で
どっからとってくるのかググってもわからなかった。
Makefileにはfor Linuxとか for FreeBSDとかあるのでなんとか
なりそうだけど、開発環境がcygwin+Eclipse、本番がSolarisなので
とりあえずあきらめることにした。
でもいろいろ勉強になったよ。スマートポインタ実装するときは
CFを参考にしようと思った。
0071デフォルトの名無しさん
2006/09/15(金) 14:05:35ttp://journal.mycom.co.jp/column/objc/
0072デフォルトの名無しさん
2006/09/15(金) 16:51:520073デフォルトの名無しさん
2006/09/15(金) 17:07:380074デフォルトの名無しさん
2006/09/16(土) 00:40:36開発環境もソラリン入れれば良いんじゃないの。
普通の PC でも動くし、Eclipse も使えるよ。
>>72
ObjC は遅いのがネックじゃないかな。
上物は全部動的束縛になっちゃうから。
0075デフォルトの名無しさん
2006/09/16(土) 06:03:13Cで直接やろうとしないでさぁ;;
0076デフォルトの名無しさん
2006/09/16(土) 07:05:570077デフォルトの名無しさん
2006/09/16(土) 07:41:07メイヤー「オブジェクト指向入門」アスキー はいい本です
0078デフォルトの名無しさん
2006/09/16(土) 14:18:07サブクラスでC++っぽくオーバーライドを書けるメリットとどっちをとるべきか。
0079デフォルトの名無しさん
2006/09/16(土) 14:31:030080デフォルトの名無しさん
2006/09/16(土) 18:04:48C++で実装している、関数配列とか参考にしてみたら?
0081デフォルトの名無しさん
2006/09/20(水) 00:44:00メンバにメソッドのテーブルを持たせて、
メソッド呼び出しがobj->table->method()ってなるのかな。
obj->method(obj)のほうが使いやすい気がする。
objを2回書かなきゃならんけど。
0082デフォルトの名無しさん
2006/09/20(水) 00:50:54http://journal.mycom.co.jp/column/objc/
00831
2006/09/20(水) 01:38:59で、やってて思ったのが
> objを2回書かなきゃならんけど。
これが意外と大変。どんなときに大変かというとこんな時。
obj->util(obj)->target(obj->util)->func(obj->util->target);
こうなるのを避けるために2行にしてもまだちょっとなあって感じ
target = obj->util(obj)->target(obj->util);
target->func(target);
>>82
@see >>71
00841
2006/09/20(水) 03:55:13誰か一緒にやりたいって人がいたらSouceForgeにでも登録するけど
ttp://x86-64.hp.infoseek.co.jp/
0085デフォルトの名無しさん
2006/09/20(水) 04:41:50obj->methods[1]
0086デフォルトの名無しさん
2006/09/20(水) 06:39:11口だけ番長とはちょっと違うみたいだな。
String.hを開いて10秒の感想。
・名前を別のものにしたほうがいい。なぜなら、標準でstring.hがありまぎらわしいから。
・エラーの種別(エラーコードなど)は、どうやって戻すの?
・defineを使って、どんな関数が使えるのかを列挙したほうが見やすい。
*.cはコンパイルできるようになったら見るかも。
00871
2006/09/20(水) 12:33:00Allocator使ってメモリリークのデバッグ済みだよ
コンパイルしてみてくれる人がいるならsrc.zipの形でまとめた奴も置いた方が
いいかな。String.hはヘッダファイル名だけ別にすればいいってこと?
Stringっていう名前も変えた方がいい?
Windowsはファイルの大文字小文字を区別しないからなんだかなあとは
思っていたけど。
0088デフォルトの名無しさん
2006/09/20(水) 15:42:31できないよ。
ファイルが足りない。
0089デフォルトの名無しさん
2006/09/20(水) 16:43:420090デフォルトの名無しさん
2006/09/20(水) 18:04:01使う分には継承も隠蔽もできないしコンパイルエラーの表記がわけわかになるし
正直ゴミだと思うよ。
0091デフォルトの名無しさん
2006/09/20(水) 20:34:16そこで継承とメソッドのオーバーライドをキャストなしでする方法を考えた。
クラスを一つ定義する毎にマクロを3つ定義する。
・クラスや仮想関数の型定義をするマクロ。
・メンバを定義するマクロ。
・メンバを初期化するマクロ。
■Hoge.h
#define HOGE_DEFINE_CLASS(CLASS) \
typedef struct CLASS##_t CLASS;\
typedef void (*CLASS##_destroy_t)(CLASS *self);\
typedef void (*CLASS##_print_t)(CLASS *self);\
#define HOGE_DEFINE_MEMBER(CLASS) \
int hoge;\
CLASS##_destroy_t destroy;\
CLASS##_print_t print;\
#define HOGE_INIT_METHOD(CLASS, HOGE) \
self->hoge = HOGE;\
self->destroy = (CLASS##_destroy_t) Hoge_destroy;\
self->print = (CLASS##_print_t) Hoge_print;\
/* クラス定義 */
HOGE_DEFINE_CLASS(Hoge)
struct Hoge_t {
HOGE_DEFINE_MEMBER(Hoge)
};
Hoge *Hoge_create(int hoge);
void Hoge_destroy(Hoge *self);
void Hoge_print(Hoge *self);
0092デフォルトの名無しさん
2006/09/20(水) 20:35:30#include "Hoge.h"
/* 初期化 */
static void Hoge_init(Hoge *self, int hoge)
{
HOGE_INIT_METHOD(Hoge, hoge)
}
/* コンストラクタ */
Hoge *Hoge_create(int hoge)
{
Hoge *self = (Hoge *) malloc(sizeof(Hoge));
Hoge_init(self, hoge);
return self;
}
/* デストラクタ */
void Hoge_destroy(Hoge *self)
{
free(self);
}
void Hoge_print(Hoge *self)
{
printf("%d\n", self->hoge);
}
0093デフォルトの名無しさん
2006/09/20(水) 20:42:16■Piyo.h
#include "Hoge.h"
/* クラス定義 */
HOGE_DEFINE_CLASS(Piyo)
struct Piyo_t {
HOGE_DEFINE_MEMBER(Piyo)
/* 追加メンバ */
int piyo;
};
Piyo *Piyo_create(int hoge, int piyo);
void Piyo_print(Piyo *self);
■Piyo.c
#include "Piyo.h"
static void Piyo_init(Piyo *self, int hoge, int piyo)
{
HOGE_INIT_METHOD(Piyo, hoge)
self->piyo = piyo;
self->print = Piyo_print;
}
Piyo *Piyo_create(int hoge, int piyo)
{
Piyo *self = (Piyo *) malloc(sizeof(Piyo));
Piyo_init(self, hoge, piyo);
return self;
}
void Piyo_print(Piyo *self)
{
printf("%d, %d\n", self->hoge, self->piyo);
}
0094デフォルトの名無しさん
2006/09/20(水) 20:46:59Hoge *h = Hoge_create(1);
Piyo *p = Piyo_create(2, 3);
h->print(h); /* 1 */
p->print(p); /* 2, 3 */
h->destroy(h);
p->destroy(p);
Piyoクラスを継承したかったらさらに3つのマクロを定義する。
そうすれば何階層でも継承できる。
マクロ書くのがめんどくさいがスクリプトで自動生成できるようにがんばる。
このやり方どうでしょう?
0095デフォルトの名無しさん
2006/09/20(水) 21:34:5200961
2006/09/20(水) 22:48:55引数なしで起動するとtest.propertiesを読む。
$ ./a -f test2.properties
と打てばtest2.propertiesを読むよ。
http://x86-64.hp.infoseek.co.jp/src.zip
>>91
別にキャストしなくても中で委譲すればいんじゃね?
typedef struct __child {
void (*func1)(struct __child *this);
Super *super;
}Child;
// コンストラクタ
Child *Child_new(){
Child *this = l_malloc(..);
this->super = Super_new();
this->func1 = this->super->func1;
}
試してないけど
0097デフォルトの名無しさん
2006/09/20(水) 22:53:02strcpyの前にstrlenでサイズチェックしてメモリ確保してるんだけど、
それでも駄目な場合って?引数にchar*を渡した直後に別スレッド
値を書き換えて、strlenとstrcpyの間に値が書き換えられたら
バッファオーバーフローをおこせるから?
そういう変な使い方も想定しておきたいな。サイズ調べてるんだし、memcpyにすればいい?
0098デフォルトの名無しさん
2006/09/21(木) 00:31:300099デフォルトの名無しさん
2006/09/21(木) 00:50:15010091
2006/09/21(木) 01:38:34やっぱマクロのせいで読みづらいしバグが見つかりにくくなってしまうのがまずいですか。
>>96
委譲にする方法はいいアイデアと思ったけど、親クラスのデータメンバにアクセスするのが
大変になりますね。
現実的には何階層も継承したりしないけど、もしした場合、
this->super->super->super->...->super->data
って書かなきゃいけなくなる。
一応自分のメンバなんだから、すっきりthis->dataか、せめて(Super *)this->dataって書けたらなあ。
01011
2006/09/21(木) 02:20:100102デフォルトの名無しさん
2006/09/21(木) 02:46:51typedef struct
{
Class_init_type init;
Class_finish_type finish;
Class_new_type new_;
Class_delete_type delete_;
}Class_function;
test(){
Class* c;
Class_function fn;
fn = get_Class_function();//get_SubClass_function();
c = fn.new_();
fn.init(c);
fn.finish(c);
fn.delete_(c);
}
0103デフォルトの名無しさん
2006/09/21(木) 03:41:08結局はコンパイラやスクリプトで言語を作ったほうが速いんだよ。
その意気込みをもうちょっとだけ進めて、
そのエネルギーをD言語とかまだ進化中のフィールドで生かせ!
0104デフォルトの名無しさん
2006/09/21(木) 03:43:28http://pc8.2ch.net/test/read.cgi/tech/1156692664/
0105デフォルトの名無しさん
2006/09/21(木) 04:15:30そんなあなたにはObjective-Cをすすめる。
Objevtive-Cは、おもいっきりCでOOを実現しているといっていい言語だし、Cと完全互換性があるから、Cのソースをそのまま使えるよ。
0106デフォルトの名無しさん
2006/09/21(木) 04:19:23ちょおまwwww
C++(C with objects)でいいじゃないか
0107デフォルトの名無しさん
2006/09/21(木) 04:21:570108デフォルトの名無しさん
2006/09/21(木) 05:17:10Cとの互換を維持するつもりで作ったんじゃないからねぇ
01091
2006/09/21(木) 05:20:15別にOOを究めるなにかを求めているわけではなくて、仕事上Cのプログラムを
書かざるを得なくなったけど(C++不可)、なんとかラクをしたいなー、というのが出発点です。
全関数がグローバルスコープなままだと疲れるので、他のOO言語っぽくやりたいのです。
0110デフォルトの名無しさん
2006/09/21(木) 05:53:42って話題がループしてるな。
http://users.pandora.be/stes/compiler.html
0111デフォルトの名無しさん
2006/09/21(木) 09:33:23http://www.gnome.gr.jp/docs/glib/glib-data-types.html
0112デフォルトの名無しさん
2006/09/21(木) 10:22:15仕様をはっきりさせないから、意味わかんないじゃんかよー
0113デフォルトの名無しさん
2006/09/21(木) 12:21:050114デフォルトの名無しさん
2006/09/21(木) 15:58:31少なくとも、作った当初は上位互換性を求めていた。
だからこそあんな糞汚(ry
0115デフォルトの名無しさん
2006/09/21(木) 15:59:53>>1 は、手段がいつのまにか目的になってしまうタイプ。
0116デフォルトの名無しさん
2006/09/21(木) 17:24:420117デフォルトの名無しさん
2006/09/21(木) 17:42:450118デフォルトの名無しさん
2006/09/21(木) 18:26:25期待して損したよ。
0119デフォルトの名無しさん
2006/09/21(木) 21:11:242. コンストラクタ以外の全てのメソッドの呼び出しは、obj->method(obj)の形で統一したい。
1を満たすと、親クラスの仮想関数呼び出し時にキャストが必要になる。(オーバーライドの場合は不要)
Super_method((Super *)obj)または((Super *)obj)->method((Super *)obj)と書くしかない。
2を満たすと、親クラスが持ってるにもかかわらず
(型は違うが)同じメソッドのポインタを子クラスのメンバにも持つ必要がある。
その分無駄なメモリを使うことになるし、親の全メソッドのポインタをまた書いて初期化するのがめんどくさい。
この2つを満たす方法はないもんだろうか?
0120デフォルトの名無しさん
2006/09/21(木) 21:14:290121デフォルトの名無しさん
2006/09/21(木) 21:47:27子クラスのテーブルに親クラスのメソッドも全部書かなきゃならんから
差分書くだけでOK、にならない。
0122デフォルトの名無しさん
2006/09/21(木) 21:49:360123デフォルトの名無しさん
2006/09/21(木) 21:56:100124デフォルトの名無しさん
2006/09/21(木) 22:02:18クラスはclassクラスのインスタンスにしろ。
0125デフォルトの名無しさん
2006/09/21(木) 22:23:19最速で動くように実装して、あとはoptionにしてよ。
無駄に遅いのはライブラリとして役に立たない。
0126デフォルトの名無しさん
2006/09/21(木) 23:18:00http://www.amazon.co.jp/gp/product/4789833399
どんな型でもいけるが、バグがどこにあるかわからなくなるので
マクロ化する前にしっかりデバッグしろと書いてあった
#define InterfaceStack(NANE,TYPE,MAX) \
typedef struct {\
int sp;\
TYPE buf[MAX];\
}NAME;\
void init_##NAME(NAME *self);\
void push_##NAME(NAME *self,TYPE data);\
TYPE pop_##NAME(NAME *self);\
#define ImplementStack(NAME,TYPE)\
void init_##NAME(NAME *self){ 略 }\
void push_##NAME(NAME *self,TYPE data){ 略 }\
TYPE pop_##NAME(NAME *self){ 略 }\
0127デフォルトの名無しさん
2006/09/21(木) 23:43:06初期のC++にはマクロでクラステンプレートもどきを提供する<generic.h>があったそうな。
0128デフォルトの名無しさん
2006/09/22(金) 01:13:590129デフォルトの名無しさん
2006/09/22(金) 01:52:49その手のは何度か作った事あるな。
0130デフォルトの名無しさん
2006/09/22(金) 02:43:43> Cとの互換を維持するつもりで作ったんじゃないからねぇ
ダウト
0131デフォルトの名無しさん
2006/09/22(金) 02:55:43わずかながら維持できなかった所もあるが。
0132デフォルトの名無しさん
2006/09/22(金) 03:02:37これはあとだしジャンケンみたいなものだからいたしかたなし。
0133デフォルトの名無しさん
2006/09/22(金) 05:42:55維持するつもりなら、CとC++との互換問題はまったく起きないはずだけど、どのへんが?
0134デフォルトの名無しさん
2006/09/22(金) 08:04:58C++標準化の際にCとの100%の互換性は求めないこということに決まったとある。
なんでも型安全などの都合らしい。
0135デフォルトの名無しさん
2006/09/22(金) 08:06:59一体どこの話をしてるのだろう。structの話か?
0136デフォルトの名無しさん
2006/09/22(金) 11:26:07gtkというライブラリを見てみなさい。
C++やjavaで言うメンバ関数を使うためには、
わざわざキャストのマクロを定義して、何のクラスなのかを明示する必要がある。
そこまでしてCで書く利点はなど何もない。
0137デフォルトの名無しさん
2006/09/22(金) 13:32:14お前、Objective-Cを知らないな
0138デフォルトの名無しさん
2006/09/22(金) 15:12:42100% の互換性は求めてないけど、
最小限の変更で何とかなるようにはしたんじゃない?
0139デフォルトの名無しさん
2006/09/22(金) 15:53:05stack->push(stack, value);
(*stack).push(stack, value);
stack[0].push(stack, value);
stack[0].dispose(stack);
0140デフォルトの名無しさん
2006/09/22(金) 16:04:170141デフォルトの名無しさん
2006/09/22(金) 16:30:400142デフォルトの名無しさん
2006/09/22(金) 19:40:160143デフォルトの名無しさん
2006/09/22(金) 23:20:16を
obj->class->methods->say(obj, "unko", "うんこ");
の様に展開出来るマクロはないの?
C99の可変長引数を受け取れるマクロってstdarg使わないといけないんだっけ?
0144デフォルトの名無しさん
2006/09/23(土) 00:15:53インターフェイスはSTLにならって。popは値を返すようにしたけど。
こんな感じで使える。 アプリ毎にlistを実装しなくて済むから便利だ。
IntList *ls = IntList_create();
IntListIterator pos;
ls->push_back(ls, 1);
ls->push_back(ls, 2);
ls->push_back(ls, 3);
for (pos = ls->begin(ls); pos != ls->end(ls); pos = pos->next) {
int i = ls->get(pos);
if (i == 2) ls->insert(ls, pos, 4);
}
while (!ls->empty(ls)) {
int i = ls->pop_front(ls);
printf("%d ", i); /* 1 4 2 3 を出力 */
}
ls->destroy(ls);
0145デフォルトの名無しさん
2006/09/23(土) 01:36:06初期化前に初期化関数を呼び出せない罠。
IntArray ar;
ar.init(&ar);//アボンヌ
0146デフォルトの名無しさん
2006/09/23(土) 01:40:19create()の中でmalloc()してメンバを初期化してる。C++のnewみたいなもん。
だからdeleteに相当するdestroy()で解放が必要。
01471
2006/09/23(土) 02:56:55どうやって判断したらいいの?manみたんだけど、一旦sendしてEPIPE拾うしか
ないのかな?このソースだとfprintfで0が返ってきたらerrnoをチェックしろって
事かなあ。シグナルが発生しないようにMSG_NOSIGNALをセットするのって
もしかしてfopenとfprintfの組み合わせじゃ出来ない?
0148デフォルトの名無しさん
2006/09/23(土) 03:20:5701491
2006/09/23(土) 03:38:25get()では今fgets==NULLになるまで読み込んでるけど、KeepAliveの終端文字"0\r\n\r\n"(?要調査)
が来たら返すように変更する。connect()は最初の1回だけで、あとはget()だけを
繰り返し呼ぶんだけど、KeepAliveのTimeoutで相手先に接続を切られている場合が
あるから、その場合は再接続してあげないといけない。
だからsocketが生きているかチェックしたいんだけど、なにか間違ってる?
0150デフォルトの名無しさん
2006/09/23(土) 08:53:190151デフォルトの名無しさん
2006/09/23(土) 10:47:35???
#何とどう間違えたのだろう……
0152デフォルトの名無しさん
2006/09/23(土) 11:15:570153デフォルトの名無しさん
2006/09/23(土) 11:21:490154デフォルトの名無しさん
2006/09/23(土) 11:28:280155デフォルトの名無しさん
2006/09/23(土) 13:59:2101561
2006/09/23(土) 17:25:080157デフォルトの名無しさん
2006/09/25(月) 23:19:11いや、ね、JavaのPureObjectをC++風にするとどうなるのか知りたくてさ。
0158sage
2006/09/25(月) 23:51:16実装したクラスもいぱーいあるよ
0159デフォルトの名無しさん
2006/09/29(金) 01:28:530160デフォルトの名無しさん
2006/09/29(金) 02:02:380161デフォルトの名無しさん
2006/10/01(日) 00:14:18破棄するのって、普通はコンテナクラスの外部でやるものなのだろうか。
0162デフォルトの名無しさん
2006/10/01(日) 00:15:55containerはfactoryじゃないからなぁ…
積荷を勝手に食われちゃ商売上がったりだよなぁ…
とデザパタを全く知らない俺が言ってみるテスツ
0163デフォルトの名無しさん
2006/10/01(日) 01:15:37STLがどうなっているか見てみて、それを参考にしたらどう。
0164デフォルトの名無しさん
2006/10/01(日) 02:21:05smart pointer入れたらどうなるか
■ このスレッドは過去ログ倉庫に格納されています