C++相談室 part56
..
369:デフォルトの名無しさん
07/08/16 18:30:39
あんまり真面目に読んでないけど、とりあえずこうじゃね?
return (*aaa.subclass)["bbb"];
370:368
07/08/16 18:44:26
>>369
どうもー
やってみましたがだめでした
371:デフォルトの名無しさん
07/08/16 18:53:11
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。
372:368
07/08/16 19:00:40
>>371
うーんエラーメッセージは変化なしです
373:デフォルトの名無しさん
07/08/16 19:06:17
aaa.subclass->operator[]("bbb")
374:368
07/08/16 19:08:45
>>373
コンパイル通りました
ありがとうございました
375:デフォルトの名無しさん
07/08/16 19:11:26
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。
376:デフォルトの名無しさん
07/08/16 19:11:34
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね
377:371
07/08/16 19:13:21
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?
378:376
07/08/16 19:13:31
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。
379:376
07/08/16 19:15:59
つうことで解決案
subclassをカプセル化して、参照越しにoperator[]を呼ぶ
380:デフォルトの名無しさん
07/08/16 19:23:44
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。
381:368
07/08/16 19:28:22
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです
>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…
>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました
382:デフォルトの名無しさん
07/08/16 19:35:38
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。
(*aaa.subclass)[''bbb"] = new char[10] ;
いや、ひょっとしたらこういうことがしたいのか
char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;
383:デフォルトの名無しさん
07/08/16 20:59:50
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。
384:デフォルトの名無しさん
07/08/16 21:06:38
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。
public:
Derived(int n) :Base(n) {}
385:デフォルトの名無しさん
07/08/16 21:06:53
はい?
386:デフォルトの名無しさん
07/08/16 21:07:27
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから
387:デフォルトの名無しさん
07/08/16 21:21:45
そのnは親に渡さずに別に使うnかもしれないし。
388:デフォルトの名無しさん
07/08/16 23:12:17
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。
初心者なんで間違ってるかもしれません。
っていうか STL 難しすぎでうっ!
389:デフォルトの名無しさん
07/08/16 23:20:25
Baseのコンストラクタにデフォルト値を書いておくのもいいかも
っていうか STL 関係ねー
390:デフォルトの名無しさん
07/08/17 00:01:01
>>388
>っていうか STL 難しすぎでうっ!
でうっ?
391:デフォルトの名無しさん
07/08/17 00:20:57
唐突にこれを思い出した
URLリンク(www.karakuri-box.com)
392:デフォルトの名無しさん
07/08/17 00:41:05
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽
393:デフォルトの名無しさん
07/08/17 01:00:07
脳みそ沸かしたいとき
394:デフォルトの名無しさん
07/08/17 01:24:19
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?
ない場合どのiterator継承すればいいんでしょうか
395:デフォルトの名無しさん
07/08/17 01:40:46
T*head; size_t element;が既知なんでそ?
なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?
396:デフォルトの名無しさん
07/08/17 01:48:01
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。
397:デフォルトの名無しさん
07/08/17 02:19:58
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。
398:デフォルトの名無しさん
07/08/17 02:21:20
サーバーアプリだとC#?ハァ?
399:デフォルトの名無しさん
07/08/17 02:38:29
?
400:デフォルトの名無しさん
07/08/17 03:59:53
つかここ#かんけーねーし
401:デフォルトの名無しさん
07/08/17 05:58:45
>>392
C#を実装するのに使います
402:デフォルトの名無しさん
07/08/17 12:37:18
>>401が良い事言った
403:デフォルトの名無しさん
07/08/17 21:16:42
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ
404:デフォルトの名無しさん
07/08/17 21:39:47
class CFUNC a;
の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?
405:デフォルトの名無しさん
07/08/17 22:15:50
typedef CFUNC*** PPPCFUNC
typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると
PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり
要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする
406:デフォルトの名無しさん
07/08/17 22:53:53
VC++では先頭の手前に要素数が格納されてた希ガス
407:404
07/08/17 22:59:04
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?
408:404
07/08/17 23:02:44
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?
409:デフォルトの名無しさん
07/08/17 23:17:52
処理系依存。
410:404
07/08/18 00:17:58
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?
411:404
07/08/18 00:36:14
すいません、勘違いです。typedefミスってました。OTL
412:383
07/08/18 11:08:57
>>384-389
ありがとうございました。よくわかりました。
最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。
413:デフォルトの名無しさん
07/08/18 11:24:18
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。
414:デフォルトの名無しさん
07/08/18 11:34:02
コピーコンストラクタや代入演算子をちゃんと書かないから・・
415:デフォルトの名無しさん
07/08/18 12:19:01
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ
416:デフォルトの名無しさん
07/08/18 12:37:37
そうだな、コピーコンストラクタと代入演算子は常に書くべき。
417:デフォルトの名無しさん
07/08/18 12:40:35
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが
418:デフォルトの名無しさん
07/08/18 13:32:09
GC付きC++って選択肢もあるんでないの(w
419:デフォルトの名無しさん
07/08/18 14:17:34
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。
420:デフォルトの名無しさん
07/08/18 15:08:22
時代に逆行している人
421:デフォルトの名無しさん
07/08/18 16:59:23
>>417
自分はC#→C→Java→C++ってやってきたけどおk?
422:デフォルトの名無しさん
07/08/18 17:03:18
コンストラクタで例外を投げるクラスがあり、
そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?
class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};
こんな感じです。
423:デフォルトの名無しさん
07/08/18 17:12:19
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。
424:デフォルトの名無しさん
07/08/18 17:36:05
>422
staticをやめる
425:デフォルトの名無しさん
07/08/19 13:25:57
教えてください。
たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";
cout << ip << " " << dp << " " << s << endl;
このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?
426:デフォルトの名無しさん
07/08/19 13:54:49
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。
ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。
427:デフォルトの名無しさん
07/08/19 17:00:46
教えてください。
428:デフォルトの名無しさん
07/08/19 17:31:07
何をだ
429:デフォルトの名無しさん
07/08/19 18:41:48
>>428
事故解決すますた
430:デフォルトの名無しさん
07/08/19 21:20:33
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
URLリンク(www.io.nara-su.ac.jp)
これですっきりしました。
431:デフォルトの名無しさん
07/08/20 15:44:57
質問です。
下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?
クラス図
URLリンク(enjoi.blogdns.net)
とりあえず書いてみたコード
class DataClass{
private:
int data;
public:
void setData(int newData);
int getData();
};
class ClassB
{
public:
bool DoSomething();
};
class ClassA
{
private:
ClassB classb;
};
432:デフォルトの名無しさん
07/08/20 16:18:28
状況次第じゃね。
どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、
433:デフォルトの名無しさん
07/08/20 16:18:28
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?
434:デフォルトの名無しさん
07/08/20 16:20:59
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?
435:デフォルトの名無しさん
07/08/20 16:23:07
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。
436:デフォルトの名無しさん
07/08/20 16:28:10
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。
437:デフォルトの名無しさん
07/08/20 16:30:25
B に入れといて、B を通して操作する。
438:デフォルトの名無しさん
07/08/20 16:35:13
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。
439:デフォルトの名無しさん
07/08/20 16:36:43
どこに多重継承が出てくるんだ?
440:デフォルトの名無しさん
07/08/20 16:59:47
あの矢印は関連。サブクラスは白抜き三角矢印。
441:デフォルトの名無しさん
07/08/20 17:56:47
たくさんのご回答ありがとうございました。
複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。
少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。
442:デフォルトの名無しさん
07/08/21 09:33:29
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。
443:デフォルトの名無しさん
07/08/23 00:48:57
stringstring を途中で空にすることはできるでしょうか?
444:デフォルトの名無しさん
07/08/23 00:56:17
std::stringstream?
445:デフォルトの名無しさん
07/08/23 01:27:07
なんだこのバグは
URLリンク(support.microsoft.com)
>>443
stringstream.str("");
446:デフォルトの名無しさん
07/08/23 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry
447:デフォルトの名無しさん
07/08/23 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか
448:デフォルトの名無しさん
07/08/23 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。
449:印字ケータ
07/08/23 14:31:20
バイナリエディタでファイルを開くと
保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、
コレを読込んで、配列に入れると-109と-6となります。
16進数で表示させたいので、変換する方法を教えてください。
お願いします。
450:デフォルトの名無しさん
07/08/23 14:35:18
unsignedにキャストすればいいんじゃね。
451:デフォルトの名無しさん
07/08/23 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6
そのまま16進にすれば同じ
気にしないで突き進め
char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい
452:印字ケータ
07/08/23 14:42:15
>>450
返答ありがとうございます。
早速やってみましたが、変換後に4294967187というデカイ数値になりました。
ちなみに、unsignedの変数にキャストして代入してみました。
もしかして私のやり方が間違ってますか。
453:デフォルトの名無しさん
07/08/23 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。
454:デフォルトの名無しさん
07/08/23 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011
455:デフォルトの名無しさん
07/08/23 15:04:05
char ch = 93;
int n = (unsigned char)ch;
456:デフォルトの名無しさん
07/08/23 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。
457:デフォルトの名無しさん
07/08/23 22:36:57
2005SP1で直ってるっぽいが
458:デフォルトの名無しさん
07/08/30 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?
459:デフォルトの名無しさん
07/08/30 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?
460:デフォルトの名無しさん
07/08/30 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。
461:sage
07/08/30 10:25:41
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます
462:デフォルトの名無しさん
07/08/30 11:47:47
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?
基本はauto_ptr戻しだと思うけど。
463:デフォルトの名無しさん
07/08/30 23:55:27
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。
仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。
で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。
464:デフォルトの名無しさん
07/08/31 00:49:22
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。
最後の場合は「可能性が低い」じゃなくて RVO は不可能。
465:デフォルトの名無しさん
07/08/31 00:52:15
>>464
Named RVOはVC8がやってるらしいですぜ
URLリンク(msdn2.microsoft.com)(vs.80).aspx
466:デフォルトの名無しさん
07/08/31 00:55:03
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?
467:デフォルトの名無しさん
07/08/31 01:09:49
URLリンク(gcc.gnu.org)
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。
468:464
07/08/31 01:23:50
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。
469:デフォルトの名無しさん
07/08/31 01:35:07
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz
470:デフォルトの名無しさん
07/08/31 01:48:21
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?
471:デフォルトの名無しさん
07/08/31 03:13:32
>>469
こんな感じ?
struct A {
template <typename T> T foo(int);
};
void bar() {
A a;
char c = a.foo<char>(0);
short s = a.foo<short>(1);
// ...
}
472:デフォルトの名無しさん
07/08/31 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?
473:デフォルトの名無しさん
07/08/31 15:13:39
f - floor(f)
474:デフォルトの名無しさん
07/08/31 16:14:22
>>472
modf
>>473は負数のとき正しくない
475:デフォルトの名無しさん
07/08/31 17:35:42
f = f - (float)((int)f);
とかじゃ駄目?
476:デフォルトの名無しさん
07/08/31 18:59:33
f > -1 ? f - floor(f) : aaaaaaaaa
477:デフォルトの名無しさん
07/08/31 19:19:41
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。
478:デフォルトの名無しさん
07/08/31 23:01:01
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな
とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ
479:デフォルトの名無しさん
07/08/31 23:31:14
unsigned longにキャストは駄目なのか
480:デフォルトの名無しさん
07/09/01 00:05:17
fmod(f, 1.0)
481:469
07/09/01 00:26:15
>>470,471
レスdクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...
struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};
void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}
もう少し探したらそれらしいのが見つかりました
URLリンク(homepage2.nifty.com)
やりたかったことはこんな感じ↓
URLリンク(anond.hatelabo.jp)
482:デフォルトの名無しさん
07/09/02 00:02:07
vector<char> v;
for (int i=0; i<v.size(); i++)
{
.....
}
というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?
483:デフォルトの名無しさん
07/09/02 00:07:42
うん
警告も消すのが良い作法
484:デフォルトの名無しさん
07/09/02 00:11:18
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。
485:デフォルトの名無しさん
07/09/02 00:12:08
これが規格厨を黙らせる、完璧に正しい方法。
for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )
486:デフォルトの名無しさん
07/09/02 00:16:44
そこでautoとか未来を先走るわけですよ。カモンC++0x
487:デフォルトの名無しさん
07/09/02 00:23:34
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。
こういうことできるの?
decltype( v.size() ) i ;
sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。
なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。
488:デフォルトの名無しさん
07/09/02 00:27:02
さすがにバカ過ぎるだろ
489:486
07/09/02 00:30:15
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)
490:デフォルトの名無しさん
07/09/02 00:40:25
>>483-489
なるほど。さんくすです。
>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。
>> 485
感動しました。
491:デフォルトの名無しさん
07/09/02 01:34:22
何でイテレータ使わないの? >482
i++使う意味も判らん……
492:デフォルトの名無しさん
07/09/02 01:50:17
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ
for (int i = 0; i < v.size(); i++) v[i] = i;
みたいな。
493:デフォルトの名無しさん
07/09/02 01:59:53
>>491
初心者だからだろ。
そのくらいわかれよ。
494:デフォルトの名無しさん
07/09/02 08:40:18
>>487
できるよ。
495:デフォルトの名無しさん
07/09/02 12:06:53
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。
>>492
ブロック内部でローカル変数作れば解決できそうですね。
またひとつ勉強になりました。
ありがとうございます。
496:デフォルトの名無しさん
07/09/02 13:35:18
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。
497:デフォルトの名無しさん
07/09/02 13:47:29
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて
498:デフォルトの名無しさん
07/09/02 13:50:09
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?
499:デフォルトの名無しさん
07/09/02 13:55:44
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。
500:デフォルトの名無しさん
07/09/02 13:57:46
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。
501:デフォルトの名無しさん
07/09/02 14:26:23
list.assign(map.begin(), map.end()) だろ。
502:デフォルトの名無しさん
07/09/02 14:42:28
>>499
っ アダプタパターン
503:デフォルトの名無しさん
07/09/03 01:48:49
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
public:
typedef T hogeT;
struct fuga {
} m_fuga;
}
main()
{
hoger<int> Hoge;
hoger<型>::fuga &Fuga = Hoge.m_fuga;
}
みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。
504:デフォルトの名無しさん
07/09/03 01:53:00
>>503
うん。
何回も書くようなら typedef しとく。
505:デフォルトの名無しさん
07/09/03 02:01:24
>>500-502
ありがとうございます。もう少し勉強してみます。
506:デフォルトの名無しさん
07/09/03 02:03:57
現状だとtemplateに逃げるしかないな。
507:503
07/09/03 13:52:09
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。
こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。
508:デフォルトの名無しさん
07/09/03 14:09:43
ここも将来的には auto で解決するところかな。
509:デフォルトの名無しさん
07/09/03 20:01:18
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>
510:デフォルトの名無しさん
07/09/03 20:10:05
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり
511:デフォルトの名無しさん
07/09/03 20:26:45
いまさら誰がautoなんて使ってるんだ?
512:デフォルトの名無しさん
07/09/03 20:33:24
俺だよワリオだよ
513:デフォルトの名無しさん
07/09/03 22:17:40
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。
514:デフォルトの名無しさん
07/09/03 22:20:45
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。
515:デフォルトの名無しさん
07/09/03 22:21:25
思いっきりかぶりましたとさ。
516:デフォルトの名無しさん
07/09/03 23:35:13
一つのキーワードに複数の意味なんてstaticで経験済みさ
517:デフォルトの名無しさん
07/09/04 04:09:37
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,
518:デフォルトの名無しさん
07/09/04 04:13:24
>>517
マルチしないでさっさとイネ
519:デフォルトの名無しさん
07/09/04 04:26:42
>>517
setlocale
520:デフォルトの名無しさん
07/09/04 05:33:02
>>519
ありがとう。
調べてみる。
521:デフォルトの名無しさん
07/09/04 07:51:20
>>520
死ねカス
522:デフォルトの名無しさん
07/09/05 00:48:40
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る
523:デフォルトの名無しさん
07/09/05 01:04:21
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。
524:デフォルトの名無しさん
07/09/05 02:36:54
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。
525:デフォルトの名無しさん
07/09/05 10:39:58
わっかたああああああああああああああああああああああ
526:デフォルトの名無しさん
07/09/05 11:00:35
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。
527:デフォルトの名無しさん
07/09/05 15:00:58
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);
C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。
528:デフォルトの名無しさん
07/09/05 15:19:45
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?
529:デフォルトの名無しさん
07/09/05 15:25:51
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。
530:デフォルトの名無しさん
07/09/05 15:51:51
止まるってアプリが強制終了するって事か?
531:デフォルトの名無しさん
07/09/05 16:20:55
入力待ちなんだと思うけどな
532:デフォルトの名無しさん
07/09/05 20:33:36
>>530
vectorの実行するところでループしている感じです
>>531
入力のcinの部分は実行されていました
533:デフォルトの名無しさん
07/09/05 20:48:31
>>527
私の環境では動きましたよ。
534:デフォルトの名無しさん
07/09/05 22:48:50
たまにはexportを思い出してあげて下さい……。
535:デフォルトの名無しさん
07/09/05 22:57:19
C++0xスレにお越し下さい
536:デフォルトの名無しさん
07/09/06 12:02:54
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);
…
}
こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。
わかる方宜しくお願いします
537:デフォルトの名無しさん
07/09/06 12:12:44
>>536
>>531
538:デフォルトの名無しさん
07/09/06 12:19:41
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。
539:デフォルトの名無しさん
07/09/06 12:47:03
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ
540:デフォルトの名無しさん
07/09/06 18:03:38
>>537-539
ありがとうございました。
何とか解決しました
541:デフォルトの名無しさん
07/09/06 18:14:10
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。
542:デフォルトの名無しさん
07/09/06 18:22:47
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。
543:デフォルトの名無しさん
07/09/06 18:35:01
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。
544:デフォルトの名無しさん
07/09/06 18:47:54
と自分へメッセージ
545:デフォルトの名無しさん
07/09/06 19:32:13
>>542=544
プログラマとしても人間としても糞以下だね
546:デフォルトの名無しさん
07/09/06 20:11:09
と糞未満のものが申しております
547:デフォルトの名無しさん
07/09/06 20:37:28
真性だな可哀想に
548:デフォルトの名無しさん
07/09/06 20:58:04
ビクンビクン・・・!!
549:デフォルトの名無しさん
07/09/09 23:45:03
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...
550:デフォルトの名無しさん
07/09/09 23:47:30
>>545
あと、自演乙
551:デフォルトの名無しさん
07/09/10 00:19:22
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな
552:デフォルトの名無しさん
07/09/10 00:58:09
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?
553:デフォルトの名無しさん
07/09/10 01:10:26
肯定的な形でreinterpret_castの
554:デフォルトの名無しさん
07/09/10 01:55:41
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。
555:デフォルトの名無しさん
07/09/10 02:02:42
僕の肛門からも悪魔が出そうです><
556:デフォルトの名無しさん
07/09/10 02:03:29
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?
A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.
557:デフォルトの名無しさん
07/09/10 02:04:32
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。
558:デフォルトの名無しさん
07/09/10 02:08:24
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。
559:デフォルトの名無しさん
07/09/10 02:16:34
メンバポインタは
560:デフォルトの名無しさん
07/09/10 02:20:11
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ
561:デフォルトの名無しさん
07/09/10 02:21:32
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?
無名namespace( namespace { げふげふ } )とかじゃダメなの?
562:デフォルトの名無しさん
07/09/10 02:26:30
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。
563:デフォルトの名無しさん
07/09/10 03:40:05
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。
564:デフォルトの名無しさん
07/09/10 07:42:42
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."
でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."
"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?
565:デフォルトの名無しさん
07/09/10 10:43:59
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える
566:デフォルトの名無しさん
07/09/10 10:56:38
>>564
それだ! 凄いわ。ありがとう。
567:デフォルトの名無しさん
07/09/10 11:03:16
人権擁護委員会が在日を擁護する時
URLリンク(www.kajisoku-f-2.com)
URLリンク(www.kajisoku-f-2.com)
568:デフォルトの名無しさん
07/09/11 11:27:29
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。
//using namespace std;
//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);
list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);
しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?
569:デフォルトの名無しさん
07/09/11 12:01:45
実際にどこが遅いのかを特定するところから始めたらどうだ
570:デフォルトの名無しさん
07/09/11 21:41:35
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください
0x00と"\x00"って何が違うんですか?
571:デフォルトの名無しさん
07/09/11 21:44:53
>>570
数値と文字(列)の違い
572:デフォルトの名無しさん
07/09/11 22:01:11
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;
573:デフォルトの名無しさん
07/09/11 22:13:32
文字は整数です。
574:デフォルトの名無しさん
07/09/11 23:16:31
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
575:デフォルトの名無しさん
07/09/12 00:32:31
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。
576:デフォルトの名無しさん
07/09/12 01:03:12
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。
577:デフォルトの名無しさん
07/09/12 03:26:38
"\x00" == { 0x0, 0x0 }
578:デフォルトの名無しさん
07/09/12 03:40:04
ノ| ,ノ|
( 0x0)b
ノ| ,ノ|
(; 0x0)a
579:デフォルトの名無しさん
07/09/12 19:55:32
>>575
int だったり wchar_t だったりもするけど
580:デフォルトの名無しさん
07/09/12 21:41:34
質問よろしいでしょうか?
/* main.cpp */
#inlucde "test.h"
main()
{
int a=1,b=2;
inlinetest(a,b);
}
/* test.h */
inline void inlinetest(int x,int y);
/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}
上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。
581:デフォルトの名無しさん
07/09/12 21:55:52
> inlineの使い方が間違っているのでしょうか
そうです。
582:デフォルトの名無しさん
07/09/12 23:14:20
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?
583:デフォルトの名無しさん
07/09/12 23:20:50
インライン関数は、普通ヘッダに定義を書く。
584:デフォルトの名無しさん
07/09/12 23:24:30
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。
585:580
07/09/12 23:40:58
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。
丁寧な説明ありがとうございます。
586:デフォルトの名無しさん
07/09/12 23:53:53
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。
587:register
07/09/12 23:56:06
おいらのこともたまには思い出してくれないか?
588:デフォルトの名無しさん
07/09/13 00:25:43
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
589:デフォルトの名無しさん
07/09/13 16:50:41
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。
590:,588
07/09/13 21:06:23
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。
591:デフォルトの名無しさん
07/09/13 22:26:55
>>590
いいえ。
592:デフォルトの名無しさん
07/09/13 23:33:35
それはトムです。
593:デフォルトの名無しさん
07/09/13 23:43:15
tomcat
594:デフォルトの名無しさん
07/09/14 00:01:10
わろた
595:デフォルトの名無しさん
07/09/14 00:03:35
べ、別にわろてなんかいません!勘違いしないでください!
596:デフォルトの名無しさん
07/09/14 11:29:42
トムも仏も無い
597:デフォルトの名無しさん
07/09/15 19:56:06
ところで作りかけのソースあっぷしたら虐めてくれますか?
598:デフォルトの名無しさん
07/09/15 21:39:52
うん
599:デフォルトの名無しさん
07/09/17 03:19:16
あるテキストファイルを行の順番を逆にして出力したいんだけど、
スマートなやり方が思いつきません。
今は
vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;
こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?
600:デフォルトの名無しさん
07/09/17 03:29:23
ファイルを分割して読み込む
601:599
07/09/17 03:41:50
>>600
あーなるほど!
それも一つの手ですね!
602:599
07/09/17 04:01:35
>>600
お礼を言い忘れました。
どうもありがとうございました。
603:デフォルトの名無しさん
07/09/17 05:15:30
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。
同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5373日前に更新/205 KB
担当:undef