■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part45
251 名前:デフォルトの名無しさん :2005/12/07(水) 07:49:23
>239の上のサイト、入門にありがちな応用が身に着かない教え方だな。

252 名前:デフォルトの名無しさん :2005/12/07(水) 07:57:14
あーダメだ、
>ただし、綺麗で保守的なプログラムを書きたいのであれば
>適当な位置で変数を宣言するのではなく、ブロックの先頭でまとめて宣言するべきです
こんなこと書いてるよ。

253 名前:デフォルトの名無しさん :2005/12/07(水) 08:11:52
>>252
保守的っていうがC89からの習慣や伝統を守るっていう意味だと正しいだろ。

254 名前:デフォルトの名無しさん :2005/12/07(水) 08:14:44
>>253
そもそも変数の宣言箇所についてはC言語の伝統を守ること自体が間違いだと思われ。

255 名前:デフォルトの名無しさん :2005/12/07(水) 08:54:20
すっかり未初期化の変数は気持ち悪いと感じる体になってしまったなぁ。


256 名前:デフォルトの名無しさん :2005/12/07(水) 09:05:34
>未初期化の変数は気持ち悪い

健全だと思われ

257 名前:デフォルトの名無しさん :2005/12/07(水) 13:07:33
申し訳ありません。C++言語の言語使用自体はおおまかに学び終えたものの
実際のコーディングに関してわからない点があるため質問をさせてください。

変更が不可能な既存のクラスClassAとClassBがすでに存在し

コード中で
ClassA a;
ClassB b;

a=b;
あるいは
b=a;
などのように代入演算子を使えるようにしたいとします。

その場合にはClassAとClassBを継承するクラスをそれぞれ作成し
代入演算子をオーバーロードするしか方法はないのでしょうか?


258 名前:デフォルトの名無しさん :2005/12/07(水) 13:15:54
>>257
friend使えば継承しなくていい。

259 名前:デフォルトの名無しさん :2005/12/07(水) 13:16:56
それにもし継承したとしても、privateメンバはusingでアクセス権を復活させるなど、
かなりおかしな事をしなくてはいけない。

260 名前:257 :2005/12/07(水) 13:44:36
friendも検討はしてみたのですが、class定義のほうに変更を加えなくては
ならないため使えませんでした。

ClassAとClassBはヘッダファイルも含めてまったく変更不可という場合には
やはり継承クラスを作って対処するしかありませんか・・・?

261 名前:257 :2005/12/07(水) 13:52:07
すみません。補足です。
それぞれのクラス内のデータは適当な関数などを使って取り出せるので
アクセス権限などは問題になりません

262 名前:デフォルトの名無しさん :2005/12/07(水) 14:36:45
>>257
なぜ代入演算でなければならないのですか?
どう考えても設計ミスなので他の手段を考えましょう。


263 名前:デフォルトの名無しさん :2005/12/07(水) 14:41:19
代入演算子でなくともClassA A2B(const ClassB&);のような関数を作れば良いと思うのですが。

264 名前:デフォルトの名無しさん :2005/12/07(水) 14:53:43
>>263
privateメンバはどうやってアクセスするの?friendしかないでそ。

265 名前:デフォルトの名無しさん :2005/12/07(水) 15:10:26
>>264
>>261

266 名前:263 :2005/12/07(水) 15:11:11
そういえばAとBが逆でしたな。すまん。

267 名前:257 :2005/12/07(水) 16:02:12
>>262
>>263
たしかにおっしゃるとおりだと思います。
代入演算子を使おうと思った理由は、ClassAとClassBが本質的には
同じ内容のデータを管理するからです。具体的には顧客情報です。

>>264
それぞれのクラスには取り出しようの関数と格納用の関数が備わっているので
privateメンバでも問題はありません。

このクラス設計がおかしいのは私も承知しておりますが
引き継いできたソース(変更不可)を流用せよという指示があるので
こうせざるを得ません。

C++流のエレガントな記述方法があるのではないかという思いから
書き込ませてもらいました。
こういう場合は263の方法をとるのが一番最適なのでしょうか?


268 名前:デフォルトの名無しさん :2005/12/07(水) 16:46:10
>>267
>こういう場合は263の方法をとるのが一番最適なのでしょうか?
設計者とプロジェクトリーダーをぶん殴る

269 名前:デフォルトの名無しさん :2005/12/07(水) 16:50:11
ClassAやClassBを継承しなくてもラッピングしたらどうか?

270 名前:デフォルトの名無しさん :2005/12/07(水) 17:48:33
BCBのヘッダーファイルに

class TestClass;

っていう文法を見たんですが、
これってC++標準ですか?

みたところ、TestClassがクラスだよとコンパイラに教えて、
ヘッダーインクルードは実装部(.cpp)にのみしてるっぽいんですが、
そういう使い方ですか?

271 名前:デフォルトの名無しさん :2005/12/07(水) 17:50:51
ええ


272 名前:デフォルトの名無しさん :2005/12/07(水) 17:59:21
設計ミスだよな。
AとBを保持するclassCでも作ったら?

>>270
普通に使う。

273 名前:270 :2005/12/07(水) 18:29:29
サンクス>>271-272

標準構文ですか。
「class」がキーワードなのでググルでも調べれなくて困ってますた。

でもヘッダーファイルに実体宣言するとエラーで、
使えるのはポインタ宣言だけなんですね。

C++言語文法自体がポインタ嫌いなので、
ちょっと不整合な感じもしなくも無いですね。

でも、どうせBCB/VCL使ってるとクラスのポインタ使いまくりですが。

274 名前:デフォルトの名無しさん :2005/12/07(水) 18:42:11
>257
単にグローバル(名前空間)な二項演算子をオーバーロードするだけでいけるんじゃないの?

275 名前:デフォルトの名無しさん :2005/12/07(水) 18:49:52
ってできないのか。初めて知った。

276 名前:デフォルトの名無しさん :2005/12/07(水) 19:09:01
ログファイルから送信元IPアレスだけを別のファイルに抜き出して書き込みたいのですがどうすればいいでしょうか?
ファイルの内容は 
日付 to 送信先IP from 送信元IP:port
です。
送信元IPだけを特定する手順を教えてくださる方いませんでしょうか?



277 名前:デフォルトの名無しさん :2005/12/07(水) 19:09:55
>>273
どっちかがポインタじゃないと、コンストラクタの呼び出しが終わらないでしょw
A -> A::B -> A::B::A -> A::B::A::B -> ...


278 名前:デフォルトの名無しさん :2005/12/07(水) 19:18:01
>>276
「from 」を検索して、その次の文字から「:」までの間を切り出すだけじゃないのか?

279 名前:デフォルトの名無しさん :2005/12/07(水) 19:57:45
>>276
そういうのはperlの18番でつ

280 名前:デフォルトの名無しさん :2005/12/07(水) 20:37:30
>>277
コンストラクタの呼び出しが終わらない、というか、そもそも
A の中に B のインスタンスが入り、 B の中に A のインスタンスが入る
という状況なのでクラスメンバの配置が確定しないんだな

281 名前:デフォルトの名無しさん :2005/12/07(水) 21:05:00
>>273
それは前方参照と言われる。
ちなみにポインタだけでなく参照も平気。


282 名前:デフォルトの名無しさん :2005/12/07(水) 21:47:08
前方宣言 (forward declaration) じゃね? 前方参照っていう言葉は聞いたことがないな

