C++相談室 part69
..
39:デフォルトの名無しさん
09/05/05 15:17:54
そもそもそれヘッダに書けるの?
MyClass_implの定義は実装ファイル.cppに書かれてるんでしょ?
40:34
09/05/05 15:26:33
>>39
あ・・・そもそもMyClass_implが不完全型だから
fooを持っているかどうか分からないから書けないのか。
ごごごごごごごめん
正直すまんかった。
41:デフォルトの名無しさん
09/05/05 15:32:19
>>38
cppに書けば実装を隠蔽できる
42:デフォルトの名無しさん
09/05/05 15:33:02
>>37
ん?ClassとPlain Old Data、どっちで_implを実装すべきだというのだい?
興味あるからその辺の話を聞かせてほしい。
43:34
09/05/05 15:35:27
>>41
pimplには実装の隠蔽という役割もあったか。
よし、本気で勉強してみるわ。thx
44:デフォルトの名無しさん
09/05/05 15:44:06
POD*を丸々投げ返す様なローカル関数が無けりゃどっちでも良いんじゃないかな
45:42
09/05/05 15:46:08
>>44
ほう、特にどちらでもおk、と。
どうも。
46:42
09/05/05 23:18:16
しかし中々興味深いな。
明確な解ではないとはいえ、私の情報論理構成の範疇外の事象とは。
おっと、言葉が過ぎたようだ。また組織から小言をもらってしまう。
では。
47:42
09/05/05 23:28:50
>>46
おい成りすますなよ
オレオレ詐欺かw
48:42
09/05/06 02:15:10
私はバカです。
49:42
09/05/06 02:16:48
釣れた!
50:デフォルトの名無しさん
09/05/06 12:26:54
std::cout << HOGE << ':' << PIYO << std::endl;
みたいに書く時って、
std::cout << HOGE << ":" << PIYO << std::endl;
とどっちがいいの?
51:デフォルトの名無しさん
09/05/06 13:18:40
どちらでもお好きに。
52:デフォルトの名無しさん
09/05/06 13:20:44
1バイトのみの出力であれば、「NUL文字までループ」しない分、前者の方がわずかながら速いだろう。
しかし気にするほどではない。
53:デフォルトの名無しさん
09/05/06 13:24:50
考え方によっては":"が何回も出て来るなら、
同じ文字列をマージする最適化をコンパイラが行うとかは考えられない?
54:デフォルトの名無しさん
09/05/06 14:13:20
考えたくない
55:11
09/05/06 14:19:35
また来てすみません
コンテナのa < b
lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
sed::setの場合は格納している値を辞書式に比較すると言うことでしたが、
std::mapの場合はどうなるのでしょうか?
mapの格納している要素はkeyと値の組になっていますが
どちらで比較するのでしょうか?
サンプルソース
C++ code - 51 lines - codepad
URLリンク(codepad.org)
mymap<yourmapがtrueとなるのは
Rule1:mymapの最初のkey < yourmapの最初のkey の時。
Rule2:(mymapの最初のkey == yourmapの最初のkey) ならば (mymap[key]で得られる値 < yourmap[key]で得られる値) の時。
Rule3:最初のkeyも最初の値も同じなら、次の要素でRule1, Rule2を適用する。
Rule4:Rule3にてmymapの方がyourmapより先に次の要素が無くなった時。
といった感じがするのですが、ご存じの方いらっしゃいますか?
56:50
09/05/06 14:20:47
>>51-54
どうでも良い程度の差ってことか。
どうも。
57:デフォルトの名無しさん
09/05/06 14:25:31
VS2008をダウンロードして起動してみたのですが、
全くどう使っていいのかわかりません…
画像付きで解説してるサイトはありませんか?
とりあえずハローワールドすら出来ないと泣きそうです
VBAなら少しさわったことあります
よろしくお願いします
58:デフォルトの名無しさん
09/05/06 14:28:56
>>57
★初心者にVisual C++を教えるスレ★ Part33
スレリンク(tech板)
59:デフォルトの名無しさん
09/05/06 14:29:25
URLリンク(msdn.microsoft.com)
60:デフォルトの名無しさん
09/05/06 14:33:21
>>58
おお、そんなスレがありましたか失礼しました
>>59
ありがとうございます!
61:11
09/05/06 15:31:33
>>55
・・・な〜んか違うよーな。
コンテナの比較って相変わらず分からないです。
62:デフォルトの名無しさん
09/05/06 15:39:41
>>61
あってんじゃね?俺も知らんけど、見た感じそうなってると思う。
63:デフォルトの名無しさん
09/05/06 15:56:35
その理解でいいだろ。
lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
は対応するイテレータがそれぞれ参照している要素をoperator<で比較していく。
mapのイテレータが参照しているのはpair<key_type,mapped_type>。
pair<first_type,second_type> x,y に対して x < y が真になるのは
x.first < y.first または !(y.first < x.first) && x.second < y.second が真になるとき。
64:デフォルトの名無しさん
09/05/06 15:58:48
>>63
× !(y.first < x.first) && x.second < y.second
○ y.first == x.first && x.second < y.second
65:64
09/05/06 16:07:08
あ、pairって等価ベースだったか。すまん。
66:デフォルトの名無しさん
09/05/06 17:49:02
本を買って通勤中や暇な時間に勉強しようと思うのですが、
オススメはありますか?
上の方のレス見たらそんな本は捨てた方がいいとか書いてあって怖くなりました(間違った知識がつくんじゃないかと)
とりあえず古本屋も見てみたのですが、10年ぐらい前のしかありませんでした…
67:デフォルトの名無しさん
09/05/06 17:56:43
やさしいC++ 第3版
68:デフォルトの名無しさん
09/05/06 17:58:45
ありがとー!
さっそく買ってきます
69:デフォルトの名無しさん
09/05/06 19:11:35
レビューとか読んでからにしろよ。
70:デフォルトの名無しさん
09/05/06 19:36:39
教えてください、以下のプログラムでいい方法がないものかと。
またはC++的にはこう書いた方が正しい等です。
//-------------------
class AA { int a1; };
//-------------------
class BB {
AA **app;
void setapp(int no) {
app = new (*AA)[no]; //<-ここが不明 エラーになる
}
};
//-------------------
int _tmain(int argc, _TCHAR* argv[])
{
BB dat;
dat.setapp(10);
}
1.<−−ここが不明の部分の書き方
2.こんなのは良くない、もっといい方法がある。
の2つです。お願いします。
71:11
09/05/06 20:30:32
>>62-63
ありがとうございます。
最終的には、>>55の見解で良いとのことですが、
(pairが)等価ベースとはどういう事でしょうか?
72:デフォルトの名無しさん
09/05/06 20:34:12
>>70
エラーメッセージが読めるようになってからまたお越し下さい。
73:デフォルトの名無しさん
09/05/06 20:37:40
>>70
もしかして多言語の経験者かい?
74:70
09/05/06 20:43:33
error C2226: 構文エラー : 'AA' 型指定子の前あるいは内部で構文エラーが発生しました。
エラーメッセージは上記です。 正直わからないから聞いているので。
答えられないのであればあきらめます。
75:デフォルトの名無しさん
09/05/06 20:45:14
>>74
> 答えられないのであればあきらめます。
ああそうか、じゃあ俺の頭じゃ答えられないわ。
76:デフォルトの名無しさん
09/05/06 20:46:35
app = new AA*[no];
77:70
09/05/06 20:52:41
>>76
出来ました、ありがとうございます。
所で、クラスの配列を動的に作ってアクセスする場合。
この様なポインターの配列をnewしてクラスデーターを入れて管理するのは。
ごく普通のやり方でしょうか? どうもなんか、いまいちなような気がして・・・
78:デフォルトの名無しさん
09/05/06 20:53:01
>>70
> 2.こんなのは良くない、もっといい方法がある。
強いて挙げると
newで得た配列はデフォルトコンストラクタでしか初期化されません。
ポインタの(と言いますか組み込み型の)配列となると全く初期化されませんけど大丈夫ですか?
ということと
setappがpublic:じゃいのでアクセスできませんよ。
ということと
忘れずにdeleteしてくださいね
ということと
もしかしたらnewで例外が発生するかもしれませんよ
ぐらいかな。
79:デフォルトの名無しさん
09/05/06 20:57:12
一応、std::vector を使うのがいいかなと思う。std::vector<AA*> って感じ。
これでも>>78の問題はほとんどそのままだが。
80:78
09/05/06 20:58:23
>>77
そもそも>>70だとAAのインスタンスは一つも存在していないんだけど、
それは分かっている?分かっていない?
81:70
09/05/06 21:00:59
public:忘れてました、すみません。 最終的に
//-------------------
class AA { int a1[10]; };
//-------------------
class BB {
public:
AA **app;
void setapp(int no) {
app = new AA*[no]; //<-ここが不明
}
};
//-------------------
int _tmain(int argc, _TCHAR* argv[])
{
BB dat;
dat.setapp(3);
dat.app[0] = new AA();
dat.app[1] = new AA();
dat.app[2] = new AA();
}
こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・
82:70
09/05/06 21:06:15
std::vector 使ったことないです、調べて見ます。ありがとうございます
83:デフォルトの名無しさん
09/05/06 21:08:14
あとはboost::ptr_vector<AA>とか
84:78
09/05/06 21:10:22
>>81
> こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・
>>78にあるとおり、良くない。
いつdeleteするかとか、newが4回あるうちのどこかで例外が発生しうるがその時はどうするかとかは?
たぶんboostないしstd::tr1のshared_ptrが必要になるのではないでしょうかね。
・・・ってstd::vector使ったこと無いのか。
じゃあまずSTLのお勉強だな。
85:デフォルトの名無しさん
09/05/06 21:14:26
STLの前にポインタの勉強からじゃ
86:デフォルトの名無しさん
09/05/06 23:45:57
構成上、どうしてもコンストラクタで例外を投げたいんだけど、
良いんだよね?別に。
そう言うこともあるよね?
87:デフォルトの名無しさん
09/05/06 23:50:53
某サイトで「コンストラクタで例外を投げるな」なんて書いた人がいたけど
基本的には問題ないし、コンストラクタで正常にオブジェクトの構築が出来ないときは
例外を投げるのが最も適切。
もし、気になっている問題があるなら、具体的に書いてもらってもいいけど。
88:デフォルトの名無しさん
09/05/07 00:05:27
>>86
全く問題ないよ。
89:デフォルトの名無しさん
09/05/07 00:13:08
>>71
> (pairが)等価ベースとはどういう事でしょうか?
その元レスは直前のレスに対する独り言のようなものだろうから文面をそのまま受け取っては駄目。
おそらく以下の説明のようなことを踏まえての発言。
pairのoperator<はまずfirst同士を比較して、それが等しければsecond同士を比較するという流れ。
ここで等しければを判定するのに等値かどうかで判定するのではなく等価かどうかで判定する。
90:デフォルトの名無しさん
09/05/07 00:21:12
>>86
後始末が必要なものをしっかりかたづけてればおk。
A(){
h = gethandle(); // 後で明示的に解放する必要あり
/* このあとに例外投げるかもしれない処理を行う */
}
~A(){
releasehandle(h);
}
みたいな場合、例外をコンストラクタの外に投げる前に後始末が必要。
91:デフォルトの名無しさん
09/05/07 00:32:28
「解放すべきもの(newで確保されたメモリや、その他のリソースなど)を保持してデストラクタで解放する」
という仕事をするためのクラスを利用すると、例外に対処しやすい。
そういうクラス自体の設計時は例外安全に注意する必要がある(コンストラクタでうかつに例外を投げてはならない)
が、そういうクラスの利用者のほうは適当に例外を投げてもリソースリークが起こらないようになる。
92:デフォルトの名無しさん
09/05/07 00:44:59
日本語でおk
93:91
09/05/07 01:02:48
>>92は俺に言ってる?
例えばスマートポインタを使う場合が最も分かりやすい。
次のようなクラス MyClass があったとする。
class MyClass {
public:
MyClass();
~MyClass();
private:
MyAnotherClass* p;
};
で、MyClass::MyClass() の内部で p = new MyAnotherClass(); などとして、
MyClass::~MyClass() で delete p; しているとする。この場合、MyClass::MyClass() が迂闊に例外を
スローすると、MyClass::~MyClass() が実行されないためにpが解放されない場合があるから、
例外をスローする場合はpの解放がきちんとされるように、注意深くコードを書かなければならない。
ただし、メンバ変数 p をポインタではなくスマートポインタとすると、そのような注意は不要となる。
例えば std::auto_ptr<MyAnotherClass> p; となっていて、MyClass::MyClass() の内部で
p(new MyAnotherClass()); とした場合、たとえMyClass::MyClass()が例外をスローしても
newされたものはちゃんと解放されるから、神経質にならなくて済む。
忘れてはならないのは、スマートポインタのコンストラクタが迂闊に例外をスローしてしまうと、
結局、リソースリークの可能性は消えないということだ。まあ自分でスマートポインタを書いて使うことは
普通の人はないと思うけど、実際 boost::shared_ptr 等はコンストラクタで例外を投げる場合があり、
その場合でもリソースリークが起こらないようにちゃんと配慮されている。
94:91
09/05/07 01:08:31
ごめん、std::auto_ptr 使って p(new MyAnotherClass()); は無いね。
コンストラクタのメンバ初期化子に書いたと思ってくれ。
95:デフォルトの名無しさん
09/05/07 08:24:20
>>91
「そういうクラス」「そういうクラスの利用者」って何?
「そういうクラスの利用者『のほう』」って何と比べてるの?
96:デフォルトの名無しさん
09/05/07 10:34:03
>>95
文脈から明らかでないか?
97:デフォルトの名無しさん
09/05/07 11:10:34
明らかじゃないから聞いてるんだろ。
明らかだと思うなら、どう明らかか書けばいい。
98:デフォルトの名無しさん
09/05/07 11:16:18
例えば、>>93が>>91の説明であるならば、
>>93に登場するクラスのどれが、「そういうクラス」に相当するのか?
99:11
09/05/07 11:35:51
>>89
等値(equality)
a == b
等価(equivalence)
!(a < b) && !(b < a)
これの事ですね。
ありがとうございました。
100:デフォルトの名無しさん
09/05/07 11:36:10
>>98
std::auto_ptr とか boost::shared_ptr とかが「そういうクラス」。
101:100
09/05/07 11:37:50
まあクラスじゃなくてクラステンプレートか。
std::auto_ptr<MyAnotherClass> とかが「そういうクラス」だと思ってもらえれば。
102:86
09/05/07 11:51:26
>>87-101
サンクス。
でかいクラスじゃなく、リソース漏れも起こすことはないハズのコーディングにしてあるので
大丈夫だ。どうも!
103:デフォルトの名無しさん
09/05/07 15:40:22
>>101
thx
104:デフォルトの名無しさん
09/05/09 16:12:48
std::vector< std::pair< key_t, value_t > > v;
for( std::vector< std::pair< key_t, value_t > >::iterator i = i.begin();....
というコードがあるとして、for文の「std::vector< std::pair< key_t, value_t > >」のように
長いテンプレート型書く必要が多々あり、それが面倒に感じます。
「v.self_type」のような、変数名から型を引っ張ってくるような
仕組みは出来ないものでしょうか?
105:デフォルトの名無しさん
09/05/09 16:15:39
typedef すれば?
106:デフォルトの名無しさん
09/05/09 16:22:02
次期規格でdecltypeというのが出来るが今は無理
107:デフォルトの名無しさん
09/05/09 16:25:10
typedef しとけ
108:デフォルトの名無しさん
09/05/09 16:32:54
>>105-107
承知しました。
ありがとうございました。
109:デフォルトの名無しさん
09/05/09 17:09:32
decltype よりゃ auto じゃね
110:デフォルトの名無しさん
09/05/09 17:10:34
>>107
だからC++03ではtypmlateのtypedefは無理だっつーに
111:デフォルトの名無しさん
09/05/09 17:11:17
×typmlate
○template
112:デフォルトの名無しさん
09/05/09 17:16:55
>>110
部分特殊化のような形の typedef は無理だが
>>104 みたいなのは全く問題ないっつーか、常套手段だろ
113:デフォルトの名無しさん
09/05/09 17:17:48
>>110
パラメータが確定してるテンプレートクラスならできるぞ
できないのはtypedefのテンプレート
114:デフォルトの名無しさん
09/05/09 17:17:57
>>110
・・・まさかやったこと無いわけじゃないよな?
115:デフォルトの名無しさん
09/05/09 17:21:48
typedef typename std::vector< std::pair< key_t, value_t > > hoge;
通りませんでしたよ^^
VC2008
116:デフォルトの名無しさん
09/05/09 17:30:40
typename要らない
117:デフォルトの名無しさん
09/05/09 17:55:02
釣り臭いな
118:デフォルトの名無しさん
09/05/09 18:03:04
>>115
using alias使うんだよ
using hoge = std::vector< std::pair< key_t, value_t > >;
119:デフォルトの名無しさん
09/05/09 18:19:02
素だろ
また的外れてるし。
120:デフォルトの名無しさん
09/05/09 18:48:32
>通りませんでしたよ^^
これは釣りだろ
121:デフォルトの名無しさん
09/05/09 23:06:38
VC++の学習用にサブPCを導入しようと思うのですが、
atom330でも問題なさそうでしょうか
あまりに重そうならE1400辺りで自作しようと思います
122:デフォルトの名無しさん
09/05/09 23:46:34
別に問題ないだろ
IDE使いたいなら話は別だが
123:デフォルトの名無しさん
09/05/10 00:12:43
>>121
全く問題ないよ。
IDE使ったところで問題なんて起きないから大丈夫。
124:デフォルトの名無しさん
09/05/10 00:20:19
VC++2008EE使っていますが、
変数の値を常に表示する方法はありますか?
現在はcout<<hoge;みたいなものを随所に入れています
VBにあったウォッチウィンドウみたいな奴が欲しいです・・
125:デフォルトの名無しさん
09/05/10 00:34:37
メニューの
デバッグ|ウィンドウ|ウォッチ
デバッグ|クイックウォッチ
126:デフォルトの名無しさん
09/05/10 00:34:47
>>124
無いわけ無い。
それともEEだと存在しないとか??
127:デフォルトの名無しさん
09/05/10 00:44:28
>>125-126
URLリンク(www1.axfc.net)
ないっぽいです・・
イミディエイトウィンドウならあるんですが、無料だとこんなものかもしれません
128:デフォルトの名無しさん
09/05/10 00:51:16
>>127
メニューにはデバッグ実行中でないと出てこないはず
というか、初期状態でデバッグ実行したら下に自動変数とかローカル変数のタブ出てこない?
129:デフォルトの名無しさん
09/05/10 00:53:32
確かに間違って閉じちゃうと探すのに苦労するね
130:デフォルトの名無しさん
09/05/10 00:55:52
ああ、出てきましたありがとう!!!
コッソリタブが増えてました
こりゃ気づきませんぜ・・
131:デフォルトの名無しさん
09/05/10 05:03:03
>>130
いや、まぁ・・・気づくけどな。
132:デフォルトの名無しさん
09/05/10 09:21:46
誰でもそりゃわかってりゃ気づくけどな。
普通はなかなか気づかないだろう。
133:デフォルトの名無しさん
09/05/10 09:26:07
VC6の時代から使ってる人なら「必ずあるはずだ」って必死に探すなw
134:デフォルトの名無しさん
09/05/10 09:29:17
有用なサービスほど消えることは無い、 無いよな、 しかし気がつくと、 いや、無いと言ってくれー
135:デフォルトの名無しさん
09/05/10 11:09:06
メニューから消えてるだけのこともある
いくつかのショートカットキーとか
136:デフォルトの名無しさん
09/05/10 17:08:18
動的なハッシュテーブルを作っていて、[]演算子をオーバーロードしようと考えているんですが、
代入する時と参照する時とで挙動が完全に変わってしまいます。
C#のgetメソッドやsetメソッドのような完全な書き分けってどうやるんでしたっけ。
137:デフォルトの名無しさん
09/05/10 17:12:27
そういう書き分けは無いのでやるなら別関数にすれ
挙動が異なるなら、別の表記を取るのが一番間違いが無い
138:デフォルトの名無しさん
09/05/10 17:13:10
書き分けは無理
proxyクラスでも使え
139:デフォルトの名無しさん
09/05/10 17:13:45
const メンバ関数か非 const メンバ関数かという差で挙動を変える事はできるが、
それで大丈夫なものなのかは疑問だ
140:デフォルトの名無しさん
09/05/10 17:14:40
[] の戻り値をクラスにする方法もあるけど・・・
個人的にはあまり好きではないな
141:136
09/05/10 17:16:05
>>137-139
thx
いくらヘルプを読んでも分からないわけだ。
142:136
09/05/10 17:16:58
>>140
やっぱそれしかないか・・・
143:デフォルトの名無しさん
09/05/10 17:18:27
演算子のオーバーロードはあまり乱用すべきものではないので
細かい技法を使わないと演算子のオーバーロードでは実現できないような処理は
普通のメンバ関数にしてしまった方がいいと個人的には思う
144:デフォルトの名無しさん
09/05/10 17:48:08
>代入する時と参照する時とで挙動が完全に変わってしまいます。
同じように見せたいのなら<map>みたいにすればいいと思うけど
145:デフォルトの名無しさん
09/05/10 18:00:21
std::cin >> hoge;で受け取れるような自作クラスMyClassのオペレータオーバーロードはどうすればよいのですか?
std::cout << hoge;ならサンプルコードが良く見つかるのですが。。。
146:デフォルトの名無しさん
09/05/10 18:17:54
同じようにすりゃ良いじゃん
147:デフォルトの名無しさん
09/05/10 18:22:19
>>146
というのは、例えば
std::string str;
std::cin >> str;
としてstrから適切に処理すれば良いってことですか?
148:デフォルトの名無しさん
09/05/10 18:32:28
std::complex<> を参考にしろよ
(n,m) の形式で読み取るが、どのようにして実現しているのか
考えるのも楽しいものだ
149:デフォルトの名無しさん
09/05/10 18:33:27
istream &operator >>( istream&, const MyClass& );
150:147
09/05/10 19:52:38
>>148
ありがとうございます。
さっそく見てみます。
>>149
ありがとうございます。
宣言の方は
std::ostream& operator << 〜
で理解しました。
151:デフォルトの名無しさん
09/05/10 21:46:01
C++ code - 31 lines - codepad
URLリンク(codepad.org)
このソースはgccに付いてきた
std::complex<〜>のstd::istream& operator>>(std::istream&,complex&);のソースなのですが、
この
if (__ch == ')')
__x = complex<_Tp>(__re_x, __im_x);
else
__is.setstate(ios_base::failbit);
が何をしているのか分かりません。
自分なりに推測するとstd::istreamで読み込んでいった結果、所定のフォーマットになっていない(閉じ括弧がおかしい)場合にエラーを伝えるべくsetstateとやらをしているようなのですが、
__is.setstate(ios_base::failbit);
ってどういう意味ないし効力なのでしょうか?
152:デフォルトの名無しさん
09/05/10 22:00:38
std::ios::failbit が立つと、それ以降の入力は一切行われなくなる
これがCとは違う所
この状態をクリアするにはis.clear()を行う
153:151
09/05/10 22:02:27
>>152
フラグ立てですか。
読み込みに失敗したと言うことで、エラー状態にしているわけですね。
ありがとうございます。
・・・でも何で例外を投げる仕様にしなかったのでしょう?
使いづらそうな。。。
154:デフォルトの名無しさん
09/05/10 22:04:40
C++の本ってみんな今何読んでる?
155:デフォルトの名無しさん
09/05/10 22:05:30
今は何も読んでない
156:デフォルトの名無しさん
09/05/10 22:06:21
>>153
例外を投げる事もできる
ただ歴史的経緯があって例外がC++に存在しなかった時代から
iostreamは使われて来ているわけでデフォルトで例外はOFFに
されている
例外を投げるにはメンバ関数exceptions()にトリガとなるビットを
セットすればよい
157:153
09/05/10 22:14:28
>>156
なるほどー!
サンクス。了解できた。
158:デフォルトの名無しさん
09/05/10 22:15:39
>>154
Boost C++ libraries 第二版
159:デフォルトの名無しさん
09/05/10 22:45:39
>>154
はじめてのC。
電車の中で立ち読みして
JKやOLからの冷たい視線でたまらなく興奮する人にお勧め。
160:デフォルトの名無しさん
09/05/10 22:48:21
>>154
やさしいC++
電車の中で読む度胸はないぜ
161:デフォルトの名無しさん
09/05/11 00:01:31
配列に配列を代入したいときは、
配列1[i]=配列2[i]などとしてforで回すのが一般的でしょうか
162:デフォルトの名無しさん
09/05/11 00:04:14
C++なら<algorithm>のcopy関数を使う方が一般的
163:デフォルトの名無しさん
09/05/11 00:05:59
memc(ry
164:デフォルトの名無しさん
09/05/11 00:07:18
つ std::copy
一見関数だらけになるが、恐ろしいほど最適化される。
165:デフォルトの名無しさん
09/05/11 00:09:03
>>162-164
ありがとうございます
とりあえず全部試して見ます
166:デフォルトの名無しさん
09/05/11 08:04:07
>>154
Programming - Principles and Practice Using C++
167:デフォルトの名無しさん
09/05/12 22:16:57
std::vector<char> v(256);
で &v[0] を char 256個の配列として扱って良いものですか?
168:デフォルトの名無しさん
09/05/12 22:41:08
>>167
> &v[0] を char 256個の配列として扱って良いものですか?
v[0]でvの先頭要素のリファレンスが返ってくる。
そして&v[0]はそのアドレスを取得している。
よって先頭アドレスが取得できるのか?ということかい?
たしかOKと聞いたことがあるなぁ。
C++編(標準ライブラリ) 第2章 vector
URLリンク(www.geocities.jp)
の○生の配列との関連のところで。
169:デフォルトの名無しさん
09/05/12 23:11:26
>>167
ええよ
C++98とC++03間の変更点の一つにvectorはリニアアドレス↑に
取られる事が保証されたというのがある
規格票を見れば書いてあるはず
stringはまだでc++0xで保証される予定
170:デフォルトの名無しさん
09/05/13 05:29:54
GUIを考えています。
例えば、ボタンの上にマウスを持っていった時に、ヘルプメッセージを出す事を考えます。
所謂コマンドパターンによる実装になると思うのですが、
ボタンが親子関係でもないオブジェクトの参照を持つ事になり、気持ち悪く感じます。
これは気にしても仕方ない事なのでしょうか?
171:デフォルトの名無しさん
09/05/13 08:13:10
仕方ないというより、別に気持ち悪くないし。
172:デフォルトの名無しさん
09/05/13 18:48:03
履歴一覧を表示する元に戻すボタンでも実装するのか?
>所謂コマンドパターン
って言ってみたかっただけなんじゃ
173:167
09/05/13 21:17:48
>>168, 169
ありがとうございます。
std::string の c_str() のようにポインタを取得するというメソッドが
無いので、もしかしてやっちゃいけないことなのかと不安に思ったのです。
174:デフォルトの名無しさん
09/05/13 21:43:46
C/C++の趣味グラマなんだけど、
アセンブラも勉強した方がいいのかな?
175:デフォルトの名無しさん
09/05/13 21:47:28
わざわざしなくていいと思うよ
意識せずとも、いずれ自然に必要になって自然に勉強してる
176:174
09/05/13 21:52:03
>>175
ほほう、そんなもんなのか。ありがとう。
むしろもうちょっと高級言語も知っとこうかなぁ。。。
177:デフォルトの名無しさん
09/05/13 23:27:37
C/C++をやると平気でインラインアセンブラを書くようになるよな
特にSSE2/SSE3関連は
178:デフォルトの名無しさん
09/05/14 00:48:26
>>171,172
クラスの関連が複雑になるのと、オブジェクトの寿命管理の点が気になりました。
> 履歴一覧を表示する元に戻すボタンでも実装するのか?
これも1つです。
ソースの見通しが悪くなり、あとで機能を追加したいと思った時に困るのではないかと思いました。
179:デフォルトの名無しさん
09/05/14 01:13:32
ササビーってIntelから出るけどあれどうなの?
180:デフォルトの名無しさん
09/05/14 01:53:25
俺、趣味でオセロプログラム書いてるけど、>>177みたいなことに手を出してみた。
最初は難しいイメージがあったが、やってみるとそうでもなかった。
181:デフォルトの名無しさん
09/05/14 02:25:47
0から1の乱数を表示させるプログラムがほしいんですがわかる人いますか?
調べてみてはいるのですが、なかなかうまく動きません。
乱数生成のためのソフトとかはいるのでしょうか?
もしお暇がありましたらよろしくおねがいします。
182:デフォルトの名無しさん
09/05/14 02:30:59
>>181
今、どれくらいの知識を持ってるの? どんなコード書いてみたの?
とりあえず、標準Cライブラリの rand っていう関数は知ってる?
183:デフォルトの名無しさん
09/05/14 02:31:35
double r;
srand((unsigned int)time(0));
r = rand() / RAND_MAX;
printf("%lf", r);
184:デフォルトの名無しさん
09/05/14 02:44:00
static_cast<double>(rand()) / RAND_MAX;だろとツッコミがほしいんだろ
185:デフォルトの名無しさん
09/05/14 02:54:43
>>183
きっと0か1しか返さないぞ。
>>178
>ボタンが親子関係でもないオブジェクトの参照を持つ
ここでいってるオブジェクトってコマンドクラスのこと?
同じボタンの機能がころころ変化するのでもなければ
参照を持つ必要なんて無いと思うけど?
どうしてもUIにヘルプ文字列を埋め込みたくないのなら
コントロールクラスに自分(ボタン)が今どんな機能なのか
問い合わせるメソッドでも作ったら?
186:デフォルトの名無しさん
09/05/14 03:34:01
>>182
rand関数はさっきから学びはじめたばかりです。
知識は基本的なプログラムならつくれる程度です。
187:デフォルトの名無しさん
09/05/14 03:38:42
randは本格用途では使い物にならんぞ
ゲームのサイコロ振るくらいに使うならいいけど
188:デフォルトの名無しさん
09/05/14 03:40:12
>>186
rand関数は、0 から RAND_MAX までの範囲の整数を返す。
(RAND_MAX は実際にはある特定の数値であり、コード中に RAND_MAX と書けばその数値として扱われる)
後は、0 から RAND_MAX までの範囲の整数を、0 から 1 までの間の小数の値に変換すればよい。
>>183-185あたりを参考に。まだ分からんところがあったら聞いてくれ。
もし本格的な乱数を使用したいなら、boostのrandomってのを調べてみるといいが、
まあそこまでする気がないならrandでいいよ。
189:デフォルトの名無しさん
09/05/14 03:43:14
>>187
本格用途ではなくごく簡単なプログラムで、サイコロを振る程度です。
>>188
rand関数について自分でも調べていたところです。
丁寧におしえていただきありがとうございます。
もしわからないことがあったら書き込みたいと思います。
ありがとうございました!
190:189
09/05/14 04:34:11
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
191:189
09/05/14 05:08:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
192:189
09/05/14 05:11:06
すみません一つはまちがいです。
上のプログラムだと乱数表示はされるのですが
一個だけ乱数表示するプログラムを実行すると、何度実行してもほとんど変わらない乱数
(例えば、0.963742 ⇒0.972378 ⇒0.981201など)
になってしまいます。
良い解決方法はないでしょうか?
193:デフォルトの名無しさん
09/05/14 05:37:58
win32環境ならtime()をGetTickCount()なりQueryPerformanceCounter()なりで置き換えるとか。
194:デフォルトの名無しさん
09/05/14 06:28:58
>>185
> ここでいってるオブジェクトってコマンドクラスのこと?
> 同じボタンの機能がころころ変化するのでもなければ
> 参照を持つ必要なんて無いと思うけど?
ヘルプメッセージを表示するクラスのメンバ関数をboost::functionに入れてボタンクラスに渡すという意味です。
Clickなど他のイベントも同様に「他のクラスのメンバ関数をboost::functionに入れて〜」とやっていったらクラスの関連が複雑になるのではないのかと。
また、boost::functionの中で保持されているポインタの寿命(有効か)の不安を感じます。
195:デフォルトの名無しさん
09/05/14 06:33:38
random = (double)rand()/(RAND_MAX+1.0); // に、しとけ。
196:デフォルトの名無しさん
09/05/14 07:42:43
struct A{virtual void operator()()=0;};
struct B:A{virtual int operator()(int)=0;};
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);}};
struct D:A{void operator()(){}} d;
int f(){
C c(d);
c();
return c(1u); // これ・・・
}
コンパイルを通ってしまわない様にするにはどう改造すればいいのでしょう?
197:デフォルトの名無しさん
09/05/14 08:01:28
>>196
コンパイルが通らないようにする方法ならいくらでもわるわけで、
何がしたいのか挙げてもらわないと望む答えは得られないでしょう。
198:196
09/05/14 08:10:12
void operator()(){x();} を書き忘れ
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);} void operator()(){x();}};
199:デフォルトの名無しさん
09/05/14 09:03:46
>>195
なんのために+1.0するの?
200:デフォルトの名無しさん
09/05/14 09:06:17
>>199
結果に整数 N をかけることで、簡単に N とおりの選択に使う乱数が得られる。
「0 から 1 の乱数」が 1.0 を含んでいると、こうはいかない。
201:デフォルトの名無しさん
09/05/14 09:12:53
>>200
今回の目的は
「0から1の乱数を表示させる」
だけど、いいの?
202:デフォルトの名無しさん
09/05/14 09:20:22
>>201
日本語だけでは閉区間なのか開区間なのか、区別がつかないんで、
質問者に判別してもらうしかないな。
簡単なサイコロの用途であれば 200 の性質が役に立つはずなんだけど。
203:デフォルトの名無しさん
09/05/14 09:22:50
簡単なサイコロの用途であれば、
random = rand()%6; // で、十分。
204:189
09/05/14 11:12:04
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
205:189
09/05/14 11:13:50
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
206:189
09/05/14 12:43:26
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
207:195
09/05/14 12:45:45
コンパイラは Borland だろ。
208:189
09/05/14 12:49:10
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
209:189
09/05/14 12:51:07
すみません何度もかきこんでしまいました
210:189
09/05/14 12:55:04
>>202
[0,1)区間となっています。0以上1未満ということです。
サイコロの乱数程度といってしまいましたが
サイコロは関係ありません
211:デフォルトの名無しさん
09/05/14 13:25:26
>>208
windows.hをインクルードしてないとか言うなよ
212:デフォルトの名無しさん
09/05/14 13:29:26
だって、それを書けなんて誰も言ってないじゃないですか。
213:189
09/05/14 13:30:44
>>211
ご指摘ありがとうございます。
してませんでした。
214:195
09/05/14 13:41:16
>>212 コンパイラの名前とバージョンは?
215:デフォルトの名無しさん
09/05/14 23:50:55
すごく初歩的な質問ですが、C++で数字の小数点以下を
繰り上げるには何をつけたらいいんですか?
216:デフォルトの名無しさん
09/05/14 23:53:45
std::ceil()だろ
Cにもある
217:デフォルトの名無しさん
09/05/14 23:55:09
つceil
218:デフォルトの名無しさん
09/05/15 00:16:28
それは「切り上げ」じゃん。ちゃんと答えてやれよ
因みに俺は小数点以下の「繰り上げ」なる概念について知らないので答えられん
219:デフォルトの名無しさん
09/05/15 00:17:50
くだらねえ…
220:215
09/05/15 00:21:12
おかげさまで解決しました。どうもありがとうございましたm(_ _)m
221:デフォルトの名無しさん
09/05/15 00:25:23
ちなみにceil()は負の数は0から離れる方向になるからな
222:デフォルトの名無しさん
09/05/15 09:52:02
>>203
それって偏りが出るよね。
223:デフォルトの名無しさん
09/05/15 10:02:11
RAND_MAXが極端に小さい環境ならね。
32767程度あれば、5461回が5462回になる程度のばらつきだよ。
224:デフォルトの名無しさん
09/05/15 10:22:09
マジで⁉
225:デフォルトの名無しさん
09/05/15 10:23:33
>>222
サイコロに偏りが無いとでも?
226:デフォルトの名無しさん
09/05/15 10:45:40
線型合同法は下位ビットの周期性が
227:デフォルトの名無しさん
09/05/15 12:14:07
テンプレートのテクニックをまとめた、テンプレートの著書を教えてください。
知っているのは、modern C++ と、テンプレートテクニックという本です。
良いサイトや良い本の情報ください。
228:デフォルトの名無しさん
09/05/15 12:26:08
C++ Template Metaprogramming: Concepts, Tools, And Techniques From Boost And Beyond
229:デフォルトの名無しさん
09/05/15 12:53:18
マウスでいまクリック、もしくはドラッグしているファイルやディレクトリのパスを
取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
230:デフォルトの名無しさん
09/05/15 12:56:30
なんでこっちに来たんですか?
231:デフォルトの名無しさん
09/05/15 13:00:38
>>226
そんな乱数でもない数列をrand()という名前の関数の出力にする処理系が悪い。
ゴミだから早急に廃棄しろ。
232:デフォルトの名無しさん
09/05/15 13:39:39
>>225
製作工程の都合で、1,6の面積が微妙に大きいという話しか?
それとも、くりぬかれた目による重心のずれ、密度の偏りの方か?
233:デフォルトの名無しさん
09/05/15 13:55:52
>>228
ありがとうございます。
翻訳出てないんですかね……残念です。
C++の一番の特徴であるテンプレート関係の本が少ないのは何故?
わかりやすくテクニックを知りたいのに
234:デフォルトの名無しさん
09/05/15 15:54:15
すみませぬ JAVAから入っていまC++を勉強し始めたのですが、
C++で、配列で宣言した変数は、跡になってから自らがいくつの要素を持つ配列なのかチェックする方法ってありますか?
Javaだと、
String str[] = new String[3]
のように宣言した場合、
str.length を見れば要素数を見ることができますが、C++の場合は方法ありますか?
235:デフォルトの名無しさん
09/05/15 15:56:52
>>234
ないから素直にstd::vector使っとけ
236:デフォルトの名無しさん
09/05/15 15:57:32
>>234
sizeof(str) / sizeof(str[0]) で自分は調べてる
237:デフォルトの名無しさん
09/05/15 15:58:40
>>236
アホか
238:デフォルトの名無しさん
09/05/15 16:03:46
え?駄目なの
俺も>>236を常用してるけど・・
239:デフォルトの名無しさん
09/05/15 16:07:00
大丈夫、話が噛み合ってないだけだ。
char * foo = new char[3];
した場合は要素数を知る手段はない。
char foo[] = "abc";
した場合は要素数(≠文字数)を>236で得られる。
240:234
09/05/15 16:20:29
ありがとうございます。
C言語の場合、
配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
たとえば10要素の配列を作ったあとに20番目の要素にアクセスしようとすると、JAVAだとぬるぽが出て教えてくれますが、
Cの場合はシステムから見てそれが分からずに、20番(に相当する場所)を読みに行ったり、書き込んでしまう という理解で良いですか?
241:デフォルトの名無しさん
09/05/15 16:25:57
良いです。
ちなみにここはC++のスレです。
242:デフォルトの名無しさん
09/05/15 16:39:03
>>240
そうです
運が良ければアプリ自体が吹っ飛んでくれますが運が悪いとそのままメモリ破壊して動き続けます
なのでJavaしかできない人が集まってC++案件とかやるととても楽しいことになります
243:デフォルトの名無しさん
09/05/15 16:41:59
そもそも、10要素の配列を作ったあとに20番目の要素にアクセスしようとするような奴は
「Javaしかできない人」ではなく、「Javaもできない人」
244:デフォルトの名無しさん
09/05/15 16:47:00
>>240
大きな勘違いをしている。
>配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
配列は、>36でサイズを得ることができる。
つまり、newなんていう外道なモノを使わずに、(昔なつかしの)固定長配列を使うかstd::vectorを使えと言うことだ。
245:デフォルトの名無しさん
09/05/15 20:48:50
Cに配列なんてなかった
246:デフォルトの名無しさん
09/05/15 21:16:41
>>245
何??
247:デフォルトの名無しさん
09/05/15 21:18:10
何の話?
248:デフォルトの名無しさん
09/05/15 21:19:50
ついに狂ったか?
249:デフォルトの名無しさん
09/05/15 21:22:37
Cなんてなかった
250:デフォルトの名無しさん
09/05/15 21:50:31
コンピュータなんてなかった
251:デフォルトの名無しさん
09/05/15 21:52:47
平行世界とつながったな
252:デフォルトの名無しさん
09/05/15 22:09:27
仕事なんてなかった
253:デフォルトの名無しさん
09/05/16 22:00:39
ISOのC++の2003年の規格のJISは訳がひどいですね。
原文の構成もひどいけど。
規格をもっと読みやすくしたような、同じだけ詳しい本ってあるんでしょうか?
254:デフォルトの名無しさん
09/05/16 22:06:55
無いから我慢して読め
255:デフォルトの名無しさん
09/05/16 22:15:03
規格書の文章なんてどれもああいうもんだよ。
訳が酷いわけじゃない。
256:デフォルトの名無しさん
09/05/17 01:01:57
C++は規格自体がひどいから文章もひどくなる
257:デフォルトの名無しさん
09/05/17 01:56:44
C++の文法があまりに酷いもんで翻訳者もイライラしながら
訳してたんじゃないか?w
258:デフォルトの名無しさん
09/05/17 02:35:49
どのくらいメモリを使っているかという情報は型が持っているのだから
例えば、char[3] 型の最初の要素のアドレスをchar*型に代入したら
もうメモリサイズがわからなくなるのは当然といえば当然。
char[3] 型を char[3] 型に代入する分にはちゃんとサイズがわかる。
という感じかしら
259:デフォルトの名無しさん
09/05/17 04:11:03
変数の型も含めてすべてをクラスにってのがJava以降に導入されたもんだからね
260:デフォルトの名無しさん
09/05/17 04:25:19
それは別にJavaで初めてというわけじゃないだろ。
261:デフォルトの名無しさん
09/05/17 08:18:01
Javaも全てがクラスというわけでもないし。
262:デフォルトの名無しさん
09/05/17 08:57:46
全てがクラスになる
unlambdaやれば全てが関数だからオススメ。
263:デフォルトの名無しさん
09/05/17 09:49:55
C++の一行の文字数って標準仕様上、制限ありますか?
またあるとして、現実的に気にした方が良いですか?
264:デフォルトの名無しさん
09/05/17 10:53:44
>>263
言語仕様としてはメモリの許す限りおk
265:デフォルトの名無しさん
09/05/17 10:56:29
メモリの許す限りという制限すらない無制限
266:デフォルトの名無しさん
09/05/17 11:16:18
ありがとうございます。
じゃあ気にせず行きます!
267:デフォルトの名無しさん
09/05/17 11:29:51
80文字が一つの目安だな。
120文字超えてたらちょっとイラッとする。
268:デフォルトの名無しさん
09/05/17 11:32:26
クラスのメンバ関数の返り値は
コピー返しでも可能ならconstにしろ
とEffective C++で言われていましたが、
なぜか返り値がbool型だけはconst付けない風習がありません?
例: bool is_valid() const {return member?true:false;}
この場合も返り値にconst付けた方が良いのでしょうか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5008日前に更新/243 KB
担当:undef