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


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

C++相談室 part46
251 名前:デフォルトの名無しさん :2006/01/22(日) 02:00:57
(B.h)
class B
{

};

(B.cpp)
#include "B.h"

(C.h)
#include "B.h"

extern B b;

class C
{

};

(C.cpp)
#include "C.h"

B b;

252 名前:デフォルトの名無しさん :2006/01/22(日) 02:04:01
a.cpp もしくは c.cpp の B b; をどっちか消せよw

253 名前:デフォルトの名無しさん :2006/01/22(日) 02:04:14
>>250
Bのクラス宣言だけをB.hppに残して、定義をB.cppに移動する。

254 名前:デフォルトの名無しさん :2006/01/22(日) 02:06:25
汎用的に使いたいってことなら、
a.cpp と c.cpp から B b; を消して b.cpp に書いて、
a.h と c.h から extern B b; を消して b.h に書いとけ。

255 名前:デフォルトの名無しさん :2006/01/22(日) 02:12:42
何もかもが間違っている気がする。

256 名前:250 :2006/01/22(日) 03:17:32
>>252
(B.h)
class B {
public:
int hoge;
};
(C.h)
#include "B.h"
extern B b;
class C {
public:
void func();
};
(A.cpp)
#include "A.h"
//B b;
int main() {
b.hoge;
return 0;
}
(C.cpp)
#include "C.h"
B b;
void C::func() {
b.hoge;
}
これで使い方合ってるでしょうか?

257 名前:250 :2006/01/22(日) 03:19:03
>>253
(B.h)
class B {
};
(B.cpp)
#include "B.h"
B b;
こうですか?

>>254
error C2146: 構文エラー : ';' が、識別子 'b' の前に必要です。
fatal error C1004: 予期せぬ EOF が検出されました。
コンパイルエラーになりました。

258 名前:デフォルトの名無しさん :2006/01/22(日) 03:23:31
#include "stdafx.h"

あと氏ね。

259 名前:デフォルトの名無しさん :2006/01/22(日) 03:34:37
パブロフの犬を思い出した

260 名前:デフォルトの名無しさん :2006/01/22(日) 03:50:39
>>258
言葉が悪いな。それで教えているつもりか。
まぁヒントにすらなっていないが、
うむごくろう。

261 名前:デフォルトの名無しさん :2006/01/22(日) 05:13:09
短気は損気。
気長にマターリ…ねみぃ。。。

262 名前:デフォルトの名無しさん :2006/01/22(日) 05:24:47
次期バージョンのC++では、
list<list<int>> l;
と>>の間にスペース入れなくてよくなりそうな感じだね。

263 名前:デフォルトの名無しさん :2006/01/22(日) 07:58:00
禿もそうしたいってD&Eに書いてたね

264 名前:デフォルトの名無しさん :2006/01/22(日) 08:06:40
>>262 逆になんで今はスペース入れなきゃならないのか、理由がわからない。

265 名前:デフォルトの名無しさん :2006/01/22(日) 08:15:54
構文解析上の都合

266 名前:デフォルトの名無しさん :2006/01/22(日) 08:23:47
空白が入ってないと、パーサが混乱するんだろうか。

267 名前:デフォルトの名無しさん :2006/01/22(日) 08:24:57
レキサは基本的に最長一致だから、構文解析の情報を持たせないと
>>を1つのトークンと見なしちゃう

268 名前:デフォルトの名無しさん :2006/01/22(日) 08:33:59
じゃ、古典的な lex & yacc なんかじゃ
パースできないってことか。
現代のコンパイラはレキシカルアナライザが分離してないのが当たり前?

269 名前:デフォルトの名無しさん :2006/01/22(日) 09:15:03
質問です
1万桁とかの計算はどうするんですか?
型宣言でlong doubleまでは掛け算割り算できるけどそれ以上の仕方が分かりません
そこら辺も自作しないといけないんですk?

270 名前:デフォルトの名無しさん :2006/01/22(日) 09:18:49
多倍長演算
自作するなりそこらに落ちてるライブラリを使うなりご自由に

271 名前:デフォルトの名無しさん :2006/01/22(日) 09:21:42
>>270 有名どころっていえばなんでしょうか?
GNU多倍長整数ライブラリですか?

272 名前:デフォルトの名無しさん :2006/01/22(日) 09:23:47
って、>>269 は実数演算がしたいみたいだから、
GNU MP ライブラリでいいのか。

273 名前:デフォルトの名無しさん :2006/01/22(日) 09:23:58
個人的にはboost::bigintに期待してたり

274 名前:デフォルトの名無しさん :2006/01/22(日) 13:33:42
少なくとも g++ と cl.exe は予約語 export をさっさとサポートしる。
話はそれからだ。

275 名前:デフォルトの名無しさん :2006/01/22(日) 14:10:23
>>274
exportはサポートしなくても標準に合致している事が保証されたから、
それはなかなか難しいだろう。

276 名前:デフォルトの名無しさん :2006/01/22(日) 16:53:40
>>275
それソースプリーズ

277 名前:デフォルトの名無しさん :2006/01/22(日) 18:36:00
メンバー関数(func1, func2関数)のポインタをvectorに登録して(Init関数)、
callFunc関数で登録した関数をコールしたいのですが、以下のエラーで
コンパイルできません。コールの方法が間違っていますでしょうか?

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
func.cpp:
エラー E2314 func.cpp 49: 関数でないものを呼び出している(関数 Func::callFunc(st ::string) )
*** 1 errors in Compile ***

-- ここから --
class Func {
public:
void Init();
int callFunc(std::string);
private:
typedef int (Func::*PFUNC)(std::string);
std::vector<PFUNC> funcs;
int index;
int func1(std::string);
int func2(std::string);
};


278 名前:デフォルトの名無しさん :2006/01/22(日) 18:36:37
続きです。

void Func::Init()
{
funcs.push_back(&Func::func1);
funcs.push_back(&Func::func2);
index=0;
}

int Func::func1(std::string str)
{
std::cout << "This is func1: " << str << "\n";
return 1;
}

int Func::func2(std::string str)
{
std::cout << "This is func2: " << str << "\n";
return 2;
}

int Func::callFunc(std::string str)
{
PFUNC pf = funcs[index++];
return (&pf)(str); // ここでエラー
}


279 名前:デフォルトの名無しさん :2006/01/22(日) 18:45:50
>>277
メンバ関数のポインタから関数呼び出しをするには、演算子 ->* または .* を使う。

> typedef int (Func::*PFUNC)(std::string);
この typedef ができるのに呼び出し方がわからないってのは、不思議な感じだな。

280 名前:デフォルトの名無しさん :2006/01/22(日) 18:56:29
>>279
ありがとうございます。277ですが、C言語は知っているので、
typedefはなんとなくわかっているつもりですが・・・。

>メンバ関数のポインタから関数呼び出しをするには、演算子 ->* または .* を使う。

すみません、具体的にどのように変更すればよいということですしょうか?
return (&pf)(str);を変更するということですよね?



281 名前:デフォルトの名無しさん :2006/01/22(日) 19:02:35
>>280
ちっとは調べてから訊こうな。
http://www.google.co.jp/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0+%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF+%E6%BC%94%E7%AE%97%E5%AD%90