283 名前:デフォルトの名無しさん :2005/12/07(水) 21:51:16
_| ̄|○
やってしもた。

284 名前:277 :2005/12/07(水) 22:00:39
>>280
あ、そっか。
まともな補足サンクス。

285 名前:デフォルトの名無しさん :2005/12/08(木) 09:19:04
>>281
説明サンクス。
参照でも良いのね。




でも、クラスで参照使うとコンパイルエラー出まくりで苦手。
自分vectorの1行取得位にしか使えない。

286 名前:デフォルトの名無しさん :2005/12/08(木) 10:16:30
> クラスで参照使うとコンパイルエラー出まくり

んなこたぁない。

287 名前:デフォルトの名無しさん :2005/12/08(木) 10:27:06
>>285
そりゃ、おまいさんの頭がエラーだらけなんでそ。

288 名前:285 :2005/12/08(木) 10:41:07
初期値無しで参照型宣言するとコンパイルエラー出るお。

289 名前:デフォルトの名無しさん :2005/12/08(木) 11:40:38
>>288
当たり前です。参照するものがあって始めて参照型を宣言できるわけですから。
そういうこともあるので、>252のようなことが書かれた入門講座はダメなのです。

290 名前:デフォルトの名無しさん :2005/12/08(木) 11:42:31
boost::addressofですが、最初にconst volatile char &にキャスト
しているようですが、何故volatileが必要なんでしょうか?

291 名前:276 :2005/12/08(木) 14:56:37
>278,279さん、アドバイスありがとうございます。
検索してfromをみつけることは分かったのですが、fromから次の文字を切り取るにはどうすればいいのでしょうか?


292 名前:デフォルトの名無しさん :2005/12/08(木) 15:20:56
std::stringについて質問です

たまに string str; に対し str = "";
という方法で文字列をクリアしてるのを見かけるのですが、
これは string::clear() を使うより効率がいいとかなんでしょうか?

また、string::reserve() で設定したサイズは
string::clear()で解除されたりするんでしょうか?

以上、よろしくお願いします

293 名前:デフォルトの名無しさん :2005/12/08(木) 16:26:27
>>292
前者は特に規格では規定されていないが、効率は多分clear()の
方が速いだろう。単に見やすさのために空文字列を代入していると
思われる。

後者は、非強制的な要求であり、必ずしも解除されるとは保証
されていない。reserve()で確保した領域を解除するには、

str.clear();
str.swap(str);

と二段階のステップを踏むとよい。

294 名前:デフォルトの名無しさん :2005/12/08(木) 16:36:11
>>293
的確な返答ありがとうございました。

295 名前:デフォルトの名無しさん :2005/12/08(木) 16:37:10
Effective STL 第17項より

std::string().swap(str);

と書けば、1ステップで、string::reserve で確保された領域を
解放できる。

また、特に string::clear せずに string::swap を適用した場合は、
”きっちり詰められる”事は規格では保証されていない。2の累乗の
大きさとか、要するに処理系依存の領域になる。

296 名前:デフォルトの名無しさん :2005/12/08(木) 17:50:23
class Base {
public:
 virtual Foo() = 0;
};

class Concrete : public Base {
public:
 Foo() { Bar(); }
};

という具合になってて

Base* base = new Concrete;
base->Foo();

とか

Concrete c;
Base& b = c;
b.Foo();

とかがいけるのはわかるのだけど

Base& base = Concrete;
base.Foo();

みたいにまとめて書くことはできないのでしょうか?
g++だとコンパイルは通らないけど、
VC++だとコンパイルが通って動いてしまうのが謎

297 名前:デフォルトの名無しさん :2005/12/08(木) 17:54:39
>>296
VC++って6か?7.1か?
6なら糞だぞ。そんなコードを通すなら、安心してプログラムができない。

298 名前:デフォルトの名無しさん :2005/12/08(木) 17:56:37
>>296
Base& base = Concrete;
これ通るのはまずいような....
非const参照に一時オブジェクトが束縛されている


299 名前:デフォルトの名無しさん :2005/12/08(木) 18:00:12
7.1です・・・
cygwin環境とVC++と、両方でコンパイルできるように書いてますが、
他にもこりゃー間違いだろ、というコードをプログラマの意図を汲んで(?)
通してくれたことがありました
あれは何だったっけなあ・・・

>>298
そうそう
g++だと、そういうエラーメッセージが出ます

300 名前:デフォルトの名無しさん :2005/12/08(木) 18:01:46
VCは8.0に期待するしかないな。最近バグ報告が多いな。
boostがよく通るので、出た当時は喜んでいたものだが。

301 名前:デフォルトの名無しさん :2005/12/08(木) 18:25:07
vc7.1+boost1.32or33でboost::formatのぬるぽって出ます?
こっちで出たけどよそでも出てないかなと気になる。

302 名前:デフォルトの名無しさん :2005/12/08(木) 18:33:09
class Test {
private:
 boost::function<void ()> fn;
public:
 void Foo() {
//  fn = boost::bind(Foo, this);
  fn = boost::bind(&Test::Foo, this);
 }
};

VC++7.1だと上のコメントアウトでもコンパイルが通るんだけど
文法的には可?不可?

303 名前:デフォルトの名無しさん :2005/12/08(木) 20:33:40
>>302
ISO的には不可。

304 名前:デフォルトの名無しさん :2005/12/08(木) 20:47:01
>>302
補足しておくとISO/IECの5.3.1.3のNote参照。
gccでは、MFCでその形式が使われているのに対処するために
-fms-extensionsオプションをつけることでコンパイルを通せる。
どちらにしろ独自拡張(拡大解釈?)。

305 名前:デフォルトの名無しさん :2005/12/08(木) 21:47:17
>>303-304
詳細な解説ありがとう
MFCでも使われてるのか・・・

306 名前:デフォルトの名無しさん :2005/12/09(金) 05:05:33
>>296
Level4なら警告がでるはず

307 名前:デフォルトの名無しさん :2005/12/09(金) 08:50:50
Lokiのシングルトンテンプレートのソースを読んでいて思ったのですが

class SingletonHolder {
 static PtrInstanceType pInstance_;
 ...
};

PtrInstanceType SingletonHolder::pInstance_;

という感じの宣言をしておいて、
pInstance が NULL かどうかでインスタンスを作るか選択しています。

このようにグローバルスコープ?で宣言した変数は、
明示的に初期化しなくても0が入っている、とみなして良いでしょうか?
gccやVCでテストした限りでは、グローバルスコープで宣言した変数は
初期化しなくても0が入っているようです

また、それを前提として、グローバルスコープに下記の記述をしても良いのでしょうか
b.cppでは、ptrがNULLで初期化されていることを前提にしています
明示的な代入で値を入れる場合、異なる翻訳単位では初期化順が不定になるようですが、
この場合、代入で初期化しておらず、その規則が当てはまるのかわかりません。

-- a.cpp --
void *ptr

-- b.cpp --
int TestValue() {
 if (ptr == NULL) ptr = new TestClass();
 return ptr->GetValue();
}

int n = TestValue();

308 名前:デフォルトの名無しさん :2005/12/09(金) 10:35:24
Cだとグローバル酢k-ぷ、staticスコープのポインタ変数は自動的にNULLに初期化される。
C++だとそれに加えて、クラスのメンバ変数がデフォルトコンストラクタで初期化されるとNULLになる。

309 名前:デフォルトの名無しさん :2005/12/09(金) 10:50:17
>>308
C++の場合は0と言え。

