1 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:43:34 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
82 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:12:07 ] Effective C++持っているなら演算子の話を是非、 と思ったらMoreのほうだった……、22。 operator +よりもoperator +=を実装しろ。 そして、operator +はこうする。 Mojiretsu operator +(const Mojiretsu& lhs, const Mojiretsu& rhs) { Mojiretsu tmp(lhs); return tmp += rhs; }
83 名前:68 [2008/01/19(土) 21:16:53 ] >>82 どうもです。 実はMoreも持っています。 また実験してみます。 (時間がかかります)
84 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:22:53 ] std::vector使え
85 名前:68 [2008/01/19(土) 22:00:52 ] >>82 ありがとうございました! 動きました! +=を先に定義するというのは 頭いいですねえ。
86 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:12:44 ] 頭がいいっつうか、定石だな。
87 名前:68 [2008/01/19(土) 22:20:59 ] >>86 そういうものなんですね。 >>82 「More」の22の最初のページの一番下に 「単独演算子がfriendである必要はまったくない」と あり82でもfriendがついてませんが、friendにしないと、 lhsが"rerere"のような場合に私のではコンパイルエラーに なったのですが、まだ何かおかしいということでしょうか。
88 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:24:53 ] >>87 publicなコピーコンストラクタはあるか。 +=もメンバならやはりpublicになっている? 82のは、private/protectedなメンバに全く触っていないから friendにする必要がないという仕掛け。
89 名前:68 [2008/01/19(土) 22:32:41 ] >>88 たびたびありがとうございますです。 コピーコンストラクタも+=も+もその他すべての メンバ関数はpublicになっているのですが。。。
90 名前:68 [2008/01/19(土) 22:37:36 ] あ、もしかして、+は82そのままではなく、 privateメンバを触っていますがそのせいでしょうか。 Mojiretsu operator+(const Mojiretsu& str1, const Mojiretsu& str2) { // +演算子 String tmp_moji(str1.s); //←コンストラクタにはクラスの文字列部を渡してます tmp_moji += str2; return tmp_moji; }
91 名前:68 [2008/01/19(土) 22:57:13 ] friendがないと、 error C2804: binary 'operator +' に引数が多すぎます。 error C2333: 'Mojiretsu::operator +' : 関数宣言のエラーです。関数の本体は無視されます っていうのも出たため、実験しましたが、 どの+でもエラーになってます。。。 friendつけている限りまったくwarningさえも出ないのですが。 すいません、時間切れです、明日の夕方、また来ます。
92 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:19:33 ] >>91 来なくていいよ もっと勉強してから来い
93 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:26:25 ] >>91 迷惑です。もう荒らさないで下さい。
94 名前:68 [2008/01/20(日) 00:23:56 ] 大変おじゃまいたしました。 自己解決いたしました。 (error C2804でググって英文を読みました。 確かに読んでいる本ではコード上ちゃんと なっていますがはっきりと言葉では 書いてないんですよねー、、、) >>88 や、その他の方々、重ね重ねありがとうございました。 大変勉強になりました。
95 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:48:41 ] >>94 とりあえず次回のためには自己解決の意味を覚えとけ。
96 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 02:31:03 ] でもクラス定義内でfriend関数を定義できるのは盲点だったと思っている。
97 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 09:50:57 ] >>96 最初から知っていた俺がいる。 ただ、ADLでしかlookupできないというのは盲点だったと思っている。
98 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 11:39:38 ] slashdot.jp/it/07/05/24/2257258.shtml?tid=58 終わってるスキルtop10にCが入ってる c++と区別してcなのか、それともc++込みで終わってるのか
99 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:12:16 ] >>98 そいつバカですね。Cが終わってるなら、C++では重過ぎて 実装できない組み込み機器はどうなるのか?
100 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:31:48 ] アセンブラはリストされてないから大丈夫じゃないか?
101 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:59:28 ] 古いネタの揚げ足とってどうすんだよwww
102 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:24:19 ] >>98 > c++と区別してcなのか、それともc++込みで終わってるのか スラドのくだらない雑談はいいから元の記事嫁よ って元の記事もかなりくだらないな
103 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:04:17 ] C++のコーディング方法について質問です。 皆さんは、コーディング中にコメントアウトを使うでしょうか? 以前、仲間内でコメントアウトの是非で議論になりました。 私の知人はコメントアウトを使用する派で、私は使用しない派です。 皆さんは、コメントアウトの是非についてどう思うかお聞かせください。 なお、開発はVC++6.0、2003、2005などで行っています。 ちなみに、私がコメントアウトを否定する理由は 1.ソースが汚くなるから。 2.バックアップなら、zipか何かにまとめてプロジェクトごとバックアップしておいた方が良いから。 の二点です。 よろしくお願いします。
104 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:38:02 ] コーディングスタイルはスレ違い。 コーディングスタイルにこだわるスレ pc11.2ch.net/test/read.cgi/tech/1193554741/
105 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 06:53:46 ] (コメントがしきい値以下です。)
106 名前:デフォルトの名無しさん [2008/01/21(月) 20:38:50 ] C++は難しすぎ 難易度:2 pc11.2ch.net/test/read.cgi/tech/1071697977/
107 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:37:57 ] 英語圏向けblogでd.hatenaみたいにシンタックスハイライトできるblogないでしょうか?
108 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:45:39 ] スレタイ嫁
109 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 23:33:33 ] C++で作ればいーじゃない。
110 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 02:43:19 ] std::cerrやstd::wcerrの<<オペレータが例外を投げるケースは存在するのでしょうか? これらをcatch文の中で使っても安全なのでしょうか?
111 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 08:49:57 ] >>110 標準ができる前に既にI/Oライブラリは存在していて、後方互換性 のためデフォルトではストリームは例外を投げない仕様だと思った。 exceptionメンバー関数を使ってストリームの各種状態を例外ハンドリング に変えることは可能。
112 名前:111 mailto:sage [2008/01/23(水) 08:50:46 ] ユーザー定義型についてはoperator<<,>>で何をやるかによると思うけど。
113 名前:110 mailto:sage [2008/01/23(水) 14:51:51 ] >>111 basic_ios::exceptionsの存在に初めて気付きました。 おかげですっきりいたしました。 ありがとうございます。
114 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:24:22 ] C++ で new されたオブジェクト(o)とクラス(CLS)が与えられたときに、 そのオブジェクトが CLS クラスのオブジェクトか判定するには どうすればできますか?
115 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:28:43 ] >>114 typeid演算子
116 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:34:33 ] クラスをCLSと表すあたり、COMのCLSIDじゃないかとエスパーしてみる。
117 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 17:11:05 ] >>115 thx >>116 組込みですよ。
118 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:01:08 ] 直接dynamic_castで済むこともあるけどな。
119 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:30:52 ] ただ、dynamic_cast と typeid は意味がちゃうよね。 dynamic_cast はキャスト可能な全ての型で判定が成功するけど、 typeid は(& とトップレベルの const 以外は)厳密に型が一致しないとダメ。 どっちの方がいいというのではなくて目的ごとに使い分けることになるから、 >>114 がどっちの判定がやりたいかによるね。
120 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:58 ] dynamic_castは多相型のポインタとリファレンスにしか適用できないし。
121 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:05:22 ] そうなるとそもそも仮想関数をうまく使えば dynamic_castも要らないだろというところまで話を広げたくなるね。
122 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:28:59 ] 今は typeid で分岐するのが流行りなんだぜ?
123 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:50:25 ] dynamic_cast じゃなくて typeid が必要になる状況ってあんま想像つかない。 どういう時に使うんだ?
124 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:03:45 ] デバッグ用途とかコードジェネレータとか
125 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:35:54 ] 参照への参照 int& & この表記はC++03では認められていませんが、C++0xではint&と等価なものとして 仕様が改定されることは決定済みなのでしょうか?
126 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:52:58 ] ドラフトには入ってたと思うよ
127 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:53:45 ] ただし、テンプレート引数が参照な時だけだっけ? && を素で書くと右辺値参照だったはず。
128 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:52:55 ] >>126 >>127 そうですか。テンプレートパラメータが既に参照の場合、 参照引数を渡すとT& &となりエラーとなるため、これを 回避することだけを目的としてるのかもしれないですね。 type functionを書くのも面倒なので是非改定 してもらいたいです。もしかすると今でもBoostでは便利 なものがあるかもしれませんが。 右辺値参照はC++03では認められていなくて、C++0xでは 正当になる予定ですよね?
129 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:15:13 ] あれ? 離して書くと大丈夫だったかもしれん。 うろ覚えだからドラフト読んでくり。
130 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:24:22 ] >>129 確認してみます。
131 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:34:53 ] 参照への参照なんて使うことあるの?
132 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:47:44 ] >>131 テンプレートでこねこねしていると、うっかり参照への参照という型が生まれることがある。 そんなもの、現状ではコンパイルエラーだが、125に書いてある通り0xだと、 Tへの参照への参照型は、単にTへの参照型として扱われるようになる。
133 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:00:12 ] & & -> & & && -> & && & -> & && && -> &&
134 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:01:32 ] >>132 thx うっかり、ってことは積極的に作るものじゃないって事でOK?
135 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:19:02 ] www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm#s7 www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#References%20to%20References このあたりかな。あまり理解できなかった。 改定理由はテンプレートパラメータの問題としてだけでなく、 右辺値参照との絡みもあるみたいだ。かな?
136 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:35:59 ] &&& はwell-formedなのか気になる
137 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:39:01 ] ill
138 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:58:45 ] >>135 template<typename T1, typename T2, typename T3> void f(T!&& x, T2&& y, T3&& y); 例えば、こんな関数にboost::refで一部の引数だけ左辺値参照にすることができる。 そんなことできて何が嬉しいって、例えばBoost.BindやBoost.Lambdaの関数呼出。 これは& &→&というより、&& &→&の説明になっているけど。
139 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 13:40:10 ] 別に boost::ref などを使わなくても, 普通に左辺値を引数にすれば左辺値参照として bind されるのでは?
140 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:22:36 ] くわしく
141 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:32:53 ] 以下抜粋 1. lvalues can bind to an rvalue reference. 2. struct A {}; void h(const A&); void h(A&&); void g(const A&); void g(A&&); void f(A&& a) { g(a); // calls g(const A&) h(a); // calls h(const A&) } Although an rvalue can bind to the "a" parameter of f(), once bound, a is now treated as an lvalue. >>139 の言うとおりのような気がする。
142 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:02:29 ] そもそもboost::refをなくすための&&ですやん
143 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:17:13 ] いや、&&はmove semanticsのためでしょ。 boost::refはoutパラメータとして使うためにあるんだと思ってる。
144 名前:139 mailto:sage [2008/01/25(金) 13:52:28 ] 以下 C++0x の話で現行の言語規格とは一切関係ないです.スレ違いですいません. >>141 あ,いえ,自分が>>139 で指摘したかったのはたとえば template<typename T> void f(T &&x); があったときに, f を左辺値で呼び出すと T が左辺値参照型で specialize されて f のパラメタの型が左辺値参照型になる,つまり int i; f(i); // T = int & として f が specialization される. // 結果 f のパラメタの型が & && -> & の decay を受けて int & と同等になる f(42); // T = int として f が specialization される. // 結果 f のパラメタの型が右辺値参照型 int && になる ということです.これによって f の引数が非 const 左辺値でも const 左辺値でも右辺値でも 問題なく受けられるようになるということを指摘したかったんです. で,上記の仕様 (引数が左辺値か右辺値かで テンプレートパラメタ T が参照型かそうでないかの違いが生じる) から, f の実装内部において f が左辺値で呼ばれたのか右辺値で呼ばれたのかの識別も可能となります. この 右辺値参照・参照型の decay ルール・関数テンプレートにおける引数推論規則 の組み合わせで the forwarding problem が完全に解けるというのが現在の提案の骨子だったかと思います.
145 名前:139 mailto:sage [2008/01/25(金) 13:54:25 ] あと,実際には>>141 さんが指摘しているように 名前が付いた右辺値参照は左辺値として扱われるので, 右辺値として渡された f の引数を f の内部で引き続き右辺値として扱うには 明示的に右辺値参照に変換してやらないといけないです. で,このために std::forward という補助的な関数テンプレートも提案されています. template<typename T> T &&forward(typename identity<T>::type &&x){return x;} template<typename T> void f(T &&x) { g(forward<T>(x)); // f が右辺値で呼ばれている場合, T が非参照型になっているので // forward の戻り値型が右辺値参照型になり,右辺値として g に渡される. // f が左辺値で呼ばれている場合, T が参照型になっているので // forward の戻り値型が左辺値参照型になり,左辺値として g に渡される. }
146 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 15:50:00 ] >>143 boost::refについて、これ嘘だった。
147 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:25:54 ] まったく話についてけないんだが。 何が左辺値で何が右辺値なんだかもうわけわからん 右辺値で呼ぶってどういうこと?
148 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:44:11 ] template <class T> struct identity { typedef T type; }; template <class T> inline T&& forward(typename identity<T>::type&& t) { return t; }
149 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:49:21 ] >>144 f(i); // T = int & として f が specialization される. T が int & にdeductionされるのって、パラメータが右辺値参照 のときのみのルールですよね?
150 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:52:33 ] Let us first consider the rvalue reference type, T &&, in more detail in the context of the C++ type system. What if T is itself a reference type? Template libraries have been known to create reference to reference types via typedefs or type manipulations. According to the proposed resolution to Core Defect Report 106 , ordinary references obey the equality T cv1 & cv2 & == T cv12 &, where cv12 is the union of cv1 and cv2. A similar reasoning can be applied to collapse two rvalue references into one: T cv1 && cv2 && == T cv12 &&. こいう文書で出てくるcv1やcv2やcv12の数字は何を意味してるんですか?
151 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 17:25:21 ] 区別するため便宜的に番号を振っているだけ。 例えばcv1 = const, cv2 = volatileなら、 vc12 = const volatileだよという話をしたいがためのもの。
152 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:57:19 ] >>151 なるほど。unionは合成の意味ですね。てっきりキーワードもunionかと 思ってしまいました。
153 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:59:08 ] すいません.>>145 で示した forward の定義は 正確には>>148 さんの書いたとおりです. >>147 >何が左辺値で何が右辺値なんだかもうわけわからん 戻り値の型が左辺値参照型でない関数の呼び出し構文(の結果)が右辺値で, それ以外は全て左辺値,という理解である程度通用するかと思います. >>149 全部把握しているわけではないので推測になりますが,恐らくそうだと思います. 後方互換性の観点から考えても, パラメタが右辺値参照型以外の場合は従来どおりの deduction になるかと.
154 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:19:46 ] システムの構造体の定義をXML形式で出力したいんだけど、上手い方法があったら教えてださい。 ある構造体は中にも構造体を保持していて、その構造体は別ファイルで定義してるとか、 ifdefやら二重に定義されてるマクロやらで手動でやろうとするともうワケワカメです
155 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:46:14 ] >>153 The next step is to modify the argument deduction to retain information about the "rvalueness" of the argument: when deducing against a template parameter of the form A1 &&, deduce A1 as a reference type when the argument is an lvalue, and a non-reference type otherwise. According to our T cv1 & cv2 && == T cv12 & rule, this effectively means that the type of the argument will be A1 & when the argument is an lvalue, and A1 && otherwise. どうやら右辺値参照パラメータに対する特別なdeduction ruleみたいですね。
156 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:08:28 ] 独自ネームスペースを持つ外部ライブラリを幾つか利用して大きなプログラムを書くようになったら #include "hoge1.h" …… #include "hogeN.h" #include "mylib1.h" …… #include "mylibN.h" #include <lib1.h> …… #include <libN.h> namespace current_namespace { using ns1::hoge1; …… using ns1::hogeN; …… using nsN::hoge1; …… using nsN::hogeN; …… な感じで各ファイルの先頭が埋め尽くされるようになりました。 皆さん、どのように解決しているのでしょうか?
157 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:51:26 ] 全てのヘッダを include するヘッダを作って、ソースコードの先頭で #include "all.h" とする。
158 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:53:59 ] リコンパイルで半泣きコースだな
159 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:11:45 ] リコンパイルで半泣きといえば、いろんな本で冗長インクルードガードが嫌われてるのは何でよ? VC++2005の #pragma once を使ってる場合ですら200ファイルほどのプロジェクトでリビルド時間が半減したんだけど。
160 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:27:07 ] >>157 using もヘッダん中ですんのか?
161 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:29:14 ] precompiled headerになるようにしときゃいいだろ。
162 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:48:04 ] >>159 よく分からんけど、 #pragma once よりも、 #ifndef XXXXXXX #define XXXXXXX //// #endif の方がビルド時間が短くなるの?
163 名前:くお [2008/01/26(土) 00:49:00 ] c++でエクセル用のアドインを作るやり方を教えてください。 よろしくお願いします。
164 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:59:44 ] >>162 #ifndef XXXXXXX #define XXXXXXX #include "myhoge.h" #endif XXXXXXX とやって include 行を読み飛ばす方法。 myhoge.h にアクセスする必要がない、展開後のファイルサイズが小さくなる、等の理由でビルド時間が短くなることが多い。
165 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:00:16 ] くおーっ!
166 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:01:52 ] >>157 all.h に含まれるヘッダのどれか一つでも更新されると all.h を含むファイルが全てコンパイルされる罠。 all.h をプリコンパイルヘッダにしたところで防げません。
167 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:08:25 ] 批判もいいけど先に解決策を示そうぜ。
168 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:11:42 ] >>164 なるほど。それだとすると、159の >リコンパイルで半泣きといえば、いろんな本で冗長インクルードガードが嫌われてるのは何でよ? の理由は、ヘッダファイル使用時にやることが増えるから。かな? いや、そっちの方が早いってのなら、合理的な理由じゃないとは思うけど 多分159に対する答えは、そんなところだと思う。
169 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:12:55 ] つen.wikipedia.org/wiki/Pragma_once
170 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:39:56 ] 初歩的な質問で申し訳ないのですが、ヘッダファイルの中で行う以下のような 0クリアは問題ないですか?sizeof(this)は正しく計算されます? class HOGE { int a,b,c; char str[128]; void init(void) { memset( this, 0, sizeof(this) ); }; };
171 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:41:18 ] >>170 やってみりゃいいじゃん
172 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:44:07 ] いえ、できれば構文的に正しいのか知りたいのですが… テストのクラスで成功しても、他のクラスでは失敗するかもしれないので。
173 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 02:03:15 ] >>172 コンパイルが通れば、構文的には正しい。 というのは置いといて、 メンバ変数をクリアしたければ、sizeof(*this)とすべき。 そして重要なのは、その方法が使えるのはPOD型だけ。 例えばHOGEに仮想関数を追加すると、動かなくなる。
174 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 02:03:42 ] 構文って意味分かってんのかいな…。
175 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 03:01:40 ] >>173 詳しく有難うございます。納得できました。 >>174 「構文」は間違いでした。>>173 のような事を表したかったのですが、 そういう場合は何と呼ぶべきですかね…
176 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 03:20:13 ] >>175 つか、何がしたいの?
177 名前:デフォルトの名無しさん [2008/01/26(土) 04:53:51 ] 今タイピングのアルゴリズムでゲーム中に「し」を「si」と「shi」のどちらでも受け付けるとような操作を考えています。 現段階では文字列クラスを用意して双方向リンクリストを使って分岐を操作して居るんですが、どうしてもコードが複雑になってしまいます。 もう少し簡単なアルゴリズムや便利なSTLなどがあったら教えてください。 文字列クラス class characterData { private: wchar_t ch; // 単語を構成する文字 Databace* follow; // この文字に続く文字へのポインタ Databace* other; // 分岐文字へのポインタ Databace* rear; // この文字の前の文字へのポインタ public: Databace(); Databace(wchar_t, Databace*, Databace*, Databace*, unsigned char); ~Databace(); // 変数の値を設定する関数群 void setFollow(Databace*); void setOther(Databace*); void setRear(Databace*); void setCh(wchar_t); void setLevel(unsigned char); // 変数の値を返す関数群 wchar_t getCh() const; Databace* getFollow() const; Databace* getRear() const; Databace* getOther() const; }; 文字列を作るクラス class createString { private: Databace* end; // 文字列の最後の文字へのポインタ Databace* div; // 分岐文字がある場合のみendと違う場所を指す void add(const int n, ...); // n個の文字を追加する public: CStrManage(); ~CStrManage(); // elementをローマ字に変換しbaseの後ろに追加する bool convert(const wchar_t* element, Databace* base); };
178 名前:デフォルトの名無しさん [2008/01/26(土) 05:00:27 ] 追加用の関数はこうなっています void createString::add(const int n, ...) { va_list args_pointer; wchar_t* arg_wchar; size_t length; va_start(args_pointer, n); // 文字を分岐させる for(unsigned char i=0; i<n; i++) { arg_wchar = va_arg(args_pointer, wchar_t*); length = wcslen(arg_wchar); // 分岐用文字列を作成する Databace cdb; // ダミーの作成 Databace* tmp = &cdb; // 追加先の指定 Databace* rear = NULL; // 現在地の記憶 // 文字の追加 for(unsigned char s=0; s<length; s++) { Databace* data = new Databace(); if(s==0) { rear = data; } // 追加前の場所を記憶 // 文字データの設定 data->setFollow(NULL); data->setOther(NULL); data->setCh(arg_wchar[s]); data->setLevel(s + 1); if(s==0) { data->setRear(end); } // 前の文字を参照させる else { data->setRear(rear); } // 新しく作った文字列の先頭を参照させる // 文字を追加 tmp->setFollow(data); tmp = tmp->getFollow(); } // 作成した文字をデータベースに追加する if(i!=0) { div->setOther(tmp2->getFollow()); div = tmp; // 作成した文字を追加 div->setFollow(cdb.getFollow()); div = end; // 分岐後の参照先を設定 } else { div->setFollow(cdb.getFollow()); end = div = tmp; } } va_end(args_pointer); }
179 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 05:34:13 ] >>170 sizeof(this) ってポインタのサイズだと思われ sizeof(*this) にしないとだめなんじゃね?
180 名前:179 mailto:sage [2008/01/26(土) 05:36:04 ] って、すでに173で指摘されてた・・・
181 名前:110 mailto:sage [2008/01/26(土) 06:16:08 ] >>177 std::listを使って一本のリストを作って、リストの各要素のオブジェクトを工夫したほうがいいよ。 リストクラス自作するにしても、これはあまりにも酷い。 せめてコンパイルが通りそうなコードを読ませてくれ。
182 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 11:09:34 ] >>175 そもそも、クラスの初期化を外部から行なってはいけません。