282 名前:デフォルトの名無しさん :2006/01/22(日) 19:07:26
>>281
すみません、君らと違って暇じゃないもので・・・

283 名前:デフォルトの名無しさん :2006/01/22(日) 19:09:07
前方イテレータの方がランダムアクセスイテレータよりスピードやメモリ使用量が優れているとおっしゃるのですか?

284 名前:デフォルトの名無しさん :2006/01/22(日) 19:11:35
>>281
コンパイルできますた。
return (this->*pf)(str);
でした。


285 名前:デフォルトの名無しさん :2006/01/22(日) 19:27:40
>>283 誰もそんなこと言ってないんじゃないかな。

286 名前:デフォルトの名無しさん :2006/01/22(日) 22:40:10
>>282
暇じゃないなら2chに書き込んで都合のいい回答を待つより
自分で調べた方がいいと思う。絶望的に調べ物が下手とかでないなら。

287 名前:デフォルトの名無しさん :2006/01/22(日) 22:49:30
>>280
禿本くらい読めアフォ

288 名前:デフォルトの名無しさん :2006/01/22(日) 23:06:16
だから禿禿言うなって何回も言ってるだろ!
いい加減起こるぞほんとに

289 名前:デフォルトの名無しさん :2006/01/22(日) 23:49:37
何が起こるんだろうか…もしや禿(ry

290 名前:デフォルトの名無しさん :2006/01/23(月) 00:10:53
>>287
禿本なんてよまねーよ、カス

291 名前:デフォルトの名無しさん :2006/01/23(月) 00:14:03
>>290 そんなこと言うとあなた、禿が起こりますよ。

292 名前:デフォルトの名無しさん :2006/01/23(月) 04:21:23
禿の頭舐めたい

293 名前:デフォルトの名無しさん :2006/01/23(月) 09:20:54
甘酸っぱいよ

294 名前:デフォルトの名無しさん :2006/01/23(月) 09:28:13
プログラミング言語C++:第3版の「7.7関数ポインタ」とかは
四段ですが。別のところに載ってますか?


295 名前:デフォルトの名無しさん :2006/01/23(月) 09:56:35
規格書読めや禿げ

296 名前:デフォルトの名無しさん :2006/01/23(月) 10:45:51
>>294
15.5

297 名前:デフォルトの名無しさん :2006/01/23(月) 11:50:47
>>295
おっしゃる通りです。
読んで来ます。

>>296
禿しくThanXです。


298 名前:Stroustrup :2006/01/23(月) 12:00:09
(;`Д´)・・・・・

299 名前:デフォルトの名無しさん :2006/01/23(月) 14:27:42
規格、お題目、並べ立てるやつは口先だけの場合が多い

300 名前:デフォルトの名無しさん :2006/01/23(月) 17:14:37
>>299
お前も口先だけじゃないか。

301 名前:デフォルトの名無しさん :2006/01/23(月) 19:48:36

「禿本読め、コンパイラのマニュアル読め、コード読め。」
これらは相談スレ的には酷すぎんか?

「入門書読め」ならわかるが。



302 名前:デフォルトの名無しさん :2006/01/23(月) 19:57:40
>>301
そうだね、あんまり禿、禿、言うのはかわいそう。

303 名前:デフォルトの名無しさん :2006/01/23(月) 20:00:59
>>301
禿本は我慢して読むだけの価値があると教えているわけだが?
使い方1つで原価の1万倍くらい当たる本だぞ

304 名前:デフォルトの名無しさん :2006/01/23(月) 21:13:35
正直、禿本も読まないでコード書いてるようなヤシとは仕事したくない。
集中して読めば一週間で読了できるのに。理解が進むのはさらに後だとしても。

305 名前:デフォルトの名無しさん :2006/01/23(月) 21:25:56
禿本を集中して一週間で読ませるようなヤツもどうかと思うがなw

306 名前:デフォルトの名無しさん :2006/01/23(月) 21:26:13
読了しただけで意味あるような禿本なんてあったっけ?

307 名前:デフォルトの名無しさん :2006/01/23(月) 21:35:16
>>300
なんだと、おれはちゃんと金もらうだけのことをやってるぞ!

308 名前:デフォルトの名無しさん :2006/01/23(月) 21:37:13
>>307
でも、もらってないんだろ? 満額

309 名前:デフォルトの名無しさん :2006/01/23(月) 21:40:10
禿本高杉

310 名前:デフォルトの名無しさん :2006/01/23(月) 21:46:26
このスレがお笑いスレになっている件について。

311 名前:デフォルトの名無しさん :2006/01/23(月) 22:39:51
もったいぶってる奴が多いな

312 名前:デフォルトの名無しさん :2006/01/23(月) 23:06:07
C++の本で邦人の著者は柏原正三の一人勝ちなんじゃないかのお。

313 名前:デフォルトの名無しさん :2006/01/23(月) 23:16:19
>>312
(゚Д゚)ハァ?

314 名前:デフォルトの名無しさん :2006/01/23(月) 23:52:03
>>308
もらってますが何か?

315 名前:デフォルトの名無しさん :2006/01/24(火) 00:24:47
なにこのスレ

316 名前:デフォルトの名無しさん :2006/01/24(火) 09:26:41
僕の禿本は湿気を吸ってなんだかペラペラになってます


317 名前:デフォルトの名無しさん :2006/01/25(水) 08:57:53
2000にspecial editionなんてのが出てるけど、
あれは何か新しいことが書いてあるの?

318 名前:デフォルトの名無しさん :2006/01/25(水) 12:42:18
>>317
http://public.research.att.com/~bs/bs_faq.html#SE

ハードカバーになり、その分値段が上がったこと以外の違いはない。
ただし、3rd ed.の初刷からは、記述ミスの修正が1000以上なされている。


319 名前:デフォルトの名無しさん :2006/01/25(水) 12:58:51
>>318
残念ながら不正解。直後の、
「As a heavy C++ user, I find that significant. There are also the two new appendices (just over 100 pages; available for download: Locales and Standard-Library Exception Safety).」
を見落としている。まぁダウンロードできるものだが。

320 名前:デフォルトの名無しさん :2006/01/25(水) 13:23:24
>>316
俺の禿本は持ちすぎて表紙が溶けかかってる

321 名前:デフォルトの名無しさん :2006/01/25(水) 20:04:09
Cだとリスト構造を作るために、構造体に自分と同じ型のポインタの
prevやnextといったメンバを持たせたりするけど、C++の場合は
全てvectorやlistで管理するんですか?

322 名前:デフォルトの名無しさん :2006/01/25(水) 20:08:05
>>321
Cスタイルで書きたければCスタイルで書けばいい話じゃ?

323 名前:デフォルトの名無しさん :2006/01/25(水) 20:23:33
>>321 まぁそういう便利なクラスライブラリがあるから、
自分でわざわざ作る必要はないけど、
特殊なデータの保持の仕方をしたければ
自分で作ればいいんじゃない?

324 名前:デフォルトの名無しさん :2006/01/25(水) 20:28:45
けど基本的にSTLでできることはSTLでするってのが道理だろうな
STLの奴は全部、ある程度以上のパフォーマンスを出せることが
保証されてるわけだし

325 名前:デフォルトの名無しさん :2006/01/25(水) 20:29:30
自分で書くメリットがまったくない。
STLを使うと
・素晴らしいアルゴリズムの恩恵を受けられる
・STLは世界共通
・例外安全
・速い
・メモリ領域に関して無駄に悩む必要がなくなる

他にもいろいろあるだろう。
自分で直線的なリスト形式を実装するのは、
Chain Of Responsivilityのときくらい。


326 名前:デフォルトの名無しさん :2006/01/25(水) 20:38:44
速いかどうかは微妙だなぁ。
カリカリにチューンするならSTLは使わないけど。

327 名前:デフォルトの名無しさん :2006/01/25(水) 20:55:26
STL 多少の非効率はあるよね。
例えばリストなど、新規ノードの追加で必ずコピーコンストラクタが呼ばれる。
ポインタ型にすれば解決できるが、参照とサイズが無駄になる。



328 名前:デフォルトの名無しさん :2006/01/25(水) 20:57:52
>>327 もうその辺は気にせず、boost::shared_ptr を食わせたりしてる。
マジでかりかりにチューンが必要な場合は、
スクラッチからコンテナを書くな。

最近コンテナ書いたのって、歯抜けを許すリングバッファかなぁ。

329 名前:デフォルトの名無しさん :2006/01/25(水) 21:00:48
STLのスタイルがどうにも合わない

330 名前:デフォルトの名無しさん :2006/01/25(水) 21:03:34
>>329
マンコをチンポに合わせるんじゃない。
チンポをマンコに合わせるんだ。

331 名前:デフォルトの名無しさん :2006/01/25(水) 23:55:08
ネストしたクラスなんですが

class A
{
private:
 typedef int Hoge;
 static Hoge aaa;
public:
 class B
 {
 public:
  B() { Hoge i = A::aaa; }
 };
};

A::BがAのプライベートメンバにアクセスしても怒られないのですが
これは暗黙に friend class B; が宣言されると解釈していいのでしょうか?

332 名前:デフォルトの名無しさん :2006/01/26(木) 00:00:37
>>331
フレンドとは別物。

333 名前:デフォルトの名無しさん :2006/01/26(木) 00:08:50
>>331
いや、おかしいと思うぜ
C++ の規格では ill-formed でも診断メッセージの出力は義務づけないとされているケースが多いから
もしかして・・・とは思うが、それは自分で調べれ

334 名前:デフォルトの名無しさん :2006/01/26(木) 00:12:06
>>331
BはAのメンバなのだからAのprivateメンバにアクセスできて当然。
class Aの中に書いたものはネストしたクラスでも何でも全てAのメンバ。

335 名前:デフォルトの名無しさん :2006/01/26(木) 00:15:41
メンバが static だからだろ

336 名前:デフォルトの名無しさん :2006/01/26(木) 00:25:11
C++とフリーのDBでO/Rマッピングできるフリーのライブラリを教えて下さい。

337 名前:デフォルトの名無しさん :2006/01/26(木) 00:33:29
>>335
class A
{
private:
 int i;
public:
 class B
 {
 public:
  B()
  {
   A a;
   a.i = 0;
  }
 };
};

なんてのも通りました。コンパイラはVC++2003です。

338 名前:デフォルトの名無しさん :2006/01/26(木) 01:08:09
>>337
>A a;
>a.i = 0;
インスタンス化したらコンパイルされるのはあたりまえ。

339 名前:デフォルトの名無しさん :2006/01/26(木) 01:28:47
>>331
defect report でアクセスできるように決まった。
そんなわけで古いコンパイラだとアクセスできない。

なんか今 open-std.org が見れないんではっきりソースは出せない。

340 名前:デフォルトの名無しさん :2006/01/26(木) 02:13:57
確か、その手の内部クラスへ(から?)のアクセスが
BCC5.5.1とBCC5.6.4で変わってた覚えがあるから(どちらになったかは覚えてないが)
>>339の言う通りに違いないだろう、と俺は思う。

341 名前:デフォルトの名無しさん :2006/01/26(木) 02:15:08
あ、もっと古いバージョン(BCB4の奴)かもしれない。
まあとにかく、変わったって事で。

342 名前:デフォルトの名無しさん :2006/01/26(木) 08:52:52
>>339
これだな。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#10
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45

343 名前:デフォルトの名無しさん :2006/01/27(金) 00:08:50
ちょ、おまえら、あのさ、名前空間を
com::example::cvs::mylib::hoge
とかにするのはどうよ??

344 名前:デフォルトの名無しさん :2006/01/27(金) 00:12:36
namespace www::google::com;

345 名前:デフォルトの名無しさん :2006/01/27(金) 00:22:24
::の代わりに . が使えたらよかったんだけどな。

>>344 逆じゃね?

346 名前:デフォルトの名無しさん :2006/01/27(金) 00:44:53
可変長テンプレート引数って、どうやれば宣言できるの?

tuple<int,int,double,double>
tuple<char,char,int>

みたいなクラスを自分で作りたいんだが。
いろんなところを調べると、

template<class T1,class T2,...,class TM>
class tuple;

みたいな書き方がされてるけど、当然のごとく
このままではコンパイル通らないし…


347 名前:デフォルトの名無しさん :2006/01/27(金) 00:48:30
boost::tupleのソースみれ

348 名前:デフォルトの名無しさん :2006/01/27(金) 00:51:08
>>346
真に可変長のテンプレート引数なんてものはできない。
デフォルトのクラス指定があって省略可能なだけ。

349 名前:デフォルトの名無しさん :2006/01/27(金) 00:58:22
>>348
なるほど。
可能な最大長で宣言されてて、デフォルト引数は無効を示す
型タグになってて、さらに無効な型タグによる特殊化をしてるんだね。
thx


350 名前:デフォルトの名無しさん :2006/01/27(金) 01:30:13
>>343-345
名前空間をユニークにするために
標準的に使われている名前付け規則ってある?

351 名前:デフォルトの名無しさん :2006/01/27(金) 08:38:09
>>325
C++ を純粋にオブジェクト指向言語としての恩恵を受けるだけのために
使いたいときに、STL や boost を使うともれなくジェネリックプログラミングの
世界に引きずり込まれてしまうのが何かイヤン。
テンプレートは分割コンパイルにも(メジャーなコンパイラは)対応してないし。


352 名前:デフォルトの名無しさん :2006/01/27(金) 08:44:32
>>343
なんか Java に影響されすぎだなw

実際問題、名前空間って作者(制作会社)の名前(ニックネーム)や
ソフトの名前が多いと思うけど、適当に付けて被ることそんなにあるかいな。

353 名前:デフォルトの名無しさん :2006/01/27(金) 08:48:25
>>352 まぁなぁ、名前空間に関してだけはマジでそう思うんだわ。
というか、インクルードパスと名前空間とを統合した
新しいインポート規則とか便利じゃね?
って、それもJavaに影響され杉とか言われそうだな。
実際、Javaをそれほど使ってる訳じゃないんだが、
どうしてもグローバルにユニークな、ってのに
こだわってしまうんだよな。
それはむしろXMLの名前空間からの影響かも。

354 名前:デフォルトの名無しさん :2006/01/27(金) 08:54:36
Java のパッケージの場合は、プログラムをコンパイルしてユーザーがその
プログラムを使うときまでクラスパス指定などでずっとついて回る問題だから、
世界規模でユニークというのを保証するのはまあ必要だと思う。

ただ C++ の場合は、一度コンパイル・リンクしてしまってネイティブコードに
なったら、名前空間もへったくれもないからなあ。

355 名前:デフォルトの名無しさん :2006/01/27(金) 09:00:34
だよな

ソースレベルの共有ならリファクタリングブラウザさえあれば問題起きないし

356 名前:デフォルトの名無しさん :2006/01/27(金) 09:45:30
>>351
STLのvectorとJavaのArrayListとで、
「ジェネリックプログラミングの世界」とやらの
複雑さは微塵も変わらんと思うんだが。

イテレータだって、その詳細を気にしなければ
ジェネリックプログラミングを意識する必要はないし。

C++ 0xでは、以下のように書けるようになるから
ますますSTLの記法の特殊性は減る。

vector<int> v = { 0, 1, 2, 3, 4 };
for( auto i = v.begin() ; i != v.end() ; ++i ){
  cout << *i << endl;
}


357 名前:デフォルトの名無しさん :2006/01/27(金) 10:03:24
c++0x は俺が生きてるうちに出るんかなあ

358 名前:デフォルトの名無しさん :2006/01/27(金) 15:32:37
c++0x は俺が生きてるうんち出るんかなあ

359 名前:デフォルトの名無しさん :2006/01/27(金) 15:43:00
というよりいつまでC++0xなんて言ってんだ?
今年中に出せマヌケな禿め

360 名前:デフォルトの名無しさん :2006/01/27(金) 15:48:50
>>359 まぁそういうなよ。
コーヒーでも飲んで落ち着け。

361 名前:デフォルトの名無しさん :2006/01/27(金) 15:57:36
class A
{
A(T a, T b, T c);
T array[3];
};
というクラスで、コンストラクタの初期化でarrayを{a, b, c}に設定したいんですが
どうすればいいんでしょーか。
A::A(T a, T b, T c): array({a, b, c}) {}
A::A(T a, T b, T c): array[0](a), array[1](b), array[2](c) {}
とかやってみましたがエラーが出て終わりですよ!

362 名前:デフォルトの名無しさん :2006/01/27(金) 16:00:17
A::A(T a, T b, T c)
{
array[0] = a;
array[1] = b;
array[2] = c;
}
ってやるしかないと思うよ。

363 名前:デフォルトの名無しさん :2006/01/27(金) 16:01:48
早!
サンクス!あきらめます!

364 名前:デフォルトの名無しさん :2006/01/27(金) 16:27:32
>>361 指定する方法はない(論拠:禿本§10.4.7 クラスの配列)

class Aのコンストラクタの引数に配列を取るようにしたら?

365 名前:デフォルトの名無しさん :2006/01/27(金) 17:07:13
>>361
class A
{
  A(T a, T b, T c) : array0(a), array1(b), array2(c) {};
  union {
    T array[3];
    struct {
      T array0;
      T array1;
      T array2;
    };
  };
};

366 名前:デフォルトの名無しさん :2006/01/27(金) 17:10:39
無名のunionってアリだっけ?

367 名前:デフォルトの名無しさん :2006/01/27(金) 17:14:05
>>365
それってPODにしか使えないからあまり価値なくね?

368 名前:デフォルトの名無しさん :2006/01/27(金) 17:25:43
いや、まあどうしても初期化したいのならこうしかないかなぁと。
無名共有体は独自拡張だから使いたくない代物であるのはわかってるけどね。

369 名前:デフォルトの名無しさん :2006/01/27(金) 17:31:20
>>368
あれ? Cでは独自拡張だけど、
C++では言語仕様として認められてたはずだけど

370 名前:デフォルトの名無しさん :2006/01/27(金) 17:32:47
横からで悪いがマジすか?
規格何ページあたりかわかります?

371 名前:デフォルトの名無しさん :2006/01/27(金) 17:33:23
>>369
ゴメ。ぼけてた。

372 名前:369 :2006/01/27(金) 17:44:25
>>370
規格書持ってないんでPDFの方を見たけど
JIS X3014
130ページの9.5.2 に記述されてた

373 名前:デフォルトの名無しさん :2006/01/27(金) 17:47:15
うはwあった。マジでサンクス
C++でも独自拡張かと思ってた

374 名前:デフォルトの名無しさん :2006/01/27(金) 18:44:31
ついでにお願いできれば、
struct xxx {
 ...
 char name[0];
};
のような、末尾のメンバのサイズを0に出来るというのも、
Cだと独自拡張でC++だと標準だったような気がするんだけど
どこかに載ってますかね?

375 名前:デフォルトの名無しさん :2006/01/27(金) 18:57:43
そんなことが出来たとしてなんか役に立つの??

376 名前:デフォルトの名無しさん :2006/01/27(金) 18:59:54
可変長構造体と呼ばれる、かなり有名(かつ邪道)なテクニック

377 名前:デフォルトの名無しさん :2006/01/27(金) 19:11:29
ちらっとぐぐったら、
C99では、最後のメンバのサイズを0にするのではなく、
最後のメンバのサイズを省略できるらしいですね。
つまり、事実上ラベルとしてのみ使われるメンバを作れると。

378 名前:デフォルトの名無しさん :2006/01/27(金) 20:26:29
VCでSTLのreverse_iteratorが
reference operator[](diff_type Off)
{ return *(*this + Off); }
と実装されてます。
これって一時オブジェクトの参照を返してるように見えるけど
合ってますか?

379 名前:デフォルトの名無しさん :2006/01/27(金) 20:31:07
reference の定義を見ないとね、なんとも。

380 名前:デフォルトの名無しさん :2006/01/27(金) 20:32:01
質問なんですが、CGIがすでにネットワーク上に用意されていて、
それを実行するためのコマンドもわかっていたら
C++でCGIを呼び出す(?)ことは可能でしょうか?

381 名前:デフォルトの名無しさん :2006/01/27(金) 20:32:45
>>378
間違ってる。単に一時オブジェクトのメンバ関数を呼んでいるだけ。
return (*this + Off).operator*();

382 名前:デフォルトの名無しさん :2006/01/27(金) 20:44:57
>>380 多分 socket 叩けばできる。

383 名前:デフォルトの名無しさん :2006/01/27(金) 20:56:20
>>381
ギャー、operator*(), operator+()を見直したらちゃんとメンバ変数の参照を返してました・・・
どうもありがとうございました。

384 名前:デフォルトの名無しさん :2006/01/27(金) 21:35:48
class A
{
private:
void test( void )
{
}
};

template <class T> class B
{
private:
T t;
public:
void testB( void )
{
t.test();
}
};

main()
{
B<A> b;

b.testB();
}

っていうふうにtemplateクラスの関数から別クラスのプライベート関数を呼びたいんですが
どうすればよろしいでしょうか?
templateクラスじゃなければ普通にclass Aにfriend class B;を書けばいいと思うんですが…
おねがいしまつ。


385 名前:デフォルトの名無しさん :2006/01/27(金) 21:43:55
>>384
friend class B<A>;

386 名前:デフォルトの名無しさん :2006/01/27(金) 21:49:53
template <class T> friend class B;


387 名前:384 :2006/01/27(金) 21:56:08
>>386
できました。
ありがとうございます。


388 名前:デフォルトの名無しさん :2006/01/27(金) 22:13:02
std::listなんですが、sortしてもイテレータが有効なのは保証されているのでしょうか?
あと、どのコンテナがどんな操作をするとイテレータが無効になるか
書いてあるとこありませんでしょうか?

389 名前:デフォルトの名無しさん :2006/01/27(金) 22:27:55
内容を破壊しないソートはstable_sort(だっけ?) とかあるからそういうのを使うか、
作業用にコピーして使うとかそんな感じになると思う。


390 名前:デフォルトの名無しさん :2006/01/27(金) 22:30:17
>>389
内容を破壊しないソートってなんだよw

391 名前:デフォルトの名無しさん :2006/01/27(金) 22:39:02
そもそもstable_sortは、
ランダムアクセスイテレータを条件にしてるからlistに使えねーよw

それに内容を破壊しないんじゃなくてstable_sortは安定したソート。

392 名前:デフォルトの名無しさん :2006/01/27(金) 22:41:38
>>388
std::list のイテレータが無効になるのはイテレータが指す要素が削除されたときだけ。

ここ見れば全部分かるよ。
http://www.sgi.com/tech/stl/

393 名前:388 :2006/01/27(金) 22:46:12
>>392
ウホッ!いいドキュメント。早速ブックマークしました。
ありがとう

394 名前:デフォルトの名無しさん :2006/01/27(金) 22:49:07
イテレーターの上書きがないとかそういうのじゃないのか?

395 名前:デフォルトの名無しさん :2006/01/27(金) 22:54:38
>>394 何の話だ?

396 名前:デフォルトの名無しさん :2006/01/27(金) 23:03:33
stable_sortはマージソート。
並び替える要素の中に等価のものがあっても、
元の順番と変わらない。

quick_sortは安定ではないために、
並び替える要素の中に等価のものがあったら、
元の順番と同じとは限らない。


397 名前:デフォルトの名無しさん :2006/01/27(金) 23:30:06
>>396 何の話だ?

398 名前:デフォルトの名無しさん :2006/01/27(金) 23:58:09
>>396
stable_sort がマージソートである保証はない.規定されてるのは安定であることと,
追加計算領域を使わない場合 O(n (log n)^2),追加計算領域を使う場合 O(n log n) であることだけ.

これを満たすマージ以外のソートには二分木ソートや,前処理付の不安定ソート群がある.

399 名前:デフォルトの名無しさん :2006/01/28(土) 00:28:32
std::list::sort()はstableだったよな確か

400 名前:デフォルトの名無しさん :2006/01/28(土) 00:46:17
>>399
yes

401 名前:デフォルトの名無しさん :2006/01/28(土) 00:49:31
というより何故listはstableがデフォなんだ
C++的にはlistでも最も高速なやつを標準にして
stableを別個で実装するのが普通だと思うのだが

402 名前:デフォルトの名無しさん :2006/01/28(土) 01:10:35
ランダムアクセス出来ないデータ構造で
もっとも速いsortがstableだっていうだけじゃねーの?

403 名前:デフォルトの名無しさん :2006/01/28(土) 01:30:24
設計手法のアドバイスをください。

class Ikimono()

class Tako : public Ikimono {
 static int legs;
}
class Neko : public Ikimono {
 static int legs;
}
int Tako::legs = 8;
int Neko::legs = 4;

こんな感じで派生したクラスでクラスに固有の値を設定しています。
聞きたいことは2つで
・上記より何かもっとうまい設計方法はないだろうか
・Ikimonoの派生クラスではlegsの定義を強要させる仕組みはできるか
アドバイスよろしくお願いします。

404 名前:デフォルトの名無しさん :2006/01/28(土) 01:34:58
>>403
class Ikimono {
virtual int legs() =0;
};

class Tako : public Ikimono {
  int legs() { return 8; }
};

class Neko : public Ikimono {
  int legs() { return 4; }
};

「うまい設計」かどうかは別として後者は満たしてると思うけど

405 名前:デフォルトの名無しさん :2006/01/28(土) 01:47:41
>>404
なるほど。
その手法思いついていたんだけど
Ikimonoをインスタンス化できなくなるのが嫌だなぁと思ってやらなかった。
でもあらためて出されてよく考えるとIkimonoをインスタンス化することなんてねーや。
ありがd

406 名前:デフォルトの名無しさん :2006/01/28(土) 01:47:57
>>403
「何かもっとうまい」と言われてもわかんねーよ。
なにが不満なのか言ってもらわないと。

407 名前:403 :2006/01/28(土) 01:58:02
>>406
いや、マジその通りでごめん。
コンパイル時に具体的なユニークナンバー(4とか8とか)を決定するのではなくて
実行時にダイナミックに設定する方法はないかなぁとぼんやり思って。
(今書いてるプログラムでは>>404で十分なんだけどね)

・実行時にクラス固有の値を設定することができる
・インスタンスを複数生成してもその値は1つでメモリに優しい
・templateを使うとどうなるのかな?

の3つが知りたい方法。
3つ目が馬鹿っぽいこと言ってるのはわかるけどtemplateって個人的に何か憧れるのよw

408 名前:デフォルトの名無しさん :2006/01/28(土) 02:04:07
336ですが、
C++にはフリーのO/Rマッピングライブラリは無いんでしょうか?
C++はDB扱うのにはむいてないですか?

409 名前:デフォルトの名無しさん :2006/01/28(土) 02:22:45
>>408
言語の向き不向きの問題ではない。自分で作れば?

410 名前:デフォルトの名無しさん :2006/01/28(土) 02:26:28
>>407
テンプレートを使ったら「実行時にダイナミックに設定する方法」じゃなくて
「コンパイル時に具体的なユニークナンバーを決定する」ことになるよ。

>>404の方法は、君の要件を完全に満たしている。

無理にテンプレートを使って実現するとすると

struct Ikimono
{
  virtual int legs() = 0;
};

template<int N>
struct IkimonoN : public Ikimono
{
  virtual int lets(){ return N; }
};

typedef IkimonoN<8> Tako;
typedef IkimonoN<4> Neko;


411 名前:403 :2006/01/28(土) 04:12:17
>>410
なるほど。
ありがd

412 名前:デフォルトの名無しさん :2006/01/28(土) 07:39:49
仮想関数のアドレスを得たいのですが、なぜかできません。
単に表示させるのはできるのですが、void型ポインタなどに入れることができません。
どうキャストすればいいのでしょうか?

#include <stdio.h>
class X
{
public:
  virtual func() = 0;
};

class Y : public X
{
public:
  virtual func(){ return 1; };
};

void main()
{
  X *px = new Y;
  printf("%08X\n", &px->func); // これは一応できる
  void *pv = (void *)&px->func; // これはエラー
  int i = (int)&px->func; // これもエラー
}

413 名前:ケッミュ :2006/01/28(土) 08:57:26
チミたち、C言語なんて使うのやめなさい。
Visual Studio 2005をつかいなさぁい!

414 名前:デフォルトの名無しさん :2006/01/28(土) 09:02:12
Visual Studio 2005 で C 言語使ってますが何か??

415 名前:デフォルトの名無しさん :2006/01/28(土) 09:15:37
>>412
メンバ関数へのポインタだろ?
void* や int にキャストって、もしかしてそいつが4バイトとかって前提で考えてるか?

416 名前:デフォルトの名無しさん :2006/01/28(土) 09:36:46
>>415がいうように、メンバ関数は4バイト以上になる事がありマス

417 名前:デフォルトの名無しさん :2006/01/28(土) 09:38:14
>&px->func
2003だとC2276になるんだけど。

418 名前:enumのスコープ(?) :2006/01/28(土) 10:02:51
class AAA {
public:
enum BBB {
ITEM1 = 1
};
enum CCC {
ITEM1 = 2
};
};

こうするとエラーになります。
AAA::BBB::ITEM1 と AAA:CCC:ITEM1 は区別される物ではなく、
むしろ両方 AAA::ITEM1 ということでしょうか?

419 名前:デフォルトの名無しさん :2006/01/28(土) 10:13:07
>>418
その通り。

420 名前:デフォルトの名無しさん :2006/01/28(土) 12:13:37
>>398
(STLの)stable_sortはマージソート
という意味


421 名前:デフォルトの名無しさん :2006/01/28(土) 13:29:06
>>420
だから、そのSTLにおいてstable_sortがマージソートでなければいけないって規定はないでしょって話でないの?

422 名前:デフォルトの名無しさん :2006/01/28(土) 13:38:41
規格と実装を(ry

423 名前:デフォルトの名無しさん :2006/01/28(土) 15:42:22
>>412
標準C++ではできない。
普通はメンバへのポインタを使う。
ただ仮想関数のメンバへのポインタは気が利かせてあって、
きちんとポリモーフィズムが働く。

424 名前:デフォルトの名無しさん :2006/01/28(土) 15:50:36
Visual C++で、coutで出てくるコンソール画面をもう一つ表示させて、
エラーを表示させるウィンドウと、処理結果を表示させるウィンドウの二つに分けたいんですけど
そういうことは出来ないでしょうか?
簡単にウィンドウをもう一つ表示っていうのは難しいですかね?
初心者なんですみません。

425 名前:デフォルトの名無しさん :2006/01/28(土) 15:54:03
>>424
スレ違い。環境依存OKなスレへどうぞ

【初心者歓迎】C/C++室 Ver.24【環境依存OK】
ttp://pc8.2ch.net/test/read.cgi/tech/1135828083/l50

426 名前:デフォルトの名無しさん :2006/01/28(土) 15:54:25
>>424
環境依存なのでスレ違い。
ちなみにWindowsは1プロセス1コンソールと決まっているので
同一プロセス内で2個のコンソールを持つことはできないよ。

427 名前:デフォルトの名無しさん :2006/01/28(土) 16:10:08
>>424
std::cout と std::cerr を分ければいいじゃん。
ってところまでは環境非依存。
それぞれのストリームが実際にどこに行くかってのは環境依存。

俺なら std::cerr の rdbuf() に、エラーログ用に開いた
ofstream の rdbuf() をつっこんでエラーログに吐く。

428 名前:デフォルトの名無しさん :2006/01/28(土) 16:46:25
C++初心者です。以下のような配列を動的に割り当てるプログラムで、
max の定義がおかしいようなのですが、どう直せばよいのか分かりません。
分かる方、詳しい方、お教えいただければ幸いに存じます。
class stack
{
private:
static int max;//ここがおかしいようです
int data[max];
int sp;
public:
void push(int d){ assert(sp<max); data[sp++] = d;}// データをプッシュ
void pop(){ assert(0<sp); --sp;}// データをポップ
bool empty() const{return sp == 0;}// スタックが空のとき true を返す
int top() const{return data[sp-1];}// スタックトップのデータを返す
int size() const{return sp;}// 現在格納されているデータ数を返す
stack::stack(int sz=100)// コンストラクタ
{
sp = 0;
max = sz;
data = new int[max];
}
stack::~stack() {delete [] data;}// デストラクタ
};

429 名前:デフォルトの名無しさん :2006/01/28(土) 16:49:16
>>428
C99ではdata[max]ってのは許容されてるが
C++でもよかったっけ?ダメだったと記憶してるが

素直にvector使え
っていうか、std::stack使え

430 名前:デフォルトの名無しさん :2006/01/28(土) 16:50:59
>>428
-static int max;//ここがおかしいようです
+int max;

-int data[max];
+int *data;

431 名前:デフォルトの名無しさん :2006/01/28(土) 16:52:02
>>428
宿題はよそでやりなさい。

432 名前:デフォルトの名無しさん :2006/01/28(土) 16:59:57
>>428に書き込んだ者です。
>>430さん、ありがとうございました!解決しました。

433 名前:デフォルトの名無しさん :2006/01/28(土) 19:14:49
クラス変数とメンバ変数とでは意味が全く異なってるんだが。
問題ないのかねえ。



434 名前:デフォルトの名無しさん :2006/01/28(土) 21:57:04
ほんと低レベルなスレだな


435 名前:デフォルトの名無しさん :2006/01/28(土) 22:03:47
またお前かw

436 名前:デフォルトの名無しさん :2006/01/28(土) 22:34:30
>>434
まぁそりゃ他の高級言語と比べたら低級な言語だからね。
スレも低レベルな話題になるのは仕方がないだろう

437 名前:デフォルトの名無しさん :2006/01/28(土) 23:04:39
>>436
メンバ関数へのポインタが void* に変換できない理由について
「低級な」説明ができないアフォがでかい面するところじゃねえよな

438 名前:デフォルトの名無しさん :2006/01/28(土) 23:25:02
規格に照らして説明できないやつもでかい面してほしくないな。
4バイトとか、そういうの関係ないだろ。

439 名前:デフォルトの名無しさん :2006/01/28(土) 23:32:17
>>437-438
自分ごと批判するってつらくね?

440 名前:デフォルトの名無しさん :2006/01/28(土) 23:37:23
自分は批判してないから辛くない

441 名前:デフォルトの名無しさん :2006/01/28(土) 23:39:54
どう足掻いても defect なんたらで発言するに至りえないパラダイムを自慢したきゃ
それをやめろと言える場じゃないんで静観するが俺に言わせりゃ(ry

442 名前:デフォルトの名無しさん :2006/01/28(土) 23:42:22
間違いを恐れるな
何もしないで文句言ってる
真性のお馬鹿さんよりは1万倍マシ

443 名前:デフォルトの名無しさん :2006/01/28(土) 23:48:09
クリリンのことかーーーーっ!!

444 名前:デフォルトの名無しさん :2006/01/28(土) 23:54:26
例外、というかtryブロックのパフォーマンスについてです。
try{
hoge();
}
で、hoge()が例外を投げずにreturnできる場合の実行速度は、
tryブロックが無い時と比べて目立って落ちるのでしょうか?

もし囲むだけでも結構なコストがあるのなら、tryの乱発は避けて
ある程度場所を吟味せねばいかんのかな、という事を考えております。

445 名前:デフォルトの名無しさん :2006/01/28(土) 23:56:03
>>444
そんなもん自分で計れよ

446 名前:デフォルトの名無しさん :2006/01/29(日) 00:02:22
>>445
無理だよ
影響が大きくなりそうなテストパターンと
影響が小さそうなテストパターンが作れない者の
実験と称する無目的な奇行からは何も帰納できないよ

447 名前:デフォルトの名無しさん :2006/01/29(日) 00:07:27
ttp://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep070199.asp
参考までに。

448 名前:デフォルトの名無しさん :2006/01/29(日) 00:24:01
>>444
try で囲まなくても、デストラクタのあるローカルオブジェクトを作れば
巻き戻しのために try と同等のポイントができる。
ソースコード上に表れる try を避けるだけじゃ意味が無い。
で、ローカルオブジェクトの作成まで吟味してから決めるようだと
ほとんど本末転倒じゃないかな?

449 名前:デフォルトの名無しさん :2006/01/29(日) 00:46:07
クラスについて質問なのですが
class AAA {
private:
int a[10];
}
のようなクラスがあったとして A  aaa;と宣言します。
ここからaaaのポインタを取得してprivateで宣言されてる変数にアクセス
することは可能ですか?

450 名前:デフォルトの名無しさん :2006/01/29(日) 00:46:47
まぁ可能

451 名前:デフォルトの名無しさん :2006/01/29(日) 01:15:12
>>449 不可能。

452 名前:デフォルトの名無しさん :2006/01/29(日) 01:19:36
>>449
#define private public
とすればいいやん。

453 名前:デフォルトの名無しさん :2006/01/29(日) 01:22:09
>A  aaa;

undeclared identifier 'A'.

454 名前:デフォルトの名無しさん :2006/01/29(日) 01:26:31
>>449
改めて言っておく。鼻から悪魔が(ry
#include <iostream>
class dummy {public:int a[10];};
class AAA {
public:
    AAA(){for (int i = 0; i < 10; ++i) a[i] = i;}
private:
    int a[10];
};
int main(void) {
    AAA a;
    int *pa = reinterpret_cast<dummy*>(&a)->a;
    for (int i = 0; i < 10; ++i) std::cout << pa[i] << ' ';
    std::cout << std::endl;
}

455 名前:デフォルトの名無しさん :2006/01/29(日) 01:32:44
万策尽くせば可能かもしれないけど
そんなこと自体考えてはいけない

456 名前:デフォルトの名無しさん :2006/01/29(日) 01:36:58
boostで>>452を見た気が

457 名前:デフォルトの名無しさん :2006/01/29(日) 02:11:46
スタイルの問題と言うか、設計の問題と言うか、
前々からどうすべきなのか悩んでいることがあるので
皆さんならどうするのか質問させてください。

class A でコンストラクタで設定するパラメータとして、
多くの場合にはデフォルト値を使用するため、次のようにします。

class A
{
public:
  static const int default_a;
  A(int a = default_a) : a_(a) {}
private:
  int a_;
};

他のクラスBやCでも同じようにします。
すると、このdefault_aとかdefault_bとかはほとんど変更しないため、
結果的にあちこちのクラスに定数が散らばってしまうことになります。
これの何が問題なのかというと、
結局クラスを利用する側ではほとんどデフォルト値だけを使用して、
たまにプログラム全体の挙動を変更させたい場合にだけ、
default_aとかの値自体を変更してコンパイルし直して
テストしたりするわけです。
その場合に、あちこちのファイルに回って、
default_hogeを変更するのが面倒だなあ、と。

458 名前:457 :2006/01/29(日) 02:12:52
続き

AやBやCを利用する側のクラスとかでまとめて定数を定義すれば
いいのかもしれませんが、
利用者側がクラスの定数を定義しているというのは変な気がします。
A,B,Cで共通のヘッダファイルを読み込ませるしかないのかもしれませんが、
このaとかbとかは、それぞれのクラス固有の情報なので、
別のところに定数が設定されてるのもなんだかなあ、という気がしますし、
A,B,Cとか、全く関連のないもの同同士の情報が一箇所に集まってるのも
どうかな、という気がします。
クラスの独立性を重視した場合、
A固有の情報である定数が、他の定数を定義してある部分と
同時に与えられるのはどうも気持ちが悪いというか。

A,B,C、みたいな書き方だと、なんかこいつら仲間みたいだから
一箇所で定義すればいいだろ、みたいに思えますが、
全く関連のないもの同士だと考えてください。

デフォルト値を一切しないで、利用する側で、適宜、
利用者側の定数(利用する側では、常にこの値を用いる)、
みたいなものを作る方法も考えましたが、
クラスA等を、複数の場面で利用する場合を考えると、
デフォルト値はあった方が便利な気がします。

すごく長くてすいません。

459 名前:デフォルトの名無しさん :2006/01/29(日) 02:17:24
外部から取り込む仕様にすれば良いのでは?

460 名前:デフォルトの名無しさん :2006/01/29(日) 02:17:52
>>457-458
難しい日本語でよくわからないが、たぶんそれはお前の都合でしか決められない。

461 名前:デフォルトの名無しさん :2006/01/29(日) 02:19:22
>>458 俺もよく悩む。
結局ちらばってしまうか、
共通ヘッダで何とかするか、
しかおもいつかない。

462 名前:デフォルトの名無しさん :2006/01/29(日) 02:26:37
もう一案

class A
{
public:
  A(int a = ::createDefault_a()) : a_(a) {}
private:
  int a_;
};

で、クライアント側で、必ず「::createDefault_a()」を実装させる

463 名前:デフォルトの名無しさん :2006/01/29(日) 02:27:33
>>462
それがどうした

464 名前:デフォルトの名無しさん :2006/01/29(日) 02:38:07
この有り難さが解らんのか・・・
>>457の悩みは解決してると思うが

465 名前:デフォルトの名無しさん :2006/01/29(日) 02:42:41
共通ヘッダでいいよ。
ちゃんとnamespace使ってれば。

466 名前:457 :2006/01/29(日) 02:43:30
>>459-465
皆さんありがとうございます。

>>460
確かに自分でも、なんか無茶なことを言ってる気がしてきました。
自分がそのクラスをどう作りたいのか、によりますね。

>>462
それだと、AからZまでクラスがあったら、
クライアント側で26個関数を供給する必要があって
デフォルトどころか、逆に大変な気がします。

やっぱりうまい方法はないというか、無理な要求っぽいですね。
今後も悩み続けることにします…

467 名前:デフォルトの名無しさん :2006/01/29(日) 02:48:07
>それだと、AからZまでクラスがあったら、
>クライアント側で26個関数を供給する必要があって
>デフォルトどころか、逆に大変な気がします。
・・・・・
そう言うもんな気がする

>クラスA等を、複数の場面で利用する場合を考えると、
これがしたいのなら尚更

468 名前:デフォルトの名無しさん :2006/01/29(日) 02:59:37
クライアント側に負荷掛けさせたくないのなら

class ZENBU {
  sratic int reateDefault_a() {
    return 1;
  }
}

template<class T=ZENBU>
class A
{
public:
  A(int a = T::createDefault_a()) : a_(a) {}
private:
  int a_;
};

469 名前:457 :2006/01/29(日) 03:22:42
>>467
確かに、>>457-458で言ってたことは、
設計上のトレードオフで相反する要求を
同時に克服しようとしている感じで、
要求自体が矛盾してるという感じですね。

>>468
利用される異なる場面で、それぞれ異なるデフォルト値を与えることができ、
そのデフォルト値を用いて引数なしのコンストラクタが呼び出せる
ということで、利点はあると思いますが、
もう一段階メタなデフォルトの概念ができるというか、
結局 class ZENBU は共通ヘッダファイルと同じことのような気がします。

>>457-458
は、はじめはデフォルト値は変更しないものとして
利用されることを想定して設計したものが、
その後、変更したくなってしまったために面倒なことになった、ってことで、
設計がおかしい、って結論な気がします。

470 名前:デフォルトの名無しさん :2006/01/29(日) 03:31:16
>結局 class ZENBU は共通ヘッダファイルと同じことのような気がします。
同じなのは確か
>もう一段階メタな
それが狙い
唯、メソッドにしておくと、後々便利
プロパティファイルから取り込む変更とが楽

それから設計は、おかしくないと思う
実務っぽいAPLになってしまうけど


471 名前:デフォルトの名無しさん :2006/01/29(日) 03:33:58
>>468のメリットはクライアントが拡張したいときは
class NANIKA : ZENBU{
  static int createDefault_a(){//これ以外は標準のまま
   return 2;
  }
};
みたいに拡張したい部分だけかけることだな。
まぁ殆ど書き換えるときは大して変わらないけど。

472 名前:デフォルトの名無しさん :2006/01/29(日) 06:06:29
>457
単純に引数デフォルト値の悪用じゃね?
デフォルト値を設定しなければ済む話じゃないの。

473 名前:デフォルトの名無しさん :2006/01/29(日) 11:59:01
まぁ>>457が決めなさいってところか?
俺ならconfig.h作って#includeだけどコンパイルが糞重くなるよなぁ

474 名前:デフォルトの名無しさん :2006/01/29(日) 12:07:17
>>473 config.h は autoconf がつかうからイヤン

475 名前:デフォルトの名無しさん :2006/01/29(日) 12:22:07
autoconf自体がイヤン

476 名前:デフォルトの名無しさん :2006/01/30(月) 00:45:00
vector型の変数eを先頭のデータから順に表示するにはどうすればいいですか?

477 名前:デフォルトの名無しさん :2006/01/30(月) 00:49:52
>>476
一つのデータを表示する方法と、データを順に取り出す方法を組み合わせるといいよ。

478 名前:デフォルトの名無しさん :2006/01/30(月) 00:54:47
>>476
copy + ostream_iterator
# 正直このくらいなら直にループ書いたほうが楽な気もするけどなー

479 名前:デフォルトの名無しさん :2006/01/30(月) 01:10:19
>>476
1. ループを書く
2. for_each()にファンクタを渡す
3. boost::lambdaを使う
4. C++/CLIでfor each構文を使う

C++では無名関数が使えないので、
どれもぱっとしないのだが

480 名前:デフォルトの名無しさん :2006/01/30(月) 01:15:18
>>477>>478ありがとうございました

481 名前:デフォルトの名無しさん :2006/01/30(月) 07:50:44
std::copy( e.begin(), e.end(), std::ostream_iterator<int>(std::cout,"\n") );

482 名前:デフォルトの名無しさん :2006/01/30(月) 07:52:13
C++にはなんでevalがないの?

483 名前:デフォルトの名無しさん :2006/01/30(月) 08:16:20
>>482
欲しかったら自分で実装してね。
実行ファイルがいちいちインタプリタぶらさげる羽目になるけど。
そうでなくても共有ライブラリをうまく使えばましにはなるかもしれないね。
そうすると結局C++でなく他のインタプリタ言語を使っておけばよかったと後悔するわけだ。

484 名前:デフォルトの名無しさん :2006/01/30(月) 08:39:57
>>482
C++ は静的な型チェックを厳重にすることで、実行時の安全性を提供
することを大切なものだと考えているから、eval なんて動的な翻訳系は
提供できないのさ。たとえ実行時の自由度が低下したとしても、安全の
ほうが優先されるのさ。

485 名前:デフォルトの名無しさん :2006/01/30(月) 12:41:26
>>483-484
そんなこと言っておきながら、ホントはあったら嬉しいんでしょ?
まあ無名関数すらない現状じゃまだまだ先だろうけど。

>>484
evalと静的な型チェックって相反するものなの?

486 名前:デフォルトの名無しさん :2006/01/30(月) 12:48:49
コンパイル型の処理系でevalがあって何がうれしいんだ?

487 名前:デフォルトの名無しさん :2006/01/30(月) 13:09:41
>>485
コンパイラとインタプリタの違いから勉強しなさい。

488 名前:デフォルトの名無しさん :2006/01/30(月) 13:20:14
ところで、ツールにスクリプティングの機能を持たせたいとき
どんなインタプリタエンジンを組み込んだらいい?
Tcl系、Lisp/Scheme系、FORTH系とかいろいろあるけど、
サイズが小さくてよさげなものはなんだろ。
お勧めあったら教えて。

489 名前:デフォルトの名無しさん :2006/01/30(月) 13:21:59
組み込み用のインタプリタだとluaあたりが定番じゃないか?

490 名前:デフォルトの名無しさん :2006/01/30(月) 13:26:27
> そんなこと言っておきながら、ホントはあったら嬉しいんでしょ?

全然

491 名前:デフォルトの名無しさん :2006/01/30(月) 14:18:43
>>489 初めて聞いた。ブラジル産で、ポルトガル語で月、らしい。

492 名前:デフォルトの名無しさん :2006/01/30(月) 18:30:25
それにしても>>476は一体どんな風にvectorを知ったんだろう。
普通STLのコンテナの解説にはforループのサンプルもついてくると思うが

493 名前:デフォルトの名無しさん :2006/01/30(月) 18:33:28
読まない、調べない、考えない、これ常識。

494 名前:デフォルトの名無しさん :2006/01/30(月) 18:55:44
例のゆとり世代と言うやつか

495 名前:デフォルトの名無しさん :2006/01/30(月) 19:33:36
ついでに、プログラミングしない、で476は幸せになれるのになぁ


496 名前:デフォルトの名無しさん :2006/01/30(月) 19:34:19
ループを一切使わないSTL原理主義者の書いた解説かも知れんぞ

497 名前:デフォルトの名無しさん :2006/01/30(月) 21:46:02
今独習C++で独習中なのですが、何だかこの本でいいのか不安です。
もし↑読んだ方いたら、他の初心者用のと比べてどうかなど指摘して欲しいのですが。
お願いします。

//不安な点の例) 「アドレス情報を保存しなさい」という問題→ちゃんと「住所」と訳してくれないと紛らわしい('A`)

498 名前:デフォルトの名無しさん :2006/01/30(月) 21:51:28
とりあえず「アドレス帳」に文句をつけときなさい。

499 名前:デフォルトの名無しさん :2006/01/30(月) 22:00:45
C++で何やればいいの?
メッセンジャーソフト作れる?

500 名前:デフォルトの名無しさん :2006/01/30(月) 22:03:58
独習C++は読んだこと無いが、
独習JAVAはウンコだった。



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