310 名前:デフォルトの名無しさん :2005/12/09(金) 11:27:10
>>309
0 と言ってはいけない理由でも?

311 名前:デフォルトの名無しさん :2005/12/09(金) 11:27:53
まちがえた。 NULL と言ってはいけない理由でも?

312 名前:デフォルトの名無しさん :2005/12/09(金) 11:35:36
>>311
そんくらいぐぐれ

313 名前:デフォルトの名無しさん :2005/12/09(金) 11:44:23
>>308
レスサンクス
その自動で0に初期化されるタイミングは、
他のグローバルスコープの(明示的な)初期化が実行されるより前、
と考えて良いのでしょうか

314 名前:デフォルトの名無しさん :2005/12/09(金) 11:46:06
NULLじゃいけないってのは相当古いコンパイラにしか通用しない罠

315 名前:デフォルトの名無しさん :2005/12/09(金) 13:25:53
>>314
頼むからEffectiveC++に書かれている内容くらい理解してからレスしてください。

316 名前:デフォルトの名無しさん :2005/12/09(金) 13:53:56
>>315
Effective C++ のどこ? もし25項って言うつもりなら「いけない」と「べきじゃない」を混同してない?

317 名前:デフォルトの名無しさん :2005/12/09(金) 14:04:58
気持ち悪いなあNULL粘着厨は。

318 名前:デフォルトの名無しさん :2005/12/09(金) 14:22:05
突っ込まれて開き直ってるようにしか見えない件


まぁどっちゃでもいいんだけど

319 名前:デフォルトの名無しさん :2005/12/09(金) 14:29:04
おれはただ0をNULLと書いたら本質的にまずいケースがあったら教えてほしかっただけなんだけどなあ・・・

320 名前:デフォルトの名無しさん :2005/12/09(金) 14:37:58
>>319
C++の設計と進化P291〜
コンパイラの定義によっては、まずい事がある。

321 名前:デフォルトの名無しさん :2005/12/09(金) 14:40:42
大抵のC++コンパイラは、__cplusplus__マクロが定義されていると、
NULL を 0 と define してしまうようになっているから問題ない。

322 名前:デフォルトの名無しさん :2005/12/09(金) 15:00:25
「大抵のコンパイラでは大丈夫」というのは、このスレでは通用しないな

323 名前:デフォルトの名無しさん :2005/12/09(金) 15:04:53
こう言う時こそ規格書だな!

324 名前:デフォルトの名無しさん :2005/12/09(金) 15:05:05
>>320
スマソ、その本持ってないんだ。概要だけでいいので説明頼む。

325 名前:デフォルトの名無しさん :2005/12/09(金) 15:09:41
ISO/IEC 14882:2003
§18.1.4
The macro NULL is an implementation-defined C++ null pointer constant
in this International Standard.180)
180) Possible definitions include 0 and 0L, but not (void*)0.

326 名前:デフォルトの名無しさん :2005/12/09(金) 15:11:07
規格に準拠していないコンパイラにまで気を使いたくないものだな。

327 名前:デフォルトの名無しさん :2005/12/09(金) 15:11:15
>>324
>>320に書いてある事は>>325と同じ。
つまり、(void*)0はC++ではNULLには使えない。それだけ。

328 名前:324 :2005/12/09(金) 15:30:44
>>327
サンクス。でもそれは知ってるわ。
このレベルで規格に準拠してないような処理系について考えてたらキリが無さそうなので、
もうちょっと本質的な例がほしかった。それなりに仕様に準拠してやつでもヤバイような。

329 名前:デフォルトの名無しさん :2005/12/09(金) 15:48:55
>>326
そうそう。漢ならexportとかもガンガン使ってコーディングするよな。

330 名前:デフォルトの名無しさん :2005/12/09(金) 15:49:33
うん

331 名前:デフォルトの名無しさん :2005/12/09(金) 16:13:14
規格に準拠してても(void *) 0 が 0 とは限らないわけで。

332 名前:デフォルトの名無しさん :2005/12/09(金) 16:29:37
必死に

333 名前:デフォルトの名無しさん :2005/12/09(金) 16:38:21
気持ち悪いなあNULL粘着厨は。

334 名前:デフォルトの名無しさん :2005/12/09(金) 16:46:08
もういいじゃん、動けば。

335 名前:デフォルトの名無しさん :2005/12/09(金) 16:46:19
たのしいなあ、びっくりまうすわ

336 名前:デフォルトの名無しさん :2005/12/09(金) 17:06:06
気持ち悪いなあNULL粘着厨は。

337 名前:デフォルトの名無しさん :2005/12/09(金) 17:17:07
>>324
printf(fmt, 0, (char)0, (void*)0, (int*)0, (int(*)())0);

338 名前:デフォルトの名無しさん :2005/12/09(金) 17:32:57
NULL粘着厨きんもーっ☆

339 名前:デフォルトの名無しさん :2005/12/09(金) 17:42:06
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

340 名前:デフォルトの名無しさん :2005/12/09(金) 18:06:24
ヌルヌルヌメヌメ

341 名前:デフォルトの名無しさん :2005/12/09(金) 18:38:53
ヌルヌルヌルポッポ

342 名前:デフォルトの名無しさん :2005/12/09(金) 18:51:09
#if NULL!=0
#undef NULL
#define NULL 0
#endif

343 名前:デフォルトの名無しさん :2005/12/09(金) 19:02:45
>>342
include順によってはとんでもないことになりそうだな

344 名前:デフォルトの名無しさん :2005/12/09(金) 19:08:24
たとえば

