トップページ⇒tech
1001コメント299KB

C++相談室 part76

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/12/16(水) 23:09:53
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part75
http://pc12.2ch.net/test/read.cgi/tech/1259393258/
0153デフォルトの名無しさん2009/12/24(木) 21:04:34
>>152
名前空間に対するusingの話をしているのに何いきなりusing std::swap;とか引き合いに出しちゃってるの?w
文脈が分からないレベルなら日本語を勉強しましょうねw
0154デフォルトの名無しさん2009/12/24(木) 21:06:25
namespace std {
  using ::swap;
}
0155デフォルトの名無しさん2009/12/24(木) 21:09:34
>>152
普通に考えて質問者は、わからなくて質問してるんだから
ムキにならなくてもいいと思うよ
0156デフォルトの名無しさん2009/12/24(木) 21:11:37
>>152
詳しくないって分かるなら教えてあげれば良いのに人の揚げ足取ってばかりで現実でも人望なさそう。
0157デフォルトの名無しさん2009/12/24(木) 21:12:12
152の人気に嫉妬
0158デフォルトの名無しさん2009/12/24(木) 21:18:52
>>151
ということはグローバル空間そのものを否定するか?
初心者が書くコードにいきなりクラスメソッドが出てくるアレなら設計ミスがなかったとでも?
0159デフォルトの名無しさん2009/12/24(木) 21:41:42
>>152の盛大な釣り
                         / ヽ
             >>152          ,/    ヽ
             . ∧_∧   ,/       ヽ
               ( ´∀`) ,/          ヽ
             (    つ@            ヽ
 .__          | | |                ヽ
 |――|        (__)_)                ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|                 ヽ
/⌒\/⌒\/⌒\/⌒\|彡~゚ ゜~ ~。゜ ~ ~ ~ ~~ ~ ~~ ~ ~~ ~~ ~~
⌒\/⌒\/⌒\/⌒\/⌒\彡 〜 〜〜 〜〜 〜〜 〜 〜
                                     │
                                     │
                                     │
                  人人人人人人人       ∧J∧
                 <           >     ( / ⌒ヽ
                 < 吊られちゃった >      | |   | >>○
                 <           >      ∪ / ノ
                  ∨∨∨∨∨∨∨        | ||
                                    ∪∪ >>153
01601472009/12/24(木) 21:52:51
えぇ〜と、結局>>148,>>151あたりの話を信じておk?
0161デフォルトの名無しさん2009/12/24(木) 22:01:03
>>160
おk。
>>152も、
> > そこら辺を考えて設計してるでしょ(知らないけど)
> はい?何を言っているのだ?
このやりとりを
> > そこら辺を考えて設計してるでしょ(知らないけど)
> いいえ、名前が衝突することは標準のstd名前空間といえども
> 特別な対応策がなされているわけではありません。
と解釈するなら信じておk。
01621472009/12/24(木) 22:09:41
>>161
お〜おぉ、助かりました
ありがとうございます
0163デフォルトの名無しさん2009/12/24(木) 22:56:52
>>159
このAA初めて見たわ
0164デフォルトの名無しさん2009/12/24(木) 23:53:14
>>156、次は頑張れw
0165デフォルトの名無しさん2009/12/24(木) 23:56:40
あるクラスの実装を隠蔽してインターフェースだけを提供したいです
返り値などの一時オブジェクトの場合にそれを実現する方法はありますか?
感覚的には↓のようなことがしたいです

http://codepad.org/dhFsqyT1

スマポを使えば可能なんですが、動的確保はコストが気になるので避けたいです
0166デフォルトの名無しさん2009/12/25(金) 00:27:58
>>165
本当に動的確保のコストが問題になるレベルなのか検討してみるのもいいかもね。


0167デフォルトの名無しさん2009/12/25(金) 00:44:55
戻り値で返そうとするなら、GetFinalWidgetを受け取る側がLocalWidgetの大きさを知らないといけない。
逆にそれを隠蔽しようというのだから、どうやっても動的確保するしかないと思う。
0168デフォルトの名無しさん2009/12/25(金) 11:49:00
C は GNU Core Utilities
JavaScript は jquery.js や prototype.js などのライブラリ

などを言語学習には読んでトレースして改造すると
自分にとってすんなり覚えられたのですが、
C++ の場合はどういうものが挙げられますでしょうか?教えやがってください。
0169デフォルトの名無しさん2009/12/25(金) 12:08:52
暗黙的の型変換をする場合にstatic_castがありますが、本当に使っていますか?
dynamic_castとかは便利そうなので、使っている人が多そうですけど
0170デフォルトの名無しさん2009/12/25(金) 12:14:59
double -> int とかの型変換用だっけ?
0171デフォルトの名無しさん2009/12/25(金) 12:16:39
キャストってのは弱虫のマンモーニが使うもの
使わなくても良いように設計できるならそうする
APIやライブラリのせいで使わなくてはいけない状況なら使うが
使わなければいけないように設計することは避けたい
0172デフォルトの名無しさん2009/12/25(金) 12:59:12
>>168
Boost
0173デフォルトの名無しさん2009/12/25(金) 13:13:23
ドリームキャスト
0174デフォルトの名無しさん2009/12/25(金) 13:25:36
>>169
インスタンスの本来の型が分かっている場合のダウンキャストとか
0175デフォルトの名無しさん2009/12/25(金) 13:29:06
reinterpret_cast 最強〜!
0176デフォルトの名無しさん2009/12/25(金) 16:07:46
bregonig.dllってperlの正規表現ができるってあったのですが、つまりはc++でperlを取り入れることができるって意味でいいのでしょうか?
0177デフォルトの名無しさん2009/12/25(金) 16:46:20
+とか(?=とかのパターン指定がPerlと互換だというだけのこと。
0178デフォルトの名無しさん2009/12/25(金) 16:56:59
そうなのですか>>177さんありがとう
Perlの埋め込みはまた別なのですね
0179デフォルトの名無しさん2009/12/25(金) 18:06:09
>>175
多重継承したクラスを扱うときは気を付けろよ
0180デフォルトの名無しさん2009/12/25(金) 18:31:40
c++でヌル文字が途中で入ってる配列の途中からファイルをコピーしたいでござる
どうすればいいでやんす?
0181デフォルトの名無しさん2009/12/25(金) 18:33:21
照れんなよ
0182デフォルトの名無しさん2009/12/25(金) 18:37:22
std::ios::binary
0183デフォルトの名無しさん2009/12/25(金) 18:55:16
>>182
サンキューでござる
くわしくしらべてみるでおじゃるまる
0184デフォルトの名無しさん2009/12/25(金) 20:53:27
>>169
dynamic_castよりstatic_castを使う。
理由はstatic_castの方がが速いから。
0185デフォルトの名無しさん2009/12/25(金) 20:55:02
馬鹿か。
コンパイルタイムにキャストを解決できる時にstatic_castを、動的型付けなオブジェクトに対するキャストではdynamic_castだろうが。
0186デフォルトの名無しさん2009/12/25(金) 21:11:13
>>169
dynamic_castなんて使ってないよ。
大して便利じゃないというか使わなきゃならない状況にならない。
static_castと比較するもなにも、そもそも用途がぜーんぜん違う。

0187デフォルトの名無しさん2009/12/25(金) 21:44:15
httpのメッセージボディのgzipをデコードするにはどうしたらいいですか?
0188デフォルトの名無しさん2009/12/25(金) 23:20:05
気合いでデコードしましょう。
0189デフォルトの名無しさん2009/12/26(土) 00:39:49
>>184
そういうときはboost::polymorphic_downcastがおすすめ。

>>187
zlibでも使え。
0190デフォルトの名無しさん2009/12/26(土) 08:35:51
template<typename To, typename From>
inline To dream_cast(const From &from) { return (To)from; }
0191デフォルトの名無しさん2009/12/26(土) 09:14:55
zlibってインタフェースがわかりにくくね?
わかっちゃうと効率的ですげーなと思うけど
0192デフォルトの名無しさん2009/12/26(土) 11:22:22
>>189
ありがとう。これでやってみます
0193デフォルトの名無しさん2009/12/26(土) 11:49:56
質問があります。

動的に確保した配列にdelete[]を実行すると、しっかりと配列は解放されますよね?
メモリのどこかに配列の長さが格納されていると踏んだのですが…

一体どこに格納されているのでしょうか?
それとも格納はされていないのですか?
0194デフォルトの名無しさん2009/12/26(土) 11:57:48
格納されていますが、それがどこにどのように格納されているかは規定されていませんのでわかりません
01951932009/12/26(土) 12:00:02
VC+Win32 あたりでお願いします
0196デフォルトの名無しさん2009/12/26(土) 12:40:03
>>193
型によっては必要ないので、どこにも格納されてないこともある。
格納されていたとしても、ユーザーがそれを取り出す手段はない。

配列 new/delete なんか使わずに std::vector 使うのがおすすめ。
要素数もちゃんとある。
0197デフォルトの名無しさん2009/12/26(土) 12:47:39
>>193
まず、
クラスのカプセル化という概念を知っているか?
インターフェースだけ理解させてそのクラスの内部の実装は
ブラックボックスにして触れなくて良いようにし、
また触れることを禁じていること。

> メモリのどこかに配列の長さが格納されていると踏んだのですが…
君と同じ発想でコンパイラの作者が作っていればそうなる。
だが上述のクラスのカプセル化と似たように、
どこに長さが格納されて居るだとかそう言った実装については
触れないし触れてはならないことなのだ。

0198デフォルトの名無しさん2009/12/26(土) 13:06:05
vectorって初期化が大変だよな・・・

早くC++0xこないかな
0199デフォルトの名無しさん2009/12/26(土) 13:13:35
>>198
それでも配列 new よりはマシだろ。
0200デフォルトの名無しさん2009/12/26(土) 13:18:11
vectorの値コピーのコストってどれくらい?
0201デフォルトの名無しさん2009/12/26(土) 13:23:44
>>200 O(size)
0202デフォルトの名無しさん2009/12/26(土) 14:03:45
vectorは大量の要素を持った時、アクセスの実行速度が気になる
0203デフォルトの名無しさん2009/12/26(土) 14:52:47
>>202 アクセスは O(1) だから、それは勘違い。
0204デフォルトの名無しさん2009/12/26(土) 14:57:14
>>187
libcurlお勧め
0205デフォルトの名無しさん2009/12/26(土) 14:58:12
>>202
気になるならドキュメント読めよw
0206デフォルトの名無しさん2009/12/26(土) 15:04:26
普通のO(1)じゃないだろ
たまに猛烈に時間がかかるけどたまにだから平均したらO(1)っていうやつ
0207デフォルトの名無しさん2009/12/26(土) 15:05:23
>>206
それは末尾追加( push_back() )の計算時間な。
アクセスはランダムアクセス可能で O(1) だよ。
0208デフォルトの名無しさん2009/12/26(土) 15:10:03
>>206
ドキュメントを読んで!ライフが0よ。
0209デフォルトの名無しさん2009/12/26(土) 15:16:48
もうソース読めよw
0210デフォルトの名無しさん2009/12/26(土) 15:17:50
stlのmapにpush_backしていくと自動的にサイズが増えていくとのことですが、
処理速度向上のため初期サイズを予め決めておくことはできますでしょうか。
0211デフォルトの名無しさん2009/12/26(土) 15:18:55
boost::fast_pool_alloc
0212デフォルトの名無しさん2009/12/26(土) 15:19:15
あれー?
どっかに「このドキュメントでは計算量と言えば全部amortizedのことですよー」って書いてなかったっけ
0213デフォルトの名無しさん2009/12/26(土) 15:29:05
>>210
std::map に push_back() はありません。 insert() のことでしょうか?

メモリ確保のために必要な時間が(ほんとうに)問題だということなら、
operator new (およびその下層)の置き換えやカスタム Allocator の指定が
使えるかもしれません。
0214デフォルトの名無しさん2009/12/26(土) 15:30:25
>>212
そのドキュメントにそう書いてあったとしても、標準規格に書いてないなら関係ないね。
0215デフォルトの名無しさん2009/12/26(土) 15:30:45
>>213
すいませんinsertの間違いでした。
vectorのreserveに相当する関数はないのでしょうか。
0216デフォルトの名無しさん2009/12/26(土) 15:31:47
>>215
無いよ。必要無いだろうし。
0217デフォルトの名無しさん2009/12/26(土) 19:30:09
qt4を使いたいが為にC++の勉強を始めたわけですが、qtにはQ_OBJECTってマクロがあるそうです
マクロって奴はパラーメタ必須ってイメージがありますが、そういうわけじゃないんですかね?
そして、マクロから普通のコードを読み込めましたよね?
0218デフォルトの名無しさん2009/12/26(土) 19:33:42
日本語でおk
0219デフォルトの名無しさん2009/12/26(土) 19:45:39
>>217

> マクロって奴はパラーメタ必須ってイメージがありますが
そんなイメージねぇよww
パラーメタ・・・は まあ おいとく として、どこの言語から来た人?
C系列じゃないよね?

> そして、マクロから普通のコードを読み込めましたよね?
このスレにエスパーはいらっしゃいませんか?
0220デフォルトの名無しさん2009/12/26(土) 19:46:54
呼んだ?
0221デフォルトの名無しさん2009/12/26(土) 19:48:31
1行目だけ意味がわかる。
0222デフォルトの名無しさん2009/12/26(土) 19:49:09
>>220
もうこれ以上スプーン曲げないでくれ。
分かったら帰ってくれ。
0223デフォルトの名無しさん2009/12/26(土) 19:52:54
>>221
残念だがそれは普通の能力だ
02242172009/12/26(土) 19:55:30
>>219
javaから来た人間です
C言語はあんまりわかりません

>マクロから普通のコードを読み込めましたよね?
IOCCCの作品に1文字しか書いていないプログラムがあったような〜
0225デフォルトの名無しさん2009/12/26(土) 20:06:09
マクロから読み込む、という表現がそもそも意味不明なんですよ。
唯一わかるのは、マクロについて根本的な何かを勘違いしているんだろうな、ということで。
0226デフォルトの名無しさん2009/12/26(土) 20:12:22
ひょっとして#includeのことではないか?

だとしても意味はわからない
0227デフォルトの名無しさん2009/12/26(土) 20:17:56
std::coutはストリームなんですよね
std::cout << "hoge";
みたいに、ストリームをフラッシュしないで終了しているコードがあるわけですが
大丈夫なんですかね?
0228デフォルトの名無しさん2009/12/26(土) 20:19:08
>>226
うん。
彼の言うマクロが#includeだとすると、確かに3行目は成立するが、
今度は1行目と2行目がつながらなくなる。

頼む、もうちょっと日本語でおk
0229デフォルトの名無しさん2009/12/26(土) 20:21:10
マクロは俺の認識だと「文字列をあるルールに従って置換する」なんだけど、あってる?
マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
Cプリプロセッサはそこまでじゃないよね。
0230デフォルトの名無しさん2009/12/26(土) 20:31:07
>>227
大丈夫だよ。
でも気持ち悪いよね。
0231デフォルトの名無しさん2009/12/26(土) 20:32:49
>>229
> マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
> Cプリプロセッサはそこまでじゃないよね。
何十年前の話をしているのだい?
そもそもプリプロセス処理というものは…(ryめんどくさ
02322272009/12/26(土) 20:35:47
>>230
ありがとうございます
0233デフォルトの名無しさん2009/12/26(土) 20:37:02
>>227
プログラム終了時に閉じられるから問題ない。
0234デフォルトの名無しさん2009/12/26(土) 20:42:21
>>229
「文字列をあるルールに従って置換する」だけのプリプロセッサで、
簡単な計算もできるようにしてしまうクレイジーなやつが世の中いるものだ。
http://d.hatena.ne.jp/qnighy/20091107/1257587259
http://d.hatena.ne.jp/DigitalGhost/20090624/1245829833
0235デフォルトの名無しさん2009/12/26(土) 20:45:12
Boost.Preprocessor はもう天才的。
プリプロセッサメタプログラミングだぜ?
本当にやりやがった・・・的な衝撃が走る。
0236デフォルトの名無しさん2009/12/26(土) 20:46:17
楽になると人間堕落が進むのさ
学習しなくなるから使わないほうがいいよ
0237デフォルトの名無しさん2009/12/26(土) 20:50:23
>>236
それは違うな
使わなければ学習していくとは限らない

むしろ、使わない方法で満足する場合、それ以上の学習をしなくなる可能性もある。
つまり楽になることと学習しなくなることに強い因果関係はない
0238デフォルトの名無しさん2009/12/26(土) 20:53:06
そんなようなことを言ってバカにされたのが前スレに居たな。
02392382009/12/26(土) 20:53:52
おっとごめん。 >238 は >>236 宛てね。
0240デフォルトの名無しさん2009/12/26(土) 20:57:13
>>236
君は全部アセンブラでコードを書くのですか?
0241デフォルトの名無しさん2009/12/27(日) 11:41:58
virtualがついたメンバ関数は、抽象メソッドではないのですか?
virtualがついたメンバも実装をしている場合があるので
0242デフォルトの名無しさん2009/12/27(日) 11:44:17
>>241
virtual がついていればオーバーライド可能になります。
virtual に加えて = 0 がついていれば、オーバーライドが必須(抽象メソッド?)になります。
0243デフォルトの名無しさん2009/12/27(日) 11:52:40
>>241
抽象メソッドという用語が存在しないので、
君が「抽象メソッド」という言葉にどういった意味を
求めているのか分からん。

> virtualがついたメンバも実装をしている場合があるので
初心者にはロベールのC++教室がオススメ。
例えば
 ロベールのC++教室 - 第14章 仮想関数 -
 ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02014.html
とか。
02442432009/12/27(日) 11:53:57
>>242
> virtual がついていればオーバーライド可能になります。
(まあ初心者向けに教えるならそれでも良いかもしれないが)
別にvirtual付いて無くても、オーバーライド可能か不可能かと言えば
一応可能だよな。デザインとして良いかどうかはともかく。
0245デフォルトの名無しさん2009/12/27(日) 11:54:30
抽象メソッドは
abstract methodだろ?
0246デフォルトの名無しさん2009/12/27(日) 11:57:55
純粋仮想関数のことか
02472412009/12/27(日) 12:02:19
>>243
ひとまず、読んでみます
ありがとうございました
0248デフォルトの名無しさん2009/12/27(日) 12:05:41
>>244
どうやってやるの?
0249デフォルトの名無しさん2009/12/27(日) 12:08:29
>>244はメソッドの隠蔽と勘違いしてるんじゃないだろうか。
02502432009/12/27(日) 12:28:07
>>248
親クラスのメンバ関数をオーバーライドする・・・って話だよな?
どうやってもなにも、普通にできるじゃん。
(俺の > オーバーライド可能か不可能かと言えば一応可能)

ただし親クラスのポインタから呼び出したときに
子クラスのメンバ関数は呼び出されないが。
(俺の> デザインとして良いかどうかはともかく。)

>>249
していないよ。

0251デフォルトの名無しさん2009/12/27(日) 12:31:26
>>249
「override」って言葉の意味分からないなら語るな。
0252デフォルトの名無しさん2009/12/27(日) 12:32:50
>>250
>ただし親クラスのポインタから呼び出したときに
>子クラスのメンバ関数は呼び出されないが。
それってオーバーライドしてないじゃん
■ このスレッドは過去ログ倉庫に格納されています