345 名前:デフォルトの名無しさん :2005/12/09(金) 21:43:30
   ( ・∀・)   | | ガッ
  と    )    | | ミノガストオモッタカ
    Y /ノ    人
     / )    <  >__Λ∩
   _/し' //. V`Д´)/
  (_フ彡        /  ←>>341

346 名前:デフォルトの名無しさん :2005/12/09(金) 23:21:07
nullptrが早く標準化すればいいのにな。

347 名前:デフォルトの名無しさん :2005/12/10(土) 00:35:23
class F{
void f0(void);
void f1(int);
}f;

boost::functionでメンバ関数のクラスポインタを束縛した関数オブジェクトが
ほしいのですが、
boost::function0<void> ff0(メンバ関数ポインタ,クラスポインタ);
と書けないのはなぜなのでしょうか?
bind(&F::f0,&f)
bind(&F::f1,&f,_1)
とすればできるのですが、引数の数に応じて_1,_2,_3....としていかないと
いけません。
何か手はあるのでしょうか?

348 名前:デフォルトの名無しさん :2005/12/10(土) 00:58:28
>>347

>引数の数に応じて_1,_2,_3....としていかないと いけません。

それ以前に、引数の数が変わると function の型も変わります。
function0<void> f0(bind(&F::f1, &f));
function1<void, int> f1(bind(&F::f1, &f, _1));

だから、面倒くささは function のコンストラクタを
メンバ関数ポインタ等を受け取るように拡張しても結局変わらないと思います。

> boost::function0<void> ff0(メンバ関数ポインタ,クラスポインタ);
> と書けないのはなぜなのでしょうか?

この変換は boost::bind の仕事であって boost::function の仕事ではないと
boost の人たちが考えているからではないでしょうか。

349 名前:347 :2005/12/10(土) 02:16:34
>>348
なるほど。
Function<void(int)>という記法にこだわる限り
コンストラクタで受け取るまで型(クラス)がわからないから
メンバ変数にできないのからああいう仕組みになってるのかも。

Class<F>::Function<void(int)>という感じでクラス情報があれば
メンバ関数ポインタとクラスポインタをFunctionに持てるんだろうけど...。


350 名前:デフォルトの名無しさん :2005/12/10(土) 03:42:39
320見てぐぐってみたけど「ビョーン ストラウストラップ」って読むものなのか。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4797328541/249-0385649-2590737

351 名前:デフォルトの名無しさん :2005/12/10(土) 04:18:26
>>350
本人のHPに発音したWAVがあるよ。

352 名前:デフォルトの名無しさん :2005/12/10(土) 04:26:44
日本語では「は・げ」と発音するのが正解

353 名前:デフォルトの名無しさん :2005/12/10(土) 04:29:59
>>350
How do you pronounce "Bjarne Stroustrup?"
http://www.research.att.com/~bs/bs_faq.html#pronounce

上記のfaqで本人の発音も聞くことができる。
「ビョーン」より「ビャーネ」の方が近いと思う。
名前の後半部分は「スト *ラウ* ストラップ」より「スト *ル* ヴストルップ」の方が
英語圏では理解されやすいらしい。


354 名前:デフォルトの名無しさん :2005/12/10(土) 04:48:12
ビヨーンって、ほっぺたを左右に引っ張ったら、よく伸びそうだなw

355 名前:デフォルトの名無しさん :2005/12/10(土) 08:36:55
>>347
boost::mem_fn

356 名前:313 :2005/12/10(土) 11:18:19
NULLと0の議論で流されてしまった感があるので・・・
どうかご教授お願いします。

グローバルスコープに宣言した値型の変数は0に初期化されると教わりましたが、
この初期化タイミングはどうなるのでしょう。

-- a.cpp --
int a = 3;

-- b.cpp --
int b;

-- c.cpp --
int c = a;
int d = b;

という場合、

1. プログラムの起動時に a, b, c, d が 0 で初期化
2. a, c, d の代入による初期化が行われる (順序は不定)
3. c は 0 が入るか 3 が入るかわからない
4. d は必ず 0 が入る
5. プログラムのエントリポイントに入る

という認識で合っていますでしょうか?

357 名前:デフォルトの名無しさん :2005/12/10(土) 11:34:49
コンパイルエラー:c.pp 初期化値は定数でなければならない。

358 名前:デフォルトの名無しさん :2005/12/10(土) 12:18:37
グローバル変数の初期化順は不定じゃなかったっけ

359 名前:デフォルトの名無しさん :2005/12/10(土) 12:19:53
てか、a は 0で初期化はされないだろ。
3で初期化しているジャン。

360 名前:デフォルトの名無しさん :2005/12/10(土) 12:29:39
NULL粘着厨きんもーっ☆

361 名前:デフォルトの名無しさん :2005/12/10(土) 12:45:27
>356
(3.6.2) を厳密に解釈すると

1. a, b, c, d が 0 で初期化 (zero-initialization) される.
2. a が 3 で初期化される.
  ("static initialization" のうちの "constant expression" による初期化)
3. c, d がこの順で各々 a, b で初期化される.
  ("dynamic initialization".ただし実装は,この初期化をエントリポイント以降で
   真に初期化が必要とされる瞬間まで遅延することが許される)

になるかと思います.従って,c == 3 も保証されるかと思います.

362 名前:356 :2005/12/10(土) 13:29:57
レスありがとうございます

>>361
なるほど・・・
c が a に依存すると初期化が遅延される、といった仕組みがあるのですね

-- a.cpp --
std::list<int> istack;
int push() { istack.push(1); return istack.size(); }

-- b.cpp --
int b = push();

こんな感じ (b.cpp と同様のものが複数ある) のコードがあったのですが、
MSVC だと istack のサイズは 1 => 2 => 3 => 1 => 2
gcc だと istack のサイズは -127 => -126 => -125 => 1 => 2
といった具合で、内部的な依存があるとやはりまずいようですね

真っ先に 0 での初期化が入ることが規定されているのであれば、
istack をポインタにして対処できると思います。
勉強になりました。ありがとうございました。

363 名前:デフォルトの名無しさん :2005/12/10(土) 13:32:01
ああ、読み違えてました

依存を見ているのではなく、
dynamic initialization の前に static initialization があるから
c == 3 は確定するのですね・・・

364 名前:デフォルトの名無しさん :2005/12/11(日) 11:57:07
ある関数で、引数に与えられた文字列に応じて
switch-case文で、処理の割り振りをしようと思っているのですが
無論switchには、数値か文字定数しか使えないわけでして。。。
どなたか、if文での代用無しにこれを実現する方法がありましたら教えて下さい

365 名前:デフォルトの名無しさん :2005/12/11(日) 12:24:54
>>364
方法その1:std::map を使って文字列から関数ポインタまたはファンクタへ写像する。


366 名前:デフォルトの名無しさん :2005/12/11(日) 13:39:19
完全ハッシュ関数でswitch-case(またはテーブル)で分岐、それぞれのcaseで一回だけif文

367 名前:デフォルトの名無しさん :2005/12/11(日) 14:50:50
>>365,366 レスありがとうございます。
殆どが数行程度の処理の為、関数を作って飛ばさず
case文の中で処理しようと思っているので
>>366さんのやり方で、実装に取り掛かったのですが
case hash("aaa"): でもコンパイラに怒られます。。
「error C2051: case 式は、整数型定数でなければなりません。」
予め計算したテーブルを作るという手もありますが、、、どうにかならない物でしょうか

368 名前:デフォルトの名無しさん :2005/12/11(日) 15:23:58
>>367
>>366
> 予め計算したテーブルを作るという手
を意図したのだと思われ。

369 名前:デフォルトの名無しさん :2005/12/11(日) 15:31:23
>>367
自分で計算するのがいやならtemplateでやってしまえ

370 名前:デフォルトの名無しさん :2005/12/11(日) 15:52:50
>364
標準じゃないけどLoki::Factoryを使う

371 名前:デフォルトの名無しさん :2005/12/11(日) 15:55:19
>367
数行程度でも(処理に名前を付けるつもりで)関数にしてしまうのが吉。
最適化なんざコンパイラに任せるのがよろしいかと。

372 名前:デフォルトの名無しさん :2005/12/11(日) 16:17:51
>>368,369
ええ、イヤなのでtemplateについて調べてみています。
実行時に再帰的に定数部分を計算させる?というもので
ハッシュを計算させれば達成できそうですね。
>>370,371
仰るとおり関数にしてしまえば、文字列と関数ポインタをまとめた
構造体を作るだけで解決できるんですけどね。
どうしてもやってみたかったという事で・・・

373 名前:デフォルトの名無しさん :2005/12/11(日) 16:46:36
>>372
実行時じゃなくてコンパイル時ね

374 名前:デフォルトの名無しさん :2005/12/11(日) 21:42:06
レス頂いてからずっと試行錯誤してましたが中々至りません。。。
とりあえずハッシュ関数は簡単なもので、
Wikipediaのハッシュ関数というページにあるC言語で書かれた8行を
templateを用いてコンパイル時に計算させる関数に書き換えようとしています。
ぐぐると一番に出てきた、templateとenumを使い、コンパイル時に再帰的に
階乗を求めるやり方を参考に弄ってみていますが、
テンプレート引数には整数しか使えないとか、どうにも上手くいきません…
長々とすみませんが、案がありましたらもう一声頂ければと思います。

375 名前:デフォルトの名無しさん :2005/12/11(日) 21:46:14
ソースを晒した方が速くないか?

376 名前:デフォルトの名無しさん :2005/12/11(日) 21:56:27
いや、間違いなく、caseのラベルに変数(または関数)を使いたいという話だろ。
そして、それが出来ないから、
完全ハッシュ関数を作って、その値をラベルに使えということだと思うが
それを何とかマジックナンバーではなくしたいんだろう。

俺はそんな無茶しないで
素直にmapなりを使うべきだと思うが。

377 名前:デフォルトの名無しさん :2005/12/11(日) 22:02:05
うーん、、1からわからずに書いた動かないソースではどうしようも無いと思うので、
どのようなものを求めてるかをまとめます。
文字列(型は問いません)を受け取り、そのハッシュを作成し整数定数型で返す関数です。
"コンパイル時"に定数として埋め込まれる事を想定していることがポイントです。
できた関数は、enum { aaa = hash("aaa"), bbb = hash("bbb") } のような感じで使えることが理想なのですが…

ここまで書いたのですが、言いたい事は>>376さんのが全てです
無茶なのは承知の上ですが、ここまで来ると諦めが付かなくて。。

378 名前:デフォルトの名無しさん :2005/12/11(日) 22:02:55
>>376
そうしたくないケースもあるんだよね.速度気にする場合とか.
まあ,そういう時は string で渡すなとも思うけど・・・.

379 名前:デフォルトの名無しさん :2005/12/11(日) 22:07:44
非標準だがhash_mapみたいなものはだめか?

380 名前:デフォルトの名無しさん :2005/12/11(日) 22:15:15
>>379
混同するなって。
ハッシュ云々はコンパイル時にcaseの条件を定数にする話だよ。

381 名前:デフォルトの名無しさん :2005/12/11(日) 22:19:01
まあまあ。
mapなりhashなりを使って文字列->定数への表を作っておいて
その定数部分をcaseのラベルにするという意味だろ。

382 名前:デフォルトの名無しさん :2005/12/11(日) 22:45:36
switchでも文字列使えるよ

#include <stdio.h>

main()
{

char x[] = "bbbb";

switch(*((unsigned int*)x))
{
case 'aaaa':
printf("a*4");
break;
case 'bbbb':
printf("b*4");
break;
case 'cccc':
printf("c*4");
break;
}


383 名前:デフォルトの名無しさん :2005/12/11(日) 22:46:40
>>382
それはたまたまxがunsigned intのサイズと同じだったからでしょ?

384 名前:デフォルトの名無しさん :2005/12/11(日) 23:05:12
「文字列リテラルの置かれている先頭アドレス」と一致しているか判定しても・・・

385 名前:デフォルトの名無しさん :2005/12/11(日) 23:06:09
バカはD言語でも使っとけ

386 名前:デフォルトの名無しさん :2005/12/11(日) 23:07:55
>>382はバカだが>>384はただの低脳だな

387 名前:デフォルトの名無しさん :2005/12/11(日) 23:11:45
>>384は初心者未満

#include <stdio.h>
#include <string.h>

main()
{

char x[256] = "";
strcat(x, "aa");
strcat(x, "a");
strcat(x, "a");

switch(*((unsigned int*)x))
{
case 'aaaa':
printf("a*4");
break;
case 'bbbb':
printf("b*4");
break;
case 'cccc':
printf("c*4");
break;
}

}

388 名前:デフォルトの名無しさん :2005/12/11(日) 23:19:48
'abcd'がどういう扱いになるか、あるいはどういう数値になるかは
処理系依存なわけだが。

389 名前:デフォルトの名無しさん :2005/12/11(日) 23:21:03
違った。
'abcd'だけじゃなくて、'ab'がそもそも処理系依存だ。
もちろん'あ'とL'あ'も含めて。

390 名前:デフォルトの名無しさん :2005/12/11(日) 23:21:55
それ以前の問題

391 名前:デフォルトの名無しさん :2005/12/11(日) 23:23:55
あ、つまり、sizeof(int)が4だとしても
*(int *)"abcd" == 'abcd'
が成り立つとは限らないと言うこと。
もちろん、'abcd'が使われている時点で警告が出る処理系もある。

392 名前:デフォルトの名無しさん :2005/12/11(日) 23:27:45
つまる所、処理系依存な実装方法はやめろと

393 名前:デフォルトの名無しさん :2005/12/11(日) 23:47:52
>>389
えええ

L'あ'は平気だと信じてきたのに。

394 名前:デフォルトの名無しさん :2005/12/11(日) 23:51:44
'abcd' って gcc 拡張じゃなかったっけ?文字コードごにょごにょやった結果になった気がするんだけど。

395 名前:デフォルトの名無しさん :2005/12/11(日) 23:52:27
>374
そもそも文字列を定数式としてコンパイル時に評価すること自体できないんだから、
どうあがいても無理じゃね。

396 名前:デフォルトの名無しさん :2005/12/11(日) 23:52:42
違うよ

397 名前:デフォルトの名無しさん :2005/12/11(日) 23:53:41
>>395
それをやるトリックを教えれって話でしょ

398 名前:デフォルトの名無しさん :2005/12/12(月) 00:14:16
>>395
文字列自体を定数式にできないのなら、それをハッシュ数値にすればどうかという試みです。
templateでも何でもいいんですが、
コンパイル時にそのハッシュ値を計算させる事ができないものかと…

399 名前:デフォルトの名無しさん :2005/12/12(月) 00:15:07
なあ、なんでswitch文で文字列つかえないの?
マジでC++って糞だな

400 名前:デフォルトの名無しさん :2005/12/12(月) 00:17:28
なんかそういう事するプリプロ自作すれば?

401 名前:デフォルトの名無しさん :2005/12/12(月) 00:18:29
「文字列リテラルの置かれている先頭アドレス」
とカギカッコつきでディレクションしたにもかかわらず
バカ、低脳、初心者未満と罵られて超カワイソ・・・


402 名前:デフォルトの名無しさん :2005/12/12(月) 00:19:55
>>399
じゃあswitch文で文字列つかえる言語でコード吐いてみな。
if-elseif・・・のチェインに展開されてるから。

403 名前:デフォルトの名無しさん :2005/12/12(月) 00:46:18
>398
定数式でないものから定数式を作ることが無理だって解らない?

404 名前:デフォルトの名無しさん :2005/12/12(月) 01:25:32
>>399は初心者だが>>402は(ry

405 名前:デフォルトの名無しさん :2005/12/12(月) 01:27:37
>>402
そういう問題じゃないんだけど。
バカ?

406 名前:デフォルトの名無しさん :2005/12/12(月) 02:27:36
>402
switch文なんか使うなよ。

407 名前:デフォルトの名無しさん :2005/12/12(月) 07:33:08
>>402
とりあえずD言語が文字列のswitchが出来るから試してみた(gdc -S test.d)。
吐き出したアセンブリを見ると2分探索で目的の位置を探していて、
if elseのチェインなんて非効率な実装じゃなかったです。

408 名前:デフォルトの名無しさん :2005/12/12(月) 08:28:25
template< char c0 >
struct static_hash1 { static const unsigned int value = (0*137+c0)%1987; };
template< char c0, char c1 >
struct static_hash2 { static const unsigned int value = ((0*137+c0)*137+c1)%1987; };
template< char c0, char c1, char c2 >
struct static_hash3 { static const unsigned int value = (((0*134+c0)*137+c1)*137+c2)%1987; };
template< char c0, char c1 = 0, char c2 = 0 >
struct static_hash : static_hash3<c0,c1,c2> { };
template< char c0 >
struct static_hash<c0> : static_hash1<c0> { };
template< char c0, char c1 >
struct static_hash<c0,c1> : static_hash2<c0,c1> { };
int main() {
char const *s = "ef";
unsigned int v = dynamic_hash(s);
switch (v) {
case static_hash<'a','b','c'>::value:
std::cout << "abc" << std::endl;
break;
case static_hash<'e','f'>::value:
std::cout << "ef" << std::endl;
break;
default:
std::cout << "default" << std::endl;
}
}
めんどいと思ったらBOOST MPL辺りを検索

409 名前:デフォルトの名無しさん :2005/12/12(月) 08:47:35
個別の文字列定数を適当なハッシュ関数処理するテンプレートを
それぞれのcase文に埋め込めたとしても
完全ハッシュにするんだったら全文字列リテラルを受け取って
その何番目って感じでテンプレート引数つけて
毎回全部再実行するようなものになるんだろうな。
面倒すぎ

410 名前:デフォルトの名無しさん :2005/12/12(月) 09:57:54
>>402
C#(Microsoft(R) Visual C# .NET Compiler version 7.10.6001.4)でのテスト結果
選択肢が1〜7の場合:if〜else〜に展開
選択肢が8〜の場合:Hashtableを作成

411 名前:デフォルトの名無しさん :2005/12/12(月) 10:14:37
>>407
だから何だって言いたいんだろう・・・・スレ違いなんだが。

412 名前:デフォルトの名無しさん :2005/12/12(月) 10:23:17
>>411
まぁ、C++で同様の仕事を実現するのにどうすべきか考える参考には
なるんじゃない?

413 名前:デフォルトの名無しさん :2005/12/12(月) 13:11:11
>>412
結局map使えばいい話では

414 名前:デフォルトの名無しさん :2005/12/12(月) 15:04:44
話の流れ嫁

415 名前:デフォルトの名無しさん :2005/12/12(月) 15:28:11
>>413
いいえ。
>>377
>ここまで来ると諦めが付かなくて。。
こやつが諦めれば済む話です。

つか、
static const char* tbl[] = {
 "aaa", // =0
 "bbb", // =1
 "ccc", // =2
};
int idx
for (idx=0; idx<sizeof tbl / sizeof *tbl; idx++)
  if (strcmp(hoge, tbl[i]) == 0)
    break;
switch (idx) {
  case 0:
  case 1:
  case 2:
  else
}
もうこれでいいよ。

416 名前:デフォルトの名無しさん :2005/12/12(月) 15:59:22
つーか効率を犠牲にしてそこまでswitch文にこだわる理由が理解できん
むかし川で溺れてるところをswitch文に助けられたとかそんなのか?

417 名前:デフォルトの名無しさん :2005/12/12(月) 19:11:32
テクニカルな興味でしょ

418 名前:デフォルトの名無しさん :2005/12/12(月) 19:14:00
>>416
まともに動く static hash なら効率は犠牲どころか向上すると思うけど

419 名前:デフォルトの名無しさん :2005/12/12(月) 21:35:00
>>417
そういうこだわりが昔俺もあった。

で、結局、非効率極まりない処理をあれこれシコシコ弄り倒して
悩んでたって事に気づいた時は愕然としたものだよ

420 名前:デフォルトの名無しさん :2005/12/12(月) 21:42:02
>>419
それを乗り越えた奴だけが先に進める

421 名前:デフォルトの名無しさん :2005/12/12(月) 21:43:38
すぐ解答を求める姿勢より過程だよ

422 名前:デフォルトの名無しさん :2005/12/12(月) 22:02:36
「下手の考え休むに似たり」、との見極めが難しい(´・ω・)


ってか、「下手な考え〜」だと思ってたよ( ゚∀゚)'`,、'`,、

423 名前:デフォルトの名無しさん :2005/12/12(月) 23:19:23
>>419
そういうことに気付くのって結構重要な経験だと思うんだよね。
あれこれ試行錯誤することは、たとえ結果が失敗だとしても何もしないよりはずっといいよ。

424 名前:デフォルトの名無しさん :2005/12/13(火) 02:36:51
>>416
表記上の問題じゃない? 効率が少々犠牲になっても、表記がキレイになって
可読性・メンテナンス性が上がるなら選択肢としてありだと思うし。

あと、やっぱり抽象的なレベルで考えた時に switch な分岐を
コードに落とすときに if 列にせにゃならんってのはどうもすっきりせん。

425 名前:デフォルトの名無しさん :2005/12/13(火) 16:58:30
初歩的な質問すみません。

ハードディスクから読み込んだファイルに書いてある文字列を
配列に格納する方法がわかりません。

どなたかhelp me...


426 名前:デフォルトの名無しさん :2005/12/13(火) 17:00:55
ファイルポインタでいいやん。

427 名前:デフォルトの名無しさん :2005/12/13(火) 17:07:40
ファイルポインタやったときの授業でてなかった…
ファイルポインタの使い方がんばって勉強してみます!!

428 名前:デフォルトの名無しさん :2005/12/13(火) 17:25:08
伸びないなこいつは

429 名前:デフォルトの名無しさん :2005/12/13(火) 18:26:20
MCIを制御するのに(それとクラスの勉強)

class MCIControl
{
private:
char mciStrBuffer[1024];
public:
char filename[256];
MCIERROR errorcode;
int open()
{
wsprintf(mciStrBuffer,"open \"%s\" alias test",filename);
errorcode = mciSendString(mciStrBuffer,NULL,0,NULL);
return 0;
}
int play()
{
errorcode = mciSendString("play test",NULL,0,NULL);
return 0;
}
int close()
{
errorcode = mciSendString("close test",NULL,0,NULL);
return 0;
}
};

のようなクラスを作って、main関数より位置的に上に書いたときはいい(うまく動作した)んだが、
別ファイルにすると当然ながらクラスの存在を認識できない。
変数をexternするように、別ファイルのクラスを認識させるにはどうしたらいいの?

430 名前:デフォルトの名無しさん :2005/12/13(火) 18:51:41
普通にヘッダーに書いてインクルードじゃ駄目なの

431 名前:デフォルトの名無しさん :2005/12/13(火) 19:20:28
429がどういう勉強してるのか気になる

432 名前:デフォルトの名無しさん :2005/12/13(火) 19:27:44
つ[必殺コピペ]





誰を殺すかは言わずもがな

433 名前:デフォルトの名無しさん :2005/12/13(火) 19:35:57
なんで、関数の戻り値をintにしているのに
必ず0を返すんだ・・・
エラーコードを返さないでどうするw

434 名前:デフォルトの名無しさん :2005/12/13(火) 19:41:52
>>432
おいおい、マジでその提案はやめてくれよ。
三年ほど前に、とりあえずコピペし、include順などで名前が衝突したら
関数名の末尾に1や2や_newをつけて解決すればいいと豪語した奴がいる。
もちろん、効率(インライン展開の促進など)とは関係なく、な。
この考えを、Cどころかプログラムを知らないボスが承認してしまい
今みんなそのツケを払わされてる

435 名前:デフォルトの名無しさん :2005/12/13(火) 20:02:52
IHTMLDocument
IHTMLDocument2
IHTMLDocument3
‥‥‥
なんて名前付けてるOSがある件について⊂(。Д。⊂⌒`つ

436 名前:デフォルトの名無しさん :2005/12/13(火) 20:07:33
とりあえず拡張したら末尾にEx付けるのは基本だな。

437 名前:デフォルトの名無しさん :2005/12/13(火) 20:19:28
クラスのヘッダの作り方がわからん…

>>429のソースをmcictrl.cppに移動して、
mcictrl.hにclass MCIControl;とだけ書いてmain.cppからインクルードしても変化なかった。

もしかして
private:
char mciStrBuffer[1024];
public:
char filename[256];
MCIERROR errorcode;
int open();
int play();
int close();
の部分だけmcictrl.hに移動して、mcictrl.cppの中に、
int MCIControl::open()
{
wsprintf(mciStrBuffer,"open \"%s\" alias test",filename);
errorcode = mciSendString(mciStrBuffer,NULL,0,NULL);
return 0;
}
というようにすればいいのだろうか?


438 名前:デフォルトの名無しさん :2005/12/13(火) 20:19:59
COMインターフェースの場合むしろそれ普通じゃね?

439 名前:429 :2005/12/13(火) 20:41:10
さっき>>437に書いた方法をやってみたらうまくいったのでそれだけ報告しておく。

440 名前:デフォルトの名無しさん :2005/12/13(火) 20:51:34
>>436
さらに拡張したらどうなります?

441 名前:デフォルトの名無しさん :2005/12/13(火) 20:55:39
CreateFileExTurboDashPlus2

442 名前:デフォルトの名無しさん :2005/12/13(火) 21:24:25
ストUじゃないんだから

443 名前:デフォルトの名無しさん :2005/12/16(金) 13:32:03
静かだ

444 名前:ハーピィ :2005/12/17(土) 18:44:57
E・∇・ヨノシ <444ゲット♫

445 名前:デフォルトの名無しさん :2005/12/19(月) 19:50:48
素朴な疑問ですが、
C++で書かれた一番有名なソフトウェアってなんですか?

Linux?

446 名前:デフォルトの名無しさん :2005/12/19(月) 20:05:26
Windows

447 名前:デフォルトの名無しさん :2005/12/19(月) 20:13:28
へー。
有名なゲーム部門?も知りたいお。


448 名前:デフォルトの名無しさん :2005/12/19(月) 20:14:18
だいたいC++

449 名前:デフォルトの名無しさん :2005/12/19(月) 20:19:09
>>445
ttp://www.research.att.com/~bs/applications.html

ざっと目を通すと

Adobe 製品のほとんど、Amazon のシステム、google、
Mars rover driving system(多分ご本尊の方)、
Windows、MSOffice、Winamp、HotSpot Java VM、
OpenOffice、CDE、KDE、SETI@Home

「一番有名」なのはやっぱWindowsかな…。


450 名前:デフォルトの名無しさん :2005/12/19(月) 20:29:04
>>449

こんなページあるんすか。すげー。
ちなみにLinuxは書いてないけど、どうなの?

451 名前:デフォルトの名無しさん :2005/12/19(月) 21:03:16
unixのシステムプログラムはだいたいCじゃないかな。
手元のLinux-2.4.27のソースコードは、ぱっと見た感じC(≠C++)。


452 名前:デフォルトの名無しさん :2005/12/19(月) 21:10:09
ぱっと見じゃなくてCとアセンブラ

453 名前:デフォルトの名無しさん :2005/12/19(月) 22:02:53
OSのカーネルからC++を使おうってのはMonaOSがやってたな

454 名前:デフォルトの名無しさん :2005/12/19(月) 23:32:26
組み込みもC++が多いと聞いたことがある。


455 名前:デフォルトの名無しさん :2005/12/20(火) 13:19:03
シリアライズの実装についてわかりやすく説明したサイトありませんか?
socketでデータ通信したいのですが、構造体をパックして送る方法は柔軟性が無いので
シリアライズ化したいと思っています。

456 名前:デフォルトの名無しさん :2005/12/20(火) 13:23:14
シリアライズするよりも、テキスト化したほうが安全な希ガス。
つーか、シリアライズって汎用性あったっけ?

457 名前:デフォルトの名無しさん :2005/12/20(火) 13:28:57
データのフォーマットがもう決まってしまってるので
テキスト化できないのです。
私も、テキスト化して、できればXMLか何かで送りたかったのですが、
所詮、プログラマなのでSEに逆らえません。

458 名前:デフォルトの名無しさん :2005/12/20(火) 13:36:15
>>457
MIMEエンコードで。つーか、SEは転送内容まで設計していないの?
#だとしたら無能だ。
あ、余り続くとスレ違いなので適当に。
そもそもバイナリ転送で設計されているならバッファに構造体からmemcpy()、
何も設計されてないならMIMEなりヘキサダンプなりでテキスト化が無難かと。
#ネットワークプログラミングスレ向きかな? 私は見てないのだけど。

459 名前:デフォルトの名無しさん :2005/12/20(火) 13:42:51
>>458
回答ありがとうございます
ちょっとそこら辺のキーワードで調べてみます。

460 名前:デフォルトの名無しさん :2005/12/20(火) 14:39:16
>>458
シリアライズとネットワークは直接関係は無いでしょ。
ファイルに書いて読んで同じ意味のオブジェクトが出来ればいいんだし、
後はそれを送受信すればいいだけ。

memcpy()ってポインタはどうすんのさ?


461 名前:デフォルトの名無しさん :2005/12/20(火) 14:46:29
>>460
>ファイルに書いて読んで同じ意味のオブジェクトが出来ればいいんだし
シリアライズに汎用性があるならそれでもいいかと。

>memcpy()ってポインタはどうすんのさ?
んなもん、適切にポイント先をコピーすればいいべさ。

要は、オブジェクトの型情報までは送る必要がないでしょ、と。

462 名前:デフォルトの名無しさん :2005/12/20(火) 14:49:15
ちょっと調べてみましたが、MIMEエンコードって関係無いような気がするんですが。
MIMEってバイナリのテキスト化ですよね?
データの構造が決まっていて、構造体をパックして送っていたのを、
シリアライズ化し、送りたいのですが。

データの種類が増えるといちいち構造体を何百個も作るわけには
いかないのでシリアライズ化したいのです。

463 名前:デフォルトの名無しさん :2005/12/20(火) 14:53:00
ここいらなんかは?
ttp://www.s34.co.jp/cpptechdoc/article/serialize/

464 名前:デフォルトの名無しさん :2005/12/20(火) 14:56:12
>>463
ありがとうございます!大変わかりやすいです。

465 名前:デフォルトの名無しさん :2005/12/20(火) 15:39:12
>>455
boost::serializationはいいかも


466 名前:デフォルトの名無しさん :2005/12/21(水) 00:03:31
iostream で、一度セットしたらずっと有効なフィールド幅設定マニピュレータはありませんか。
下のようにしても、最初の出力だけが5幅で、2つ目からは元に戻ってしまうのですが。

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
  cout << hex << setfill('0') << setw(5);
  //cout.width(5);     // これでもだめ。
  cout << 10 << endl;
  cout << 20 << endl;
  cout << 30 << endl;
}

467 名前:デフォルトの名無しさん :2005/12/21(水) 01:04:41
>>466
widthだけは元に戻るのよん。諦めましょう。

468 名前:デフォルトの名無しさん :2005/12/21(水) 03:31:28
↓そこでboost云々

469 名前:デフォルトの名無しさん :2005/12/21(水) 06:05:51
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-12-19: The 2005-12 mailing is available (1600 kb tar.gz, .zip 1600 kb) individual papers
News 2005-12-17: The C++ Standard Library Issues List (Revision 40) is available (.tar.gz)
News 2005-12-17: C++ Standard Core Language Issues List (Revision 39) is available, also committee version

470 名前:デフォルトの名無しさん :2005/12/21(水) 10:29:39
うげっ、std::string<>もメモリ上の連続性を仮定するようになるのかよ。

471 名前:デフォルトの名無しさん :2005/12/21(水) 10:50:27
std::string<>

472 名前:デフォルトの名無しさん :2005/12/21(水) 13:04:51
std::string<int> hoge = "ひゃっほい";

473 名前:デフォルトの名無しさん :2005/12/21(水) 19:19:17
std::basic_string<>だった…

474 名前:デフォルトの名無しさん :2005/12/21(水) 19:58:05
string x(50);
strcpy(&x[0], "あいうえお");
strcat(&x[0], "かきくけこ");

475 名前:デフォルトの名無しさん :2005/12/22(木) 09:28:35
残念ながらそれは駄目だ

std::vector<char> ならOKなんだけどな

476 名前:デフォルトの名無しさん :2005/12/22(木) 09:31:48
>>475
>469 からの流れをよく読もうな。

477 名前:デフォルトの名無しさん :2005/12/22(木) 10:25:58
流れからするとそうだけど
一発で変換できるから一応
std::string s(vect.begin(), vect.end())

478 名前:デフォルトの名無しさん :2005/12/22(木) 18:13:57
class hg{
public:
void foo(void);
};

void main(void){
hg laser[10];
};

とかやると、メンバ関数foo()は10個、メモリに展開されるの?

479 名前:デフォルトの名無しさん :2005/12/22(木) 18:16:10
されない。

非仮想メンバ関数は、普通、this引数を余計に持つだけの通常の関数としてコンパイルされる。

480 名前:478 :2005/12/22(木) 18:17:30
>>479
サンクスコ!!

481 名前:デフォルトの名無しさん :2005/12/22(木) 18:39:12
教えてください。

私はVB6とVB.net2003の経験しかありません。
C言語関連を学ぶには、Cから初めてC++に移行すべきでしょうか?
いきなりC++は無理ですか?
また、もうひとつ教えてほしいのですが、
Cと比べてC++は、どのような恩恵があるのですか?

私の知人からはCを薦められています。
たしかにCは基礎知識として必要だと思います。
C++の利点とか開発のしやすさとか、ありますか?

482 名前:デフォルトの名無しさん :2005/12/22(木) 19:09:49
>>481
プログラムとしての本質を学びたいならC++やると良いよ。面白い。
VBはGUIアプリに関しては楽といえば楽だし、それが仕事なら無理して覚える事も無いと思います。
開発で覚える必要があるなら、早いうちに覚えた方が楽ですね。

ちなみに、C・・・サブルーチンを関数としてまとめる事ができる、ポインタで変数の値を直接書き換えられる
C++・・・Cをオブジェクト指向にしたようなもの
大雑把杉ですが自分はこういう認識です。

483 名前:481 :2005/12/22(木) 19:32:27
>>492
ご回答感謝します。
C++とはオブジェクト指向の面がプラス点なのですね。
ありがとうございます。

484 名前:481 :2005/12/22(木) 19:39:59
>>483
>>492>>482の間違いでした。すみません。

485 名前:デフォルトの名無しさん :2005/12/22(木) 19:49:54
>>483
C++のCに対するメリット。
・型の拘束が強い。
・クラスを作れる。
・テンプレートを使える。
・演算子オーバーロードができる。

って書いてもよく判らんだろうから具体的に言うと、
間違いを指摘してくれるチャンスが増えてオブジェクト指向プログラミングができて
同じようなことを何度も書く(或いはコピペを繰り返す)ことを避けたプログラミングができる。
まぁ、やってみろ。いいものだ。

486 名前:デフォルトの名無しさん :2005/12/22(木) 20:59:42
>>481
むしろいきなりC++から初めてあとからCの制限の中でやってみることを
お勧め。色々工夫するからCの範囲の中でもかなり工夫する能力が上がる。

487 名前:486 :2005/12/22(木) 21:00:29
訂正:初めて→始めて

488 名前:デフォルトの名無しさん :2005/12/22(木) 23:48:12
入門書を読んでいて、const をメンバ関数に付けると
const でクラス変数を宣言しても呼ぶことが出来るようになる事を知りました。

もしかして、ゲッターメソッドにconstを付けるのは常識だったりします?
また、データリードしか行わないメンバ関数には
constをなるべく付けた方が良いのでしょうか?

489 名前:デフォルトの名無しさん :2005/12/22(木) 23:52:07
そうです

490 名前:デフォルトの名無しさん :2005/12/22(木) 23:52:16
struct A { /* 〜 */ };
struct B { /* 〜 */ };

struct C
{
 A func()
 {
  B b;
  return a_;
 }

 A a_;
};

C::funcで、bのデストラクタはa_の戻り値コピーの後に行われました。
この順番は保証されているのでしょうか?

491 名前:488 :2005/12/22(木) 23:58:25
>>489
そうですか  ありがとうございます

作ったクラス書き換えなきゃ orz

492 名前:デフォルトの名無しさん :2005/12/23(金) 00:46:32
enum HOGE {
 A, B, C, D, E
};
とした時に、HOGEに含まれる列挙子の数(=5)を
HOGEを後で変更しても支障が無いように求める事はできますか?

493 名前:デフォルトの名無しさん :2005/12/23(金) 00:48:16
enum HOGE {
 A, B, C, D, E, END_OF_NUM
};

494 名前:デフォルトの名無しさん :2005/12/23(金) 00:49:01
END_OF_HOGE だった。
まぁ、なんでもいいんだけど。

495 名前:デフォルトの名無しさん :2005/12/23(金) 00:59:57
あああ、なるほど。
ありがとうございました。

496 名前:デフォルトの名無しさん :2005/12/23(金) 01:00:51
[hoge.csv]
A, B, C, D=100, E=200,

enum HOGE {
#include "hoge.csv"
};

const int HOGE_ARRAY[] = {
#include "hoge.csv"
};

const int HOGE_NUM = sizeof(HOGE_ARRAY)/sizeof(HOGE_ARRAY[0]);

...自分で書いてても、ちょっとどうかと思った。

497 名前:デフォルトの名無しさん :2005/12/23(金) 05:13:22
>>490
イエス。スコープ抜けたあとに解体処理が走る。

あと、structをclassの代わりに使うのはお勧めしない
(struct使うと、明示的にprivate指定しないと変数も関数も
フルオープンなので)。

498 名前:デフォルトの名無しさん :2005/12/23(金) 10:39:27
>>497
ありがとう。冷静に考えたらそうですよね。

>structをclassの代わりに使うのはお勧めしない
カキコするときpublic:を書くのが面倒くさくてstructにしました。
その辺は心得ています。

499 名前:デフォルトの名無しさん :2005/12/23(金) 12:03:44
ModernC++を読みこなすために読んでおいたほうがいい
テンプレートメタプログラミングを扱った本はないでしょうか?

500 名前:デフォルトの名無しさん :2005/12/23(金) 23:07:22
C++ Templates


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.