5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part95

1 :デフォルトの名無しさん:2012/05/08(火) 04:55:24.99
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part94
http://toro.2ch.net/test/read.cgi/tech/1329512856/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1331894668/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

2 :デフォルトの名無しさん:2012/05/08(火) 04:58:34.10
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。

3 :デフォルトの名無しさん:2012/05/08(火) 05:00:06.89
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

4 :デフォルトの名無しさん:2012/05/08(火) 05:02:20.58
■Books■
amazon C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
 http://www.amazon.co.jp/b/?node=754384

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)

5 :デフォルトの名無しさん:2012/05/08(火) 05:03:05.30
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

6 :デフォルトの名無しさん:2012/05/08(火) 09:40:19.69
http://img.2ch.net/ico/boruzyoa.gif
韓国へ、中国の人肉カプセル密輸急増

死産した赤ん坊や乳幼児の遺体からつくられた粉末のカプセルが、
中国から韓国に密輸入されるケースが急増し、韓国関税庁が取締りを強化しています。

 これが摘発された中国製のカプセルです。中には死産した赤ん坊や乳幼児の遺体からつくられた粉末が入っていて、
「滋養強壮剤」として韓国に密輸入されました。韓国では去年8月以降、密輸入が急増しており、
関税庁はこれまでに35件、合わせて1万7000錠以上を摘発しました。いずれも、旅行者の携帯品や国際郵便で持ち込まれたものです。

 色やにおいで識別できないよう生薬などを混ぜたり、他の医薬品の中身だけを入れ替えるなど、
密輸の手口も巧妙になっているということです。

粉末から抗生物質がほとんどきかない「スーパー細菌」が検出されたとして、取締りを強化しています。

(07日17:14)
http://news.tbs.co.jp/newseye/tbs_newseye5023288.html

7 :デフォルトの名無しさん:2012/05/08(火) 12:29:13.26
        , '´  _. -‐'''"二ニニ=-`ヽ、
      /   /:::::; -‐''"        `ーノ
     /   /:::::/           \
     /    /::::::/          | | |  |
     |   |:::::/ /     |  | | | |  |
      |   |::/ / / |  | ||  | | ,ハ .| ,ハ|
      |   |/ / / /| ,ハノ| /|ノレ,ニ|ル' 
     |   |  | / / レ',二、レ′ ,ィイ|゙/   私は只の数ヲタなんかとは付き合わないわ。
.     |   \ ∠イ  ,イイ|    ,`-' |      頭が良くて数学が出来てかっこいい人。それが必要条件よ。
     |     l^,人|  ` `-'     ゝ  |        さらに Ann.of Math に論文書けば十分条件にもなるわよ。
      |      ` -'\       ー'  人          一番嫌いなのは論文数を増やすためにくだらない論文を書いて
    |        /(l     __/  ヽ、           良い論文の出版を遅らせるお馬鹿な人。
     |       (:::::`‐-、__  |::::`、     ヒニニヽ、         あなたの論文が Ann of Math に accept される確率は?
    |      / `‐-、::::::::::`‐-、::::\   /,ニニ、\            それとも最近は Inv. Math. の方が上かしら?
   |      |::::::::::::::::::|` -、:::::::,ヘ ̄|'、  ヒニ二、 \
.   |      /::::::::::::::::::|::::::::\/:::O`、::\   | '、   \
   |      /:::::::::::::::::::/:::::::::::::::::::::::::::::'、::::\ノ  ヽ、  |
  |      |:::::/:::::::::/:::::::::::::::::::::::::::::::::::'、',::::'、  /:\__/‐、
  |      |/:::::::::::/::::::::::::::::::::::::::::::::::O::| '、::| く::::::::::::: ̄|
   |     /_..-'´ ̄`ー-、:::::::::::::::::::::::::::::::::::|/:/`‐'::\;;;;;;;_|
   |    |/::::::::::::::::::::::\:::::::::::::::::::::::::::::|::/::::|::::/:::::::::::/
    |   /:::::::::::::::::::::::::::::::::|:::::::::::::::::::::O::|::|::::::|:::::::::::::::/

8 :デフォルトの名無しさん:2012/05/08(火) 14:45:32.75
mapを使って、いちいちinsertせずに一気に初期化したいのですが、下記のコードはエラーになります。
どのようにすればよいでしょうか?無理かな?
また、一度初期化した後は参照するだけで、マップの中身を弄くるつもりはないのですが
もしこのケースでメモリやアクセス速度を最適化できる方法があれば教えてください。

//とあるシステムのキーコード
struct HOGESYSTEM_KEYDATA
{
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
};
// WindowsのVK_XXと、Hogeシステムのキーコードのマップ(Win->Hogeの変換のみでOK)
map<int,HOGESYSTEM_KEYDATA> WinToHogeKeyMap = {
{VK_SHIFT,{0,0x2a,2}},
{VK_CONTROL,{0,0x1d,2}},
};
よろしくお願いいたします!

9 :片山博文MZボット ◆0lBZNi.Q7evd :2012/05/08(火) 15:44:11.64
>>8
http://codepad.org/3LgLvRwC

10 :デフォルトの名無しさん:2012/05/08(火) 16:23:31.17
>>8
C++11の初期化リストを使いたいなら
HOGESYSTEM_KEYDATA(std::initializer_list<int>)を実装する。


11 :デフォルトの名無しさん:2012/05/08(火) 16:24:45.05
HOGESYSTEM_KEYDATA::HOGESYSTEM_KEYDATA(std::initializer_list<int>)ね。失礼。

12 :片山博文MZボット ◆0lBZNi.Q7evd :2012/05/08(火) 16:51:18.02
識別子がなげーよ

13 :片山博文MZ ◆0lBZNi.Q7evd :2012/05/08(火) 18:23:36.23
C++0xそんな便利なものがあるのか。でも、俺の古いコンパイラじゃ
initializer_listは使えないんだな、これが。

14 :8:2012/05/08(火) 19:30:15.98
>>9
ありがとうございます!
無事に実装できました!

>>10
initializer_listは時間に余裕が出てから勉強させて頂きます!
情報有り難うございました!

15 :デフォルトの名無しさん:2012/05/08(火) 21:14:30.60
教えてください。
今Linux上で作られたC言語ソース(TCP通信系の処理)をWindowsベース(VC MFC)に移植する作業をしているんですが、
コンパイルをすると以下のヘッダがインクルード出来ないってエラーが出ます。
sys/ioctl.h
sys/sockh

で調べたら上記のヘッダはLinux専用(?)なんで、VCでやりたかったらWinsock使いなさいって書かれていましたが、
Winsockで処理を書き直すのが面倒なんで流用出来る方法って他にありませんか?

無い知恵絞って考えたのは、gcc使ってLinuxベースのソースをDLLにしてVCからリンク時に読み込ませれば
良いんじゃないかと思って色々試してるんですが、gcc使ってのDLL化が良く分かって無いので下のサイトを
参考にしたのですが上手く行きません。
http://yun.cup.com/wingccsdl019.html


コンプライアンスの関係上ソースを公開出来ませんが何か良い方法をご存知の方は是非ご教授ください。

16 :デフォルトの名無しさん:2012/05/08(火) 21:18:31.41
>>15
スレ違い。VCのスレ辺りがいいんじゃない?

で、LinuxのソースをLinux上でDLL(so)にしてもVCではリンクできない。
Cygwin上でDLLが作れれば、リンクできるかもしれない。
でもCygwinでioctlまでサポートされているかは微妙。

これらを踏まえると、素直にWinSockで書き直すのが一番手っ取り早いと思う。
つーか、それが面倒な人がDLL化なんて面倒なことができるとは思えない。

17 :デフォルトの名無しさん:2012/05/08(火) 21:21:07.30
>コンプライアンスの関係上ソースを公開出来ません
なら上司に聞けよ屑

18 :デフォルトの名無しさん:2012/05/08(火) 21:45:33.62
>>16
やっぱりそうですか。
通信周りの処理なんですが、既存のAPIと挿げ替えただけで動くと思って安請け合いした結果、
思った以上に面倒だったので困ってしまいました。

あまり手を加えずに既存のソースを流用したかったんですが、難しいですかね。
ありがとうございました。

19 :デフォルトの名無しさん:2012/05/08(火) 22:00:07.36
日本の失われた20年は在日マスコミの大嘘―日本は金融資産を増やし、成長を続けている

クルーグマンが、実は日本の00年代の一人当たりGDPの成長率はEU諸国、そしてアメリカよりも高かった事実を発表した。
バブルによる日本の不景気はあくまでも10年間で、それ以降は実はしっかり成長軌道に乗っていることを示して
失われた20年などというのは間違いで、無知な悲観論者の戯言だったとのこと。

※クルーグマンはノーベル賞やその他の経済学賞を受賞しているアメリカで最も著名な経済学者

http://image.space.rakuten.co.jp/lg01/80/0000186380/72/img66421dc8zik4zj.jpeg

http://noahpinionblog.blogspot.com/2012/01/japan-had-one-lost-decade-but-not-two.html
http://www.nytimes.com/2012/01/08/opinion/sunday/the-true-story-of-japans-economic-success.html?_r=1

20 :デフォルトの名無しさん:2012/05/08(火) 22:22:09.11
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

一応地鎮祭な

21 :デフォルトの名無しさん:2012/05/08(火) 22:55:42.98
もう何年前になるんだっけそれ

22 :デフォルトの名無しさん:2012/05/08(火) 22:58:42.97
winsock と Linux のソケットってそんな違いあったっけ?

23 :デフォルトの名無しさん:2012/05/08(火) 23:02:42.12
read/writeと非同期

24 :デフォルトの名無しさん:2012/05/08(火) 23:14:08.25
AF_UNIXが使えないとか、いくつか関数名が違うとか、インクルードファイルが全然違うとか、
初期化してやらないとまともに動かねぇとか、selectがソケットしか受け付けねぇケチ仕様だとか、
struct in_addrのメンバが違うとか、それくらいかねぇ?

25 :デフォルトの名無しさん:2012/05/09(水) 03:46:32.58
>>21 http://logsoku.com/thread/hibari.2ch.net/tech/1291890680/24

26 :デフォルトの名無しさん:2012/05/09(水) 07:02:21.45
double x,y;
に対して、
!(x>y)

x<=y
の結果って同じですか?
(infとかnanを気にしているわけではありません)

27 :デフォルトの名無しさん:2012/05/09(水) 07:31:29.22
誤差を考慮する必要がある

28 :デフォルトの名無しさん:2012/05/09(水) 07:39:26.70
そこがよくわからないのですが、
ビットレベルでそれぞれの不等式を実装した時にどういうことをやってるか教えてもらえませんか?
自分はx<=yを使わないようにしているのですが、誤差の意味でx<yのほうが優れていると言い切っていいのですか?

29 :デフォルトの名無しさん:2012/05/09(水) 07:56:04.13
同じですか?なら同じと言っていい

何をしたいかによるが、前後の誤差を考慮することが多いという話

30 :デフォルトの名無しさん:2012/05/09(水) 08:02:45.17
x yがともに浮動小数点数の計算結果の場合、


31 :デフォルトの名無しさん:2012/05/09(水) 08:04:58.85
…誤差がありうるから、等号を含む比較にあまり意味がない

32 :デフォルトの名無しさん:2012/05/09(水) 08:49:15.53
template <T,U>
bool compare(T x, U y) {
return x<=y;
}
みたいに使うので、intの場合にも同じ実装が使えることは(いまの目的では)けっこう重要です。
上にあるようにビットレベルで同じなら何の問題もないですよね?

33 :デフォルトの名無しさん:2012/05/09(水) 11:09:32.29
浮動小数点の何を等しいとするかは
目的とする精度によって違うから

34 :デフォルトの名無しさん:2012/05/09(水) 11:15:30.34
>>32
あんたがそれでいいのなら、それでいいよ。
うちじゃ話にならないけどね。

35 :デフォルトの名無しさん:2012/05/09(水) 13:52:50.05
>>34
単純な話、
bool compare(double x, double y) {
return !(x>y);
}

bool compare(double x, double y) {
return x<=y;
}
の結果が、doubleで許される全値の組み合わせについて同じかどうか聞いてるだけなんですが。
違うなら違うと言ってくれたらいいのに。

36 :デフォルトの名無しさん:2012/05/09(水) 14:25:50.25
全値の組み合わせを試せばいい

37 :デフォルトの名無しさん:2012/05/09(水) 15:00:59.78
心配なら8桁ぐらいで切り捨てておけ

38 :デフォルトの名無しさん:2012/05/09(水) 15:57:01.60
>>35
それが同じかどうかは環境依存。

39 :片山博文MZボット ◆0lBZNi.Q7evd :2012/05/09(水) 16:41:00.33
>>35
コンパイラのアセンブリ出力オプションを試せば、
!(x>y)とx<=yの違いが分かる。

40 :デフォルトの名無しさん:2012/05/09(水) 18:29:51.05
シングルトンってRelease()があるのが一般的なの?
解放した後に再確保できると、シングルトンと
グローバル変数のインスタンスと違いがはっきりするけど。

初期化が一度しか行われないこともシングルトンの用件だとしたら
解放されちゃまずいよね。

41 :デフォルトの名無しさん:2012/05/09(水) 18:54:59.09
俺ならとりあえずRAIIなラッパかデリータ付きスマートポインタで
参照カウンタ付けとく
カウンタ0で解放とかするかどうかは内容次第じゃね

42 :デフォルトの名無しさん:2012/05/09(水) 19:34:42.86
別に”シングルトン”の条件なんてどうでもいいな
そんな概念なんて教条的なOOPデザパタカルトのキチガイが気にするだけ

43 :デフォルトの名無しさん:2012/05/09(水) 19:53:40.54
デザパタって「名前付けただけ」なんだよね
初心者への紹介も兼ねるけど

44 :デフォルトの名無しさん:2012/05/09(水) 20:53:21.87
いや。デザパタ本にも書いてあるけど、
デザパタがあって、名前がある。
まだ名前の無いデザパタも複数有る。
デザパタ本は、前書きに有るとおり、
複数あるデザパタから特に良く使うものを抜き出して
紹介しているだけで、デザパタ本に書いてなければ
デザパタに非ずというような物でもない。

45 :デフォルトの名無しさん:2012/05/09(水) 20:55:50.34
>>40
手段を目的にするなよ。
目的が達成できて問題がなけりゃ
どんな形式でもいいだろうが。

46 :デフォルトの名無しさん:2012/05/09(水) 22:10:34.39
>>44
複数あるって何だよw有限個じゃねーんだから
設計なんて無数だろ

名前が付いて初めてデザパタだよ
アレは銀の弾丸なわけでもなく
名前を付けることが他者との意思疎通に有用ってのが主旨だろ

典型例の紹介だけなら入門書にでも書いときゃいいんだよ

47 :デフォルトの名無しさん:2012/05/09(水) 22:37:45.31
>>46
「オブジェクト指向における再利用のためのデザインパターン 改訂版」
本位田 真一/吉田 和樹 監訳

この本のp13〜15に書いてあった内容引っ張っただけだし、
お前は、お前のデザパタ定義を貫けばいいんじゃないか?

48 :デフォルトの名無しさん:2012/05/09(水) 23:00:49.21
シングルトンクラスの利用者は
コンストラクタ・デストラクタを意識しなくていいよね?

49 :デフォルトの名無しさん:2012/05/09(水) 23:07:08.47
>>47
ああ、お前もお前のデザパタ定義を貫けばいいと思うよ

Design Patterns: Elements of Reusable Object-Oriented Software
>In general, a pattern has four essential elements:

>1. The pattern name is a handle we can use to describe a design problem, its
solutions, and consequences in a word or two. Naming a pattern immediately
increases our design vocabulary. It lets us design at a higher level of
abstraction. Having a vocabulary for patterns lets us talk about them with
our colleagues, in our documentation, and even to ourselves. It makes it
easier to think about designs and to communicate them and their trade-offs
to others. Finding good names has been one of the hardest parts of developing
our catalog.


50 :デフォルトの名無しさん:2012/05/09(水) 23:07:52.05
常識的な範囲内で美味いことやってくれるはずだから気にしなくて良い。

51 :49:2012/05/09(水) 23:11:59.82
一応ソースってことで
http://my.safaribooksonline.com/book/software-engineering-and-development/patterns/0201633612/chapter-1-introduction/3

52 :デフォルトの名無しさん:2012/05/09(水) 23:19:23.92
>>49
そらデザパタカタログに乗ってるものは名前ついてるわなw
一部だけ抜粋するんじゃなく、金だして一度全文読んどけよ

53 :デフォルトの名無しさん:2012/05/09(水) 23:30:04.50
どうでもよろ

ま、デザインパターンの意図としてはパターンを有限個にしたいということであって>49で正解だが
可算無限濃度の設計の中から残すだけの価値があるパターンがこの先可算無限濃度見いだされる可能性は
>49とて否定できないハズ
なにしろ「洗練されたコード」と言うのと同じで数学的基準があるようでない世界だからな

54 :デフォルトの名無しさん:2012/05/09(水) 23:45:47.55
「何がパターンで、何がパターンでないかは、人それぞれである。」

55 :デフォルトの名無しさん:2012/05/09(水) 23:53:26.18
パターン入った!

56 :デフォルトの名無しさん:2012/05/09(水) 23:56:24.63
シングルトンさえできりゃ他はいらん

57 :デフォルトの名無しさん:2012/05/10(木) 00:01:07.16
>金だして一度全文読んどけよ
いや、お前が読んどけよ
どうやってあのURLを見つけたと思ってんだよ

>>53
俺は>>44
>まだ名前の無いデザパタも複数有る。
を否定しただけ
カタログにした理由、名前を付けることの意義
何故GoFがパターンに不可欠な4要素の第1項目をpattern nameにしたか、そういった話

あれを「さいきょうの設計かたろぐ」だと思ってる層から
意味不明な信者と、アンチが出てくるんじゃないかね

58 :デフォルトの名無しさん:2012/05/10(木) 00:02:18.35
>>56
Factory MethodとStateぐらいは知っとこうよ

59 :デフォルトの名無しさん:2012/05/10(木) 00:06:38.78
>>48
しなくていいけど
むしろシングルトンであることを意識しないで済む方がいいと思う
後でシングルトン(プロセス毎)からスレッドローカル(スレッド毎)に変える場合も楽

60 :デフォルトの名無しさん:2012/05/10(木) 00:08:57.21
スレッドってどういうところに使ってるの?

61 :デフォルトの名無しさん:2012/05/10(木) 00:14:22.10
>>58
んなもん聞いたことないわ

62 :デフォルトの名無しさん:2012/05/10(木) 00:19:12.98
>>60
forkが使えない環境のときとか
GUIで重い処理中にキャンセルボタン出すときとか

63 :デフォルトの名無しさん:2012/05/10(木) 00:20:49.30
>>60
ついぞ昔ならGUIプログラムの非GUI処理。
特にI/O関係。マルチプロセッサーやマルチコアが
現れてからは、並行処理で使われる事が増えつつ有る。

64 :デフォルトの名無しさん:2012/05/10(木) 00:22:05.96
>>56
Singletonの方がよっぽど要らんだろうに・・・

65 :デフォルトの名無しさん:2012/05/10(木) 00:27:55.90
結局はお互いのクラスでデータをやりとりできりゃ何でもできるようになった
シングルトンを知ってすべて解決した

66 :デフォルトの名無しさん:2012/05/10(木) 00:33:25.78
グローバル変数より幾らかマシってものだしな

俺は実態がシングルトンでも
初期化引数かスレッドローカル経由かインジェクションで
xxxContextとかを渡す方が好み

67 :デフォルトの名無しさん:2012/05/10(木) 00:41:28.38
>>61
Factory Methodを使うとC#におけるBeginInvokeみたいなことがサッと安全にできる
ていうかFactory Methodでクロージャを生成するのだと考えればマルチスレッド状況をスキーリ安全に扱える

Stateはキーマトリックスの処理ルーチンを書くのに個人的に重宝した

>>56
マルチスレッド状況下で呼ばれるSingletonは奥が深い…




68 :デフォルトの名無しさん:2012/05/10(木) 00:45:48.49
フィライウェイトとか、ファクトリーとか入出力と組み合わせる事は有るけど、
クラスの外から見て状態を持ち変化があるものには絶対つかわんな
ループ中にどっか別の関数でシングルトンが書き換えられてたらデバッグしづらすぎる


69 :デフォルトの名無しさん:2012/05/10(木) 01:10:58.56
グローバル変数がごく簡単に使える C++ でシングルトンとかマッチポンプすぎる。

70 :デフォルトの名無しさん:2012/05/10(木) 01:14:27.49
グローバル変数を使うのが難しい言語の方が珍しいだろ

71 :デフォルトの名無しさん:2012/05/10(木) 01:26:41.19
別にC++もJavaも変わらないよな
http://ideone.com/aOWhQ
http://ideone.com/rPUpT
グローバル変数に直よりかは関数経由でアクセスしたり仮想関数使える方が良いだろう
まぁグローバル変数もシングルトンも使わない方が良いけど

72 :デフォルトの名無しさん:2012/05/10(木) 09:59:09.71
自前クラスはポインタ使わず全部参照でやっていますが、
メソッド関数を呼び出すコードを見て、
「この変数は値を渡しているだけなのか、書き換えられて返ってくるのかどうか」がぱっと見分かりません。
(引数がconstかどうか調べれば判断つきますが、面倒で付けずに済ますこともあるし、呼び出し側のソースを流し読みしてるときに分かりずらい)

書き換えないなら必ずconst、呼び出し側のソース見てるときは、メソッドにマウスカーソル合わせて引数をチェック、
というやり方しかないのでしょうか?

73 :デフォルトの名無しさん:2012/05/10(木) 10:07:28.94
>>72
そういうことにならないように関数名や引数並び、引数に使う変数名をちゃんとつける。
どうやったところで関数宣言を見ないのなら正確に把握というわけにはいかない。

74 :デフォルトの名無しさん:2012/05/10(木) 11:18:37.08
>>72
それを嫌って、書き換える場合はポインタ、書き換えない場合はconst参照、と使い分ける人もいる。
私の場合、関数名にgetなどが含まれていて戻り値のない関数は、一番目の引き数が書き換え対象だ。

75 :デフォルトの名無しさん:2012/05/10(木) 11:57:23.49
bool hoge(){
bool result = false;
/* いろいろ処理*/

// 戻り値の用意
return (ioResult&&sockResult&&time<10);
}

なんて関数をコーディングした場合、
if(hoge())
ではなく、戻り値必要ないので
hoge();
なんて書いた場合は、コンパイラの最適化でvoid版hoge()を作って、returnの行を出力しない、
みたいなことはしてくれるんでしょうか?
普通にbool版hoge()が呼ばれて、普通に関数内全部実行して、戻り値はテンポラリかなにかに入れてすぐ捨てるんでしょうか?

76 :デフォルトの名無しさん:2012/05/10(木) 12:02:41.77
>>75
return の式に非ローカルな副作用が一切無いのであれば、そういう最適化は可能ではある。
ただしあまり大きな違いにはならなさそうなので、実際に最適化されることは少なくとも現時点では
あまりないだろうと思うし、気にするべきでもないと思う。

77 :デフォルトの名無しさん:2012/05/10(木) 12:04:56.89
最適化されたコードのレジスタ確認してください

78 :デフォルトの名無しさん:2012/05/10(木) 12:27:30.80
>>75
そのhoge()が同一翻訳単位内から呼ばれた場合は、インライン展開される場合がある。
そのとき、そのreturn文には副作用がないので省略される可能性は高い。
# 一部のコンパイラでは、同一翻訳単位外からでも最適化されうる。
とは言え、void版のhoge()が用意されるわけではない。

79 :デフォルトの名無しさん:2012/05/10(木) 12:34:37.23
>>75は無理だろ。
hogeがstatic関数とかでコンパイル単位内ローカルなら可能かも知れんが
やってるコンパイラは無いだろう。

80 :デフォルトの名無しさん:2012/05/10(木) 13:01:08.60
ああそうかインラインなら最適化できるね

81 :デフォルトの名無しさん:2012/05/10(木) 13:41:32.29
staticじゃなくてもVC++のLTCGとかならやってくれるんじゃね

82 :デフォルトの名無しさん:2012/05/10(木) 13:57:55.02
>>81
確かにそうかも。試してないけど。
最適化技術って進んでるんだね。

83 :デフォルトの名無しさん:2012/05/10(木) 22:33:31.08
Microsoft (R) C/C++ Optimizing Compiler ならDLLに入ってても
インライン展開してくれるし、親クラスにキャストしてるオブジェクトの
仮想関数ですらインライン展開してくれるからな。

84 :デフォルトの名無しさん:2012/05/10(木) 23:14:48.25
オブジェクトファイルかなんかと勘違いしてんじゃないか

85 :デフォルトの名無しさん:2012/05/10(木) 23:23:53.10
勘違いってなんの事を言っている?

インライン関数のインポートとエクスポート
http://msdn.microsoft.com/ja-jp/library/feffc7b5(v=vs.80).aspx

86 :デフォルトの名無しさん:2012/05/10(木) 23:52:13.14
それはインライン関数をDLLに入れられるって話で
DLL内の関数をインライン展開できるって話じゃないだろ

87 :デフォルトの名無しさん:2012/05/10(木) 23:58:02.23
意味が解らないの?

注意
インポート インライン関数は、DLL のバージョン間で矛盾することがあるので、
インライン関数のインポート時は注意が必要です。インライン関数は、アプリケーション コード内に展開されます。
このため、関数を書き直した場合は、アプリケーション自体をコンパイルし直さないと、
インライン関数は更新されません。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。


88 :デフォルトの名無しさん:2012/05/11(金) 00:20:06.29
それのどこがDLLの関数をEXE側でインライン展開できると読めるんだ?

89 :デフォルトの名無しさん:2012/05/11(金) 00:23:33.94
namespaceの別名って、undefみたいに消せないのか?
どうせアセンブリコードに展開したときは、本来の名前空間の
名前になるんだから、不要になったら削除できてもいいだろうに

90 :デフォルトの名無しさん:2012/05/11(金) 00:26:30.84
>>88
インライン展開しないなら、こんな事わざわざ書く必要ないだろ。
逆に「DLLにインライン関数定義してもインライン展開できません」と書くのが筋だろ。

>インポート インライン関数は、DLL のバージョン間で矛盾することがあるので
>。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。

91 :デフォルトの名無しさん:2012/05/11(金) 00:38:58.63
インライン関数を定義したヘッダとDLLが矛盾するケースがあるって話なんだが、それ
そもそも、リンク時に使うのはインポートライブラリであってDLLそのものは一切使わない


92 :デフォルトの名無しさん:2012/05/11(金) 00:44:47.35
ヘッダーじゃねぇよ。cppに定義して、__dclspec(export) inline 〜と書いた関数でも取り込まれる。
DLLを参照してるアプリケーションをコンパイルするとき、DLLが参照できればぶっこ抜かれるんだよ。


93 :デフォルトの名無しさん:2012/05/11(金) 03:34:47.68
韓国で貯蓄銀行4行また営業停止
仰天!会長は元偽ソウル大生、中国密航で逮捕
http://jbpress.ismedia.jp/articles/-/35163



自己資本比率5.6%、実はマイナス16.2%だった

営業処分の直前に漁船で密航を試みた会長の正体

金会長は、未来貯蓄銀行に対する営業停止処分が不可避と見て、かねて準備していた密航ルートを使って中国に逃亡しようとした。
金融委員会は未来貯蓄銀行など4つの貯蓄銀行を営業停止処分とした。
来貯蓄銀行の場合、粉飾決算を重ね、「5.67%」と発表していたBIS基準に基づく自己資本比率が実際はマイナス16.2%であることが明らかになった。
http://jbpress.ismedia.jp/articles/-/35163

◆貯蓄銀行とは庶民専用の銀行

貯蓄銀行(ちょちくぎんこう)とは、個人の貯蓄を引き受けることを主目的とする金融機関である。
庶民に対して倹約を奨励し貯蓄により生活を安定させるための公益的な金融機関。
http://ja.wikipedia.org/wiki/%E8%B2%AF%E8%93%84%E9%8A%80%E8%A1%8C

94 :デフォルトの名無しさん:2012/05/11(金) 05:33:41.33
struct X {
const int x;
X(istream& is) try: x(read_int(is)) {
catch (何か) ...
}
const int read_int(istream& is) const {
int x;
is>>x;
if (x<0) throw 何か;
return x; }
};

int main()
{
X a(cin);//負の数が与えられるまで読み続ける
}

みたいなことってできませんか?

95 :デフォルトの名無しさん:2012/05/11(金) 06:21:28.72
X(istream& is) {
int x;
for (;;) {
is >> x;
if (!cin) {
cin.clear();
cin.ignore( 1024, '\n' );
continue;
}
if (x < 0);
return ;
}
};

96 :デフォルトの名無しさん:2012/05/11(金) 06:30:32.40
>>94
何がしたいの?

97 :デフォルトの名無しさん:2012/05/11(金) 06:50:37.13
>>94
のポイントは、
- constメンバを初期化子を使って初期化していること
- tryブロックをそこにかまして、例外処理にしていること
です。
無論、95みたく普通にやればいいのだが。

98 :デフォルトの名無しさん:2012/05/11(金) 07:11:41.62
>>95
はread_intね。いけてる気がする。

99 :デフォルトの名無しさん:2012/05/11(金) 07:19:17.27
try {
cin >> x;
} catch (...) {
入力を求める
}
みたいなことを初期化子についてやりたかった。

100 :デフォルトの名無しさん:2012/05/11(金) 07:33:31.87
int read_int(istream& is) {
try {
int x;
cin >> x;
return x;
}
catch (...) {
return read_int(is);
}
}
みたいな雰囲気。
例外の使い方がよくわからないし、istreamは例外投げないのかな・・・
ひっかかってくれない。

101 :デフォルトの名無しさん:2012/05/11(金) 07:39:30.34
try {
int x=-1;
cin >> x;
if (x<0) throw x;
return x;
}
catch (int input) {
cerr << input << endl;
read_int(is);
}
でイケた。かっこよくね?

102 :デフォルトの名無しさん:2012/05/11(金) 07:42:50.74
初心者だからアホーなことしてたら指摘してほしいです。
こんなので大丈夫なのかしら・・・。

103 :デフォルトの名無しさん:2012/05/11(金) 07:44:39.57
status = !status;

これが右に偏ってる気がして気持ち悪いんだけど
どうにかならない?

104 :デフォルトの名無しさん:2012/05/11(金) 08:19:53.45
うん

105 :デフォルトの名無しさん:2012/05/11(金) 08:30:41.25
intだと上のでいいのですが、
double x; cin >> x;
の結果がよく分かりません。

stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、
doubleなのでx==0で判定するのも気持ち悪い。
cinが例外飛ばしてくれたりしますか?

106 :デフォルトの名無しさん:2012/05/11(金) 08:36:01.98
飛ばさねーよ

107 :デフォルトの名無しさん:2012/05/11(金) 08:43:35.84
やっぱif(cin>>x)で判定して、自分で例外飛ばせばいいか。

108 :デフォルトの名無しさん:2012/05/11(金) 08:51:53.96
ところで95で
cin.ignore(1024,'\n');
としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね?
決め打ちを避けたいだけなんだけど。

109 :デフォルトの名無しさん:2012/05/11(金) 08:56:45.82
>>105
std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。
cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。

110 :デフォルトの名無しさん:2012/05/11(金) 09:03:59.04
>>109
へぇ、そんなのがあるんですね。
JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。

>>108
numeric_limits<streamsize>::max()
を第一引数に渡すのはやりすぎでしょうか?

111 :デフォルトの名無しさん:2012/05/11(金) 09:20:10.07
>>107
C++設計者の例。
http://www2.research.att.com/~bs/bs_faq2.html
の↓あたり。
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error¥n";
return 1; // error return
}


112 :デフォルトの名無しさん:2012/05/12(土) 11:08:35.52
音声ファイルのパスSoundPathを受け取り、StartSampleからEndSampleまでの標本の値を調べ、
その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。
mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか?

int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){
FILE* fp;
errno_t err;
short int LVol=0,RVol=0;
int Ave=0;
LONGLONG Sum=0;
if((err=fopen_s(&fp,SoundPath,"rb"))!=0){
return 0;
}
fseek(fp,44+StartSample*4,SEEK_SET);
for(int i=0;i<EndSample-StartSample;i++){
fread(&LVol,sizeof(LVol),1,fp);
fread(&RVol,sizeof(RVol),1,fp);
Sum+=MAX(abs(LVol),abs(RVol));
}
if(EndSample-StartSample>0){
Ave=(int)(Sum/(EndSample-StartSample));
}
fclose(fp);
return Ave;
}

113 :デフォルトの名無しさん:2012/05/12(土) 11:34:52.67
前もってユーザが自分でwavに変換するようマニュアルに書いておく

114 :デフォルトの名無しさん:2012/05/12(土) 15:48:55.12
ま、ファイルから直接〜じゃなくて、一旦展開してから同じように調べるとかでいいんじゃね?

115 :デフォルトの名無しさん:2012/05/12(土) 15:49:55.94
適当なフリーの変換ツールでも呼べばいいんじゃね?

116 :デフォルトの名無しさん:2012/05/13(日) 09:05:43.48
class X {
int a,b;
inline int f() { return a+b; }
int g() { return a+b; }
int h();
inline friend int plus(X& x) { return x.a+x.b; }
};
inline int X::h() { return a+b; }

hの定義につけたインライン要請は意味があると思うのですが、
クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか?
あと同様にクラス内に書いたfriendについてもお願いします。

117 :デフォルトの名無しさん:2012/05/13(日) 09:11:11.31
inline int X::h()これ以外全部意味がない

118 :デフォルトの名無しさん:2012/05/13(日) 10:13:52.49
クラス定義内でメンバ関数・friend関数の定義を書いた場合、暗黙的にinlineがついてるものとみなされる

119 :デフォルトの名無しさん:2012/05/13(日) 13:42:41.18
Cのライブラリ(たとえばcstdlib)を使う場合に、
グローバルな名前空間を汚染させない方法ってありますか?
namespace X {
#include <cstdlib>
}
はコンパイルエラーになってしまうのですが・・・

120 :デフォルトの名無しさん:2012/05/13(日) 14:14:33.20
>>119 無い。

121 :デフォルトの名無しさん:2012/05/13(日) 14:18:36.79
どうせstdlib.hからcstdlibとか名前かえるくらいなら、
namespaceに入れてくれたらいいのに・・・
あるいはstatic includeみたいなのでも。

122 :デフォルトの名無しさん:2012/05/13(日) 14:19:52.84
cstdlibを使うのなら汚染させないのは無理だと思うけどstd名前空間にも再宣言されているからstdで使う

123 :デフォルトの名無しさん:2012/05/13(日) 14:29:45.35
>>119
関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る
特定のコンパイル単位においてのみCのヘッダをインクルードし、
そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは
同名のwrapperの方を呼べば良い
(※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ

C++の関数シンボルは引数型とセットでマングルされるので、
仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても
(extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない


124 :デフォルトの名無しさん:2012/05/13(日) 14:32:35.45
>>121
C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が
何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456

125 :デフォルトの名無しさん:2012/05/13(日) 14:43:32.30
>>122
なんという無意味な再宣言w
コーディング規約として、そうするか・・・

>>123
負担が線形増大w
けど参考になります。

>>124
ふむふむ、将来的にも予定はない・・・と。

126 :122:2012/05/13(日) 14:51:25.13
>>125
こーやればいけたので報告
やっていいかどうかはわからないので詳しい人お願いします

#include <iostream>
namespace hoge {
#include <cstdlib>
  using::atoi;
}
int main(void)
{
  int a = hoge::atoi("4");
  std::cout << a << std::endl;
  return 0;
}

127 :デフォルトの名無しさん:2012/05/13(日) 14:53:10.74
結局リンクの段階でどうしても汚染されるので
無駄だよ

128 :デフォルトの名無しさん:2012/05/13(日) 14:54:22.82
汚染を防ぐじゃなくてstdじゃない名前空間で使うことね

129 :デフォルトの名無しさん:2012/05/13(日) 15:03:15.52
それだけなら別にこれでいいじゃん

#include <cstdlib>
namespace hoge { using ::atoi; }

130 :デフォルトの名無しさん:2012/05/13(日) 15:07:17.90
>>126
当然アウト。
17.6.2.2 [using.headers] p3
> A translation unit shall include a header only outside of any external declaration or definition, ...

131 :デフォルトの名無しさん:2012/05/13(日) 15:16:09.34
>>126
GCC4.7でコンパイル通らないよ。

132 :デフォルトの名無しさん:2012/05/13(日) 15:30:36.18
>>129
あーそうだね、ごめんなさい
>>126は忘れてください

>>130
解説あり

133 :デフォルトの名無しさん:2012/05/13(日) 16:00:48.99
PODなら16byteの構造体に
多重継承でオペレータ関数を追加したら、28byteになってしまった。
多重継承にしたのは、他のクラスでも使うからで
アップキャスト等する予定はありません。
これを多重継承ではなくコピペにしたら16byteのままのはずです。
ただ、コピペするとクラスのコードが長くなって、望ましくありません。
サイズを増やさずに、継承のように再利用出来る方法はありませんか?

134 :デフォルトの名無しさん:2012/05/13(日) 16:31:46.26
>>133 C++でおk

135 :デフォルトの名無しさん:2012/05/13(日) 17:08:52.40
>>134 はげどう
>>133 C++でおk
多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、
みたいな質問をされると困惑するから具体例示せ


136 :860:2012/05/13(日) 18:03:56.68
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : public A, public B { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

137 :133:2012/05/13(日) 18:06:33.52
※↑は間違いです。失礼
---
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

138 :デフォルトの名無しさん:2012/05/13(日) 18:22:49.23
>>137
http://codepad.org/Q4fuvcOb
> size of C is 1
> size of D is 1
> size of E is 1

VC++2010EE の最適化が至らないといだけのことだな。

139 :デフォルトの名無しさん:2012/05/13(日) 18:28:21.41
http://www.google.co.jp/search?q=msvc+multiple+inheritance+empty+base+class

http://stackoverflow.com/questions/6119927/empty-base-optimisation-msvc

https://connect.microsoft.com/VisualStudio/feedback/details/100686/empty-member-optimization-not-working-properly
> 終了
> 解決策: 修正しない
...
> 投稿者: Microsoft、投稿日時: 2006/04/11 11:50
> Hi: unfortunately even though this is a bug in the Visual C++ object
> model we are unable to fix it at this time given that fixing it would
> potentially break a lot of existing programs as the sizes of objects
> would change. Hopefully in the future we may be able to address this
> issue but not for the next release of the product.

140 :デフォルトの名無しさん:2012/05/13(日) 18:32:38.27
俺もその結論に達しました。
クラスは空であってもサイズは1。
ただし継承元が空の場合、最適化で0とすることが出来る。
しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。
残念、こういう結果になるとは。ともかくありがとうございました。

141 :デフォルトの名無しさん:2012/05/13(日) 19:18:04.32
int main(int argc, char* argv[]) {
vector<string> arg(argv,argv+argc);//ここまでOKだよね?
int res;
while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) {
}
}
が通らない。
char* const*にconvertできないといって怒られる。
&arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、
static_castで何とかなりますか?

142 :デフォルトの名無しさん:2012/05/13(日) 19:20:05.07
ちなみに適当で
static_cast<char*>(&arg[0])
とやってもダメ。

143 :デフォルトの名無しさん:2012/05/13(日) 19:34:20.71
>>141
何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?

144 :デフォルトの名無しさん:2012/05/13(日) 19:37:58.28
>>126
#include<c〜>でインクルードして
グローバル名前空間に関数が展開されるのは規格違反
MSのクソコンパイラー以外じゃコンパイル出来んぞ

145 :デフォルトの名無しさん:2012/05/13(日) 19:38:05.27
>>143
stringとvectorでラッパを作ろうと思って。

146 :デフォルトの名無しさん:2012/05/13(日) 19:43:57.51
わざとヤッてるとしか見えんな

147 :デフォルトの名無しさん:2012/05/13(日) 19:46:05.79
>>144
>>132

148 :デフォルトの名無しさん:2012/05/13(日) 19:51:06.88
static_castはダメだけど、
reinterpret_cast<char**>(&arg[0])でイケた。
違いがわからんw

149 :デフォルトの名無しさん:2012/05/13(日) 20:10:31.93
>>140
VC++2010EEつうか、Windows SDKにも入ってる
MSのMicrosoft (R) C/C++ Optimizing Compilerの問題じゃね。
EEだろうがどのエディションでもコンパイラーは同じだから問題も同じ。

150 :デフォルトの名無しさん:2012/05/13(日) 20:10:51.44
>>148 コンパイルは通るかもしれんが、イケてないよ。

151 :デフォルトの名無しさん:2012/05/13(日) 20:11:34.63
>>145 >>143

152 :デフォルトの名無しさん:2012/05/13(日) 20:15:55.15
>>148
int main( int argc, char *argv[] )
{
 //std::vector<std::string> arg(argv,argv+argc); この時点でダメ
 int res;
 while( ( res = getopt(argc, argv, "a") ) != -1 )
 {
 }
}

getoptはchar**型を取るのであって、std::vector<std::string>を取れるように出来ていない
例え std::string args[argc];で有ってもアウト。std::stringとcharの配列には互換性が無い。


153 :デフォルトの名無しさん:2012/05/13(日) 20:18:37.42
>>152
arg の初期化自体には別に問題ないだろ。 char* → std::string の変換がきく。

154 :デフォルトの名無しさん:2012/05/13(日) 20:22:13.96
>>153
そういう問題じゃないだろ。
std::vector<std::string>をgetoptに突っ込めばいいと考えてる時点でダメなんだろ。

155 :133:2012/05/13(日) 21:44:24.51
>>137
12クラスの多重継承を行った、とでも言うのでない限り、>137が>133(12バイトも増えた)の原因とは考えにくい
元クラスA,Bおよび派生クラスCそれぞれで仮想関数を使ってねえが
そう考えると、2クラスの多重継承で12 バイト増える説明がつく。
それぞれのクラスが仮想関数テーブルへのポインタを含むから、4*3で12バイト増。
(これは>138のサンプルでf(), g()にvirtualを付けると検証できる。

また、強いて言えば>137のサンプル(仮想関数抜き)で
どうして>133の多重継承理由(他のクラスでも使うから)になるのかわからん

別にMSを擁護するわけではないが、interfaceの多重継承みたいなことをしたいのだとすれば
基底クラスは必ずポインタ1個分(今日日のPCなら4バイト)の領域を占めるから、>140のような最適化の出番はない、
ハズ

156 :135:2012/05/13(日) 21:47:48.55
155 = 135。しつれい



157 :デフォルトの名無しさん:2012/05/13(日) 21:49:56.32
PODという用語を理解してるなら
仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど
そうでない事もあるから困る

158 :デフォルトの名無しさん:2012/05/13(日) 21:53:23.93
>>155
typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。

159 :155:2012/05/13(日) 22:04:04.04
いやすまん、揉める前>155の「2クラス多重継承で12バイト増える」を訂正
>137のサンプルにおいて、
struct D : public A, public B { char a; virtual void f() { } };
としたとき、DとAは仮想関数テーブルへのポインタが共通
(単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる)
だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。
残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、
それでトータル12バイトになる。

160 :デフォルトの名無しさん:2012/05/13(日) 22:26:12.53
でっていう

161 :133:2012/05/13(日) 23:16:40.69
>>155
133で出したクラスは、
9個のクラスを多重継承しており、
うち1つは、2つのクラスを多重継承しています。

完全にノーコストだと思ってたんでやられました。
継承はやめて全部コピペすりゃいいんでしょうけど・・

162 :デフォルトの名無しさん:2012/05/13(日) 23:33:09.77
組み込みでもやってんじゃないなら気にすんなよ
んなもん今日大したコストじゃねぇぞ
そんな事気にしてたらいつまで経ってもモノができん

163 :デフォルトの名無しさん:2012/05/13(日) 23:51:21.35
どんだけ多重継承してんだ
継承なんて実際大して使わないと思うんだが
全クラスの2割くらいじゃね

164 :デフォルトの名無しさん:2012/05/13(日) 23:54:03.40
継承多用も頭悪いヤツが嵌るワナの一種だから仕方が無いのだよ

165 :デフォルトの名無しさん:2012/05/14(月) 00:04:51.01
継承なんてインターフェースの実装用としてしか使わんな
多重継承は使いまくる
実装継承使うときは、デフォルト実装が欲しいときぐらいだな
完全抽象化クラスを継承することがほとんど

つか>>133は何をどういう風に再利用する気なんだろう
再利用するとなると、<algorithm>がいろんなクラスに適用出きるように
普通クラス側でなくクラスを使う側なんだが


166 :デフォルトの名無しさん:2012/05/14(月) 01:14:59.86
>>165
ベクトルです。float32 x 4で16byteな訳です。

多重継承している9種は、
ベクトルとの2項演算子
ベクトルとの単項演算子
ベクトルとの代入演算子
スカラとの2項演算子
スカラとの単項演算子
スカラとの代入演算子
などなど演算子が主です。

再利用化は、他に行列クラスにも使うためです。
合わせて6種類のクラスで使っています。

設計は満足のいくものだったんですが、
16Byteであるべきものが28Byteもあるようでは
はっきり言って使い物になりません。


167 :デフォルトの名無しさん:2012/05/14(月) 04:27:49.77
>>166
こんなのはどう?

#include <iostream>
template<typename Vec, typename Any> struct A : public Any { void a(){}; };
template<typename Vec, typename Any> struct B : public Any { void b(){}; };
template<typename Vec, typename Any> struct C : public Any { void c(){}; };
template<typename> struct Empty {};
struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; };
int main() {
std::cout << sizeof(MyVec) << std::endl;
}


168 :デフォルトの名無しさん:2012/05/14(月) 07:37:20.88
継承じゃなくてマクロかincludeで対応するとか

169 :デフォルトの名無しさん:2012/05/16(水) 20:03:33.91
public int FindIndex(Predicate<T> match)
{
}

List<T>と同じ挙動のFindIndexを作りたいんですが、
どう実装されてるのかわかりません
Predicate<T>からメソッドを取り出して、
フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか

170 :デフォルトの名無しさん:2012/05/16(水) 20:10:22.47
誤爆してた、すみません
C#スレで聞いてきます

171 :デフォルトの名無しさん:2012/05/17(木) 04:06:37.89
c丼もスコープ付きusingやtypedef使えれば
便利なんだがなぁ


172 :デフォルトの名無しさん:2012/05/17(木) 19:49:25.05
相談室ってこんなに過疎ってたっけ?
・・・というのはさておき、

struct A {
const std::string get(const std::string& value) const {
return value;
}
const bool get(bool value) const {
return value;
}
};


これで
error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested
って怒られるのなんで?
string関係はいつもストレスやわ・・・

173 :デフォルトの名無しさん:2012/05/17(木) 20:51:19.48
>>172

http://ideone.com/hoiKy

再現するコードかかないとわからんよ

引数の型間違ってるだけじゃないの?

174 :デフォルトの名無しさん:2012/05/17(木) 21:11:17.03
どうせa.get("abc")にしてんだろ
んでconst char*からの変換ではconst std::string&よりboolのほうが優先されて
返り値がboolなのにstd::stringで受けようとしてるからエラー

175 :デフォルトの名無しさん:2012/05/18(金) 01:35:02.13
うわっ、申し訳ない。その通り。
a.get("abc")てしたせいです。

この問題って、もしかして
std::ofstream::ofstream(std::string)
が存在しなくて、char*にしてある理由と同じ?
なんでいちいちc_strにしないといけないのかいつも不思議だったんだけど。

・・・しかもC++0xで修正されているというのも更に分からん。

176 :デフォルトの名無しさん:2012/05/18(金) 19:33:19.95
それとは関係ないだろ

177 :デフォルトの名無しさん:2012/05/19(土) 11:32:06.88
>>166
ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。
テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。
参考→ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html

もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は
CPUではなくGPUで処理したほうが圧倒的に早いいいので、
Windows環境限定でそこそこのグラフィックカード使えるなら
DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い)

こいつらより早い行列計算ルーチンを書くのは至難だよ。
CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。

178 :デフォルトの名無しさん:2012/05/19(土) 19:36:09.33
>>155
関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?


179 :デフォルトの名無しさん:2012/05/19(土) 19:43:35.13
>>177
CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。
Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。

180 :デフォルトの名無しさん:2012/05/19(土) 20:19:12.21
>>177
BoostはFortranのuBlasを再現したものだから
Blits++の方がいい。速度もこっちの方が速いしね。

181 :デフォルトの名無しさん:2012/05/19(土) 20:51:21.10
Blitz++か
あの変態演算子オーバーロードか
カンマ演算子をオーバーロードしたライブラリは初めて見たよ

182 :デフォルトの名無しさん:2012/05/19(土) 21:13:24.42
よく知らないけどEigenがいいと聞いた

183 :デフォルトの名無しさん:2012/05/19(土) 21:31:33.61
>>181
>カンマ演算子をオーバーロード
そんなこともできるのか点点点

184 :デフォルトの名無しさん:2012/05/19(土) 21:40:31.23
>>183
行列の要素を読み込むのに使ってる
ドキュメント読んでみ

185 :デフォルトの名無しさん:2012/05/19(土) 21:49:13.44
A = 0.5, 0.3, 0.8, 0.2,
0.1, 0.3, 0.2, 0.9,
0.0, 1.0, 0.7, 0.4,
0.2, 0.3, 0.8, 0.4;

こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ

186 :デフォルトの名無しさん:2012/05/19(土) 22:41:45.37
自動的に4×4?

187 :デフォルトの名無しさん:2012/05/19(土) 22:56:32.85
いや
Array<FixedPoint, 2> A(4,4);
って宣言してる

188 :デフォルトの名無しさん:2012/05/19(土) 23:00:15.42
書き方はすっきりするけど
速度的にどうなんだろうか

189 :デフォルトの名無しさん:2012/05/19(土) 23:07:43.73
初期化のつもりだろうからそんなに速度必要ないんじゃね

問題は肝心のテンソルの演算速度

190 :デフォルトの名無しさん:2012/05/20(日) 17:53:27.61
C++ 2010で画面上部のプルダウンメニューからDebugをReleaseへ変更しようとしているのですが、プルダウンメニューが反転していて選択できません。
どうすればよろしいでしょうか?

191 :デフォルトの名無しさん:2012/05/20(日) 18:00:27.85
>>189
Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。
ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。

192 :デフォルトの名無しさん:2012/05/20(日) 18:51:40.18
CUDAみたいな類のは4桁×4桁をガンガン回すぐらいじゃないと牛刀
16×16ぐらいなら転送のコストで帳消しになるだろう

193 :デフォルトの名無しさん:2012/05/20(日) 19:05:49.99
OpenCVとか必要ないレベルなら速度にこだわる必要もなくね?

194 :デフォルトの名無しさん:2012/05/20(日) 19:49:45.50
>>191
FORTRANて別に速いわけじゃないのに、なんで使われているんだろ?
やっぱ過去の資産かな?
配列の並びが逆なのが気持ち悪い。

195 :デフォルトの名無しさん:2012/05/20(日) 20:03:52.87
>>94
つ[ポインタのエイリアス問題]

C/C++はこれがあるために配列で最適化が十分に出来ない
VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る

196 :デフォルトの名無しさん:2012/05/20(日) 20:04:11.77
ありゃ
×>>94
>>194

197 :デフォルトの名無しさん:2012/05/20(日) 20:15:57.73
しかしこの過去スレひどいな

http://logsoku.com/thread/pc11.2ch.net/tech/1177215582/

ちゃんとここに書いてあるのに

http://seclan.dll.jp/c99d/c99d07.htm
7.6 restrict ポインタ

198 :デフォルトの名無しさん:2012/05/20(日) 20:37:06.35
>>194
実際速いから。あとC++じゃベクトル命令(SSEの類ではない)
まともに自動で使えないから。

199 :デフォルトの名無しさん:2012/05/20(日) 20:45:37.65
pascal の配列演算がなぜFORTRAN と並ぶに達せなかったのかに疑問が沸く

200 :デフォルトの名無しさん:2012/05/20(日) 20:57:54.26
>>195
C++には無いよ。C++11なら無視されるらしい。

201 :デフォルトの名無しさん:2012/05/20(日) 21:34:30.81
金が足りなかったんだろう

202 :デフォルトの名無しさん:2012/05/20(日) 21:48:23.26
>>198
vector<double> x,y,z;
z=x*y;
的なこと?たしかにRとかで使うけどなれると便利だよな。
Pascalにもあるの?

203 :デフォルトの名無しさん:2012/05/20(日) 22:14:52.36
>>201
コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの?
まったく想像がつかないんだけど命令手書きとか?

204 :デフォルトの名無しさん:2012/05/20(日) 22:19:12.45
>>202
http://www.ss.isc.tohoku.ac.jp/refer/pdf_data/v36-1p17-54.pdf
http://www.ss.isc.tohoku.ac.jp/refer/pdf_data/v35-3p21-39.pdf
この辺の話にでてくるベクトル命令

205 :デフォルトの名無しさん:2012/05/20(日) 22:25:08.49
>>202
B(1:99) = A(2:100)
こんなんとか。
Fortranならある範囲から、ある範囲に対して
演算を行える専用構文が存在するがCやC++には
存在しない。独自の拡張か、環境依存の関数を
使う必要が有る。

206 :デフォルトの名無しさん:2012/05/20(日) 22:30:31.09
ベクトル回路に乗せやすいように配列データを並べて
固定回数の繰返し構文を見つけて専用命令を充てる。

207 :デフォルトの名無しさん:2012/05/20(日) 22:55:46.78
C++もstd::valarrayを擬似クラス化して最適化できる
ようにすりゃいいんだけどな。演算子のオーバーロードとか
通常時は、演算毎にループして、最適化がかかった場合は
Expression Templateみたいに一つのループで一つの要素に対する
演算をすべて実行したりとかさ。

208 :デフォルトの名無しさん:2012/05/20(日) 22:58:09.26
>>203
基礎研究レベルからの積み重ね以外にないだろう
商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの
別に言語の仕様が高速化に向いてるからだとかいうものじゃない

209 :デフォルトの名無しさん:2012/05/20(日) 23:06:09.20
>>208
配列演算ができるのと出来無いのじゃ差が大きいよ
GpGPU分野でもFortranがそのまま移植され始めたし

210 :デフォルトの名無しさん:2012/05/20(日) 23:24:38.00
>>198
ここで言うベクトル命令ってSSEの類じゃないってどういうこと?
インテル系以外のプロセッサということなのか?

211 :デフォルトの名無しさん:2012/05/20(日) 23:26:50.52
このスレに貼られたリンク先をよく見てみましょう

212 :デフォルトの名無しさん:2012/05/20(日) 23:35:25.20
>>210
ここではベクトルプロセッサーのベクトル命令の事。
ベクトルプロセッサーの命令は、ループで回しながら
xmm0みたいな固定長のレジスタを使って演算する
わけじゃなく、演算命令に範囲と要素のサイズを
指定するだけ。構造がだいぶ違う。

213 :デフォルトの名無しさん:2012/05/21(月) 00:35:17.00
>>212
なるほどよくわかった。ベクトル機向けだからか。
今だとCUDAに近い感じかな。




214 :デフォルトの名無しさん:2012/05/21(月) 00:59:09.35
>>200
VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる
ヘルプ見てみ

>>209
D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな
でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ
どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし

ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを
並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213のように
GPUを使ったCUDAしかない

しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが
これは気軽に買えるようなものではない

215 :デフォルトの名無しさん:2012/05/21(月) 01:13:25.79
MS独自に拡張されてようとC++11には無い

216 :デフォルトの名無しさん:2012/05/21(月) 01:16:42.78
ここC++11のスレじゃないんだけど
ちなみにC++03にもないです

俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を
買うしかないという事

スパコンも案外独自拡張されてそうだけどな
あれだけ演算速度を重視されるんだから

217 :デフォルトの名無しさん:2012/05/21(月) 01:22:04.90
あ、やっぱり
ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね
これがないとベクトルCPUやSIMDが使えないもんなあ

それか素直にC99を使うか

218 :デフォルトの名無しさん:2012/05/21(月) 01:28:46.99
std::stringを継承させた
exstringというクラスを作ったのだけど
std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?


219 :デフォルトの名無しさん:2012/05/21(月) 01:31:36.96
stringクラスに仮想デストラクタはあるのか?まずそれが一番大事
無いとdeleteの時にメモリリークするぞ

次にコンストラクタは継承されないから自分で書き直すしかない
コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い

220 :デフォルトの名無しさん:2012/05/21(月) 01:33:12.86
ポータブルなisnanの実装って可能?
doubleのビットを全部見たらnanについて何が分かる?

221 :デフォルトの名無しさん:2012/05/21(月) 01:34:33.68
>>219
std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ

222 :デフォルトの名無しさん:2012/05/21(月) 01:35:11.83
ちなみにexstringをポインタ経由でなくてインスタンスとしてしか使わないのなら問題ないけどな
それからexstring自身のポインタ経由で使うか

std::stringは「失敗した標準ライブラリ」だと良く言われる
理由は多量のコンストラクタに、整理されてない多量のメンバ関数
STLの前に作られたから仕方ないんだが
string用に最適化されている事を期待して諦めているが

223 :デフォルトの名無しさん:2012/05/21(月) 01:50:02.37
>>219
おまいバカだろ

224 :デフォルトの名無しさん:2012/05/21(月) 01:56:35.44
>>223
馬鹿というなら具体的な対応策をお前が>>218に呈示してやれよ

225 :デフォルトの名無しさん:2012/05/21(月) 02:52:59.24
全然話は違うけどSTLPortのstd::ropeはどうなったん?
boostもC++11も見捨ててるみたいだけど、自然消滅?

226 :デフォルトの名無しさん:2012/05/21(月) 04:21:31.83
>>220
IEE754でいいなら、ビットパターンでNaNを表現している。

227 :デフォルトの名無しさん:2012/05/21(月) 04:27:55.75
std::stringじゃなくて
<boost/container/string.hpp>
使うのは?

228 :デフォルトの名無しさん:2012/05/21(月) 04:43:06.94
>>227
本当だな
それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる
全部STLでやれって事だよな

229 :デフォルトの名無しさん:2012/05/21(月) 06:11:32.83
>>216
正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。
数カ月前向こうでそういう議論があった。
今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。
つか過疎ってる。

230 :デフォルトの名無しさん:2012/05/21(月) 08:41:00.31
>>217
自分で書けばいいじゃん。
俺はクリティカルになるところは自分でかく。
それ以外は、コンパイラ任せ。

231 :デフォルトの名無しさん:2012/05/21(月) 09:11:46.86
ropeは現在では遅延評価がある言語でエディタ実装する用途以外に使い道無い

232 :デフォルトの名無しさん:2012/05/21(月) 12:36:03.13
ベクトル演算なんて自前でループなんかしないでippあたりのライブラリ使うから
どうでも良い

233 :デフォルトの名無しさん:2012/05/21(月) 19:17:30.82
メモリの断片化を防ぐために、OSが不定期にデータを移動させることがあるそうですが、
現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか?

昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス
→移動可能メモリを読み書きするにはロックが必要

今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス

234 :デフォルトの名無しさん:2012/05/21(月) 19:31:11.61
どういうときに考慮する必要があるの?

断片化解消を阻止するプログラムでも作るつもりか?

235 :233:2012/05/21(月) 19:36:58.90
>>234
DirectXにロックするAPIがあるんです。
現在はロックって必要ないはずですよね??

236 :デフォルトの名無しさん:2012/05/21(月) 20:20:42.21
>>235
DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る

237 :233:2012/05/21(月) 20:42:28.92
>>236
なるほど。
GPUから見た場合は論理テーブルみたいな仕組みがないので、
明示的に物理アドレスを固定しないといけないということなんですね。

ありがとうございました!!

238 :デフォルトの名無しさん:2012/05/22(火) 15:19:56.67
uプリフェックスってコンパイラで指定したソースコードの文字コードを
UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね?
例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?

239 :デフォルトの名無しさん:2012/05/22(火) 20:57:41.81
だいたいあってるけど正確には違う

240 :デフォルトの名無しさん:2012/05/22(火) 22:39:22.14
struct X
{
char x;
X( const X& o ) : x(1) {}
X() : x(0) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
X x;
x = X();
return 0;
}

これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが
なぜだかわかりますか? Visual C++ 2010です。


241 :デフォルトの名無しさん:2012/05/22(火) 22:52:07.80
operator=が呼ばれてるからじゃないんけ

242 :デフォルトの名無しさん:2012/05/22(火) 22:54:31.43
初期化と代入の区別はちゃんとつけよう!

243 :デフォルトの名無しさん:2012/05/22(火) 23:14:03.53
コピーじゃなくて代入だから呼ばれないよね(´・ω・`)

244 :デフォルトの名無しさん:2012/05/22(火) 23:25:39.40
>>240
operator=を書いてみ

245 : ◆QZaw55cn4c :2012/05/23(水) 03:17:06.92
>>240
http://codepad.org/YYHOycgY

246 :デフォルトの名無しさん:2012/05/23(水) 07:22:31.20
同じ事を何度も言わなくてよろしい

247 :デフォルトの名無しさん:2012/05/23(水) 23:34:18.12
template部分特殊化で
int float doubleは同じ処理で
string charは違う
その他のいろんなクラスは汎用処理
ということをしたいとする

int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか

248 :デフォルトの名無しさん:2012/05/23(水) 23:41:58.93
template<class Signature>
struct my_class{ ... }; // etc type

template<class T>
struct base_int_float_double{ ... }; // int or float or double

template<>
struct my_class<int> : public base_int_float_double<int>{};

template<>
struct my_class<float> : public base_int_float_double<float>{};

template<>
struct my_class<double> : public base_int_float_double<double>{};

これじゃいかんのか?

249 :デフォルトの名無しさん:2012/05/23(水) 23:47:57.51
>>248
ありがとう
それでいけます

250 :デフォルトの名無しさん:2012/05/24(木) 03:41:09.75
中身はintだけど型がintと違うものを作りたくて
struct exint ; public int
{};
してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?

251 :デフォルトの名無しさん:2012/05/24(木) 04:04:31.20
>>250
D言語でおk

252 :デフォルトの名無しさん:2012/05/24(木) 04:49:36.72
オブジェクト指向もどきだから
何でもかんでもオブジェクトじゃないよ

253 :デフォルトの名無しさん:2012/05/24(木) 13:53:23.19
newしたクラスのコンストラクタで、自分のメンバ変数にさらにnewしてクラスのオブジェクトを持たしている時
一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか?

つまり↓
newオブジェクト@->newオブジェクトA->xxxx ;

と続いている時、newオブジェクト@をdeleteする

この場合はnewオブジェクトAを削除したければ、そいつのデストラクタを呼ばないと駄目?

254 :デフォルトの名無しさん:2012/05/24(木) 13:58:59.65
>>253
newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。
だから消えない。

255 :デフォルトの名無しさん:2012/05/24(木) 14:00:56.11
>>253
それはデストラクタに書くべき事でしょ
newオブジェクトにもデストラクタを書いておけば全部呼んでくれる
継承してないし簡単

256 :デフォルトの名無しさん:2012/05/24(木) 14:12:45.06
例えばこれはメモリリークしない

class Base {
public:
Base* bp;
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp->bp = new Base;
bp->bp->bp = new Base;
bp->bp->bp->bp = new Base;
}

257 :デフォルトの名無しさん:2012/05/24(木) 14:20:05.69
bpがpublicというのは格好悪いのでprivateにした
やはりメモリリークはない
class Base {
Base* bp;
public:
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
}

258 :デフォルトの名無しさん:2012/05/24(木) 14:26:34.15
>>253
newしたらdelete
http://ideone.com/Q8DwX
スマートポインタの方がいい
http://ideone.com/2PugO
ポインタの必要がなければ普通にメンバにした方がいい
http://ideone.com/eepV0

259 :デフォルトの名無しさん:2012/05/24(木) 15:23:47.59
>>258
タメになるなぁ。

>>257
ダメになるなぁ。

260 :デフォルトの名無しさん:2012/05/24(木) 15:56:15.57
>>257
リーク以前にそれ無限ループじゃね?

261 :デフォルトの名無しさん:2012/05/24(木) 16:14:14.63
>>260
やってみて言ってんのか

Base() : bp(new Base) {
bp->bp = 0;
}

が何のために書いてあるのか分からないのか

262 :デフォルトの名無しさん:2012/05/24(木) 16:19:57.35
おれもコンストラクタが再起するように見えるけど。
開発環境入ってないから検証できないな。

で、Ideoneで試してみたら、ランタイムエラーだってさ。
http://ideone.com/ikpg0

263 :デフォルトの名無しさん:2012/05/24(木) 16:36:25.55
うん。スタックオーバーフローだから、実行するまでわかんない。VCとかだと何事も無く終了するw

264 :デフォルトの名無しさん:2012/05/24(木) 16:38:47.40
>>257
ループの件とは別に、
>>256はbp->bp->bpで連結してるけど
>>257はBase::bpでなくmainのローカル変数書き換えてるだけなのでリークする

やりたいことは分かるけどサンプルは盆ミス回避のため実際に実行するに限る
http://ideone.com/pcKDy

265 :264:2012/05/24(木) 16:41:37.05
>盆ミス
そしてこの凡ミスである

266 :デフォルトの名無しさん:2012/05/24(木) 17:00:14.45
>>261
やってみて言ってんのか

267 :260:2012/05/24(木) 17:43:32.61
>>261
コンストラクタでのnewでまたコンストラクタを呼び出す <---- 無限ループ
試しに bp->bp=0; にブレークポイント仕掛けたけど、そこに到達する前にスタックオーバーフローした
見た瞬間に気が付くと思うんだけどなぁ


268 :デフォルトの名無しさん:2012/05/24(木) 18:47:57.48
既に>259で答えが出てた。

269 :デフォルトの名無しさん:2012/05/24(木) 19:51:23.02
どう見ても永久ループです
ありがとうございました

#include <iostream>

class Base {
Base* bp;
public:
Base(int i = 0) {
std::cout << "Base() " << i << " time(s) called." << std::endl;
bp = new Base(i + 1);
bp->bp = 0;
}
Base** pointer() { return &bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;
}

270 :240:2012/05/24(木) 20:52:39.67
>>240 のお答えありがとうございました。こちらは理解出来ました。

ただもうひとつ、疑問があります。
このoperator=()が適用されないんですが
なぜなのかさっぱりです。
というかこれは常識ですか?

http://codepad.org/z5OlAQXL

271 :デフォルトの名無しさん:2012/05/24(木) 20:57:20.69
暗黙のうちに作られるoperator=(const X<x0,x1>&)があるから。
普通のメンバ関数なのでテンプレートより優先。

272 :240:2012/05/24(木) 21:04:15.42
そうなんですか・・
デバッガでトレースしても何も無いし
暗黙なんて止めて欲しい・・
ともあれ、おかげで対策方法もやっとわかりました。
どうもありがとうございます。

273 :デフォルトの名無しさん:2012/05/24(木) 23:25:58.77
Base() : bp(new Type()) {
}
初期化リストでnewするって無いよな
スマポ使えとまでは言わんが、せめて
初期化リストはNULL初期化だわ
効率もスマポ使った時と変わらん

Base():value1(NULL),value2(NULL)
try
{
  value1 = new Type();
  value2 = new Type();
}
catch(...)
{
  delete value1;
  delete value2;
}

274 :デフォルトの名無しさん:2012/05/24(木) 23:42:36.30
いやそこはスマポ使えよ

275 :デフォルトの名無しさん:2012/05/24(木) 23:43:59.04
NULLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

いや、俺はちゃんとnew_handler記述するよ。

276 :デフォルトの名無しさん:2012/05/24(木) 23:47:16.61
というかnewがこけるときって、どういう状態なんだろ?
もうガッタガタで、プロセス落とすしかないんじゃないの?

277 :デフォルトの名無しさん:2012/05/24(木) 23:55:28.25
>>276
Effective C++読んでみれ。

第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。
メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。
イメージできないなら、まだ初級プログラマになれてない。

278 :デフォルトの名無しさん:2012/05/24(木) 23:59:38.27
と、思っていま第三版の目次を確認したら後方に移動してたw
二版では2章7項だったが、三版では8章辺りの話題のようだ。

279 :デフォルトの名無しさん:2012/05/25(金) 00:02:50.74
あ、オレ初級以下だわ

280 :デフォルトの名無しさん:2012/05/25(金) 00:05:45.16
メモリが有限だってことさえわかれば自然と不足する状況なんて考えられるはずなのに、
それがわからないって言ってるやつは結局エラー処理をサボる理由が欲しいだけなんでしょ。

281 :デフォルトの名無しさん:2012/05/25(金) 00:06:34.49
クラスに自分へのポインタを持ってそこにnewして入れるなら
再帰呼び出しになるから、引数を入れて深さがある程度になったら
止めるなどの工夫をしないとstd::bad__alloc例外が投げられるのは目に見えている

282 :デフォルトの名無しさん:2012/05/25(金) 00:07:23.77
その前にスタックオーバーフローで止まるかハングしそうだけどね
処理系によってはスタックオーバーフローしても何も言わずにそのまま続行するから
たちが悪い

283 :デフォルトの名無しさん:2012/05/25(金) 00:20:57.76
new と スタックがどう関わるか詳しく聞きたいものだな

284 :デフォルトの名無しさん:2012/05/25(金) 00:37:07.29
コンストラクタの再帰呼び出しの機構は特に規格に入ってないけど
普通の関数のCALLみたいな機構で実現されてる場合が多いみたいです
だから先にスタックが逝くような感じ

285 :デフォルトの名無しさん:2012/05/25(金) 00:56:04.36
ウェブ上で配信されているMJPEG形式のストリームを読み込んでメモリ上でパースしたいです。
どのような方針で書けばいいでしょうか。
よろしくお願いします。

286 :デフォルトの名無しさん:2012/05/25(金) 01:01:57.44
とりあえず適当にバッファにとって切り取っていけばいいんじゃないでしょうか

287 :285:2012/05/25(金) 01:36:52.37
ソケット作ってってことですか?
ストリーミング取得しやすくするライブラリでもあればいいのですが。
ちなみに対象のMJPEGの構造は把握しているので独自に解析するとして、今は自分の中に以下の3つの課題があります。
・データをどうやって取ってくるか
・送られてくるMJPEGを具体的にどのようにバッファして解析してバッファをリリース&次のデータを取得すればいいのか
・マルチスレッドで他の処理と並行して実行させたいので、プロセス内でjpgのやり取りをしたいのですが、
 例えばOpenCVを使った画像処理スレッドとjpgを取得するスレッドをどうやって連携させるのか

288 :デフォルトの名無しさん:2012/05/25(金) 04:07:11.32
>>287
1. wget URL | お前のプログラム
2. read(stdin)
3. シングルで動いてから考えろ
 煽りじゃなくて本気でリファレンス実装作ってからじゃないとデバッグ大変よ?


289 :デフォルトの名無しさん:2012/05/25(金) 04:37:11.10
大きな問題を小さく分割して1つひとつ実現するセンスが必要

290 :デフォルトの名無しさん:2012/05/25(金) 06:01:17.57
>>275-276
new演算子の問題じゃなく、newに付けたコンストラクターが
例外を出した時が問題なんだけどな

291 :デフォルトの名無しさん:2012/05/25(金) 06:24:09.31
>>275
new_handlerつかっててもコンストラクタでコケたらメモリーリークする
メモリーリークだけなら即致命的な事態にならないが
ファイルロックや排他など各種ロックが掛かりっぱなしになる

292 :デフォルトの名無しさん:2012/05/25(金) 06:26:00.68
言葉が足りなかった。
>ファイルロックや排他など各種ロックが掛かりっぱなしになる
これは、ロックするタイプのオブジェクトをnewで確保していた場合な

293 :デフォルトの名無しさん:2012/05/25(金) 07:32:03.94
だからスマポ使えよ

294 :デフォルトの名無しさん:2012/05/25(金) 08:24:38.42
>>291
new_handler とメモリーリークは関係ないだろ。

295 :デフォルトの名無しさん:2012/05/25(金) 09:28:57.73
スマポ使ったら負けだと思うんだ。(笑)

296 :デフォルトの名無しさん:2012/05/25(金) 09:35:01.30
スマポこそ人類の英知だ
そうは思わんかね

297 :デフォルトの名無しさん:2012/05/25(金) 09:46:28.44
>>295 けっこうよく居るな、こういうやつ。なんなんだろうな?

298 :デフォルトの名無しさん:2012/05/25(金) 09:58:18.30
>>291-292
細かいアレだけど「コンストラクタが例外安全なコードになってなかったら」だろ?

299 :283:2012/05/25(金) 12:10:39.91
>>239
kwskおねがいしま(ry

300 :デフォルトの名無しさん:2012/05/25(金) 12:58:34.67
shared_ptr使ったらあっさり書けて拍子抜けしたわ
C++はGCが付いてないんだからスマポ使った方がいいかもね
メモリリークで本当に悩む

301 :デフォルトの名無しさん:2012/05/25(金) 16:45:50.43
スマポが使えるなら使ったら方がいいが、
パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。

302 :デフォルトの名無しさん:2012/05/25(金) 17:04:43.03
shared_ptrはともかくunique_ptrは消費メモリもオーバーヘッドも生ポインタと変わらんと思う

303 :デフォルトの名無しさん:2012/05/25(金) 17:23:15.50
生成と破棄x30000000、sizeof比較

int*: time: 2.13s
http://ideone.com/2tLcx

std::unique_ptr<int>: time: 2.13s
http://ideone.com/wtba4

std::shared_ptr<int>: time: 4.41s
http://ideone.com/UDuJE

sizeof:
http://ideone.com/EtftU
> sizeof(int*) = 4
> sizeof(std::unique_ptr<int>) = 4
> sizeof(std::shared_ptr<int>) = 8

304 :デフォルトの名無しさん:2012/05/25(金) 17:24:20.59
亡きauto_ptrさん
http://ideone.com/sc7fr

305 :デフォルトの名無しさん:2012/05/25(金) 17:56:17.19
ユニポすげえええええええええ

306 :デフォルトの名無しさん:2012/05/25(金) 19:21:00.33
多機能ではなくスマートさを追求したユニークさんこそ至高

307 :デフォルトの名無しさん:2012/05/25(金) 19:33:51.01
>>297
会社がboost使わせねェんだから仕方ねぇだろ

308 :デフォルトの名無しさん:2012/05/25(金) 19:41:03.98
>>307
scoped_ptrくらいなら定義すればいいだろ

309 :デフォルトの名無しさん:2012/05/25(金) 19:43:11.82
>>307
内製の糞ライブラリ使うしかないのかwww

310 :デフォルトの名無しさん:2012/05/25(金) 19:49:48.85
社員の腕前まるっとまとめて信用されてないんだろ
紐付けとかないとなにやらかすかわからん集合無知みたいな

311 :デフォルトの名無しさん:2012/05/25(金) 20:03:22.59
タダより高いものはないとか言ってセキュリティがうんぬん

312 :デフォルトの名無しさん:2012/05/25(金) 20:10:06.48
じゃあ、コンパイラから全部内製で。

313 :デフォルトの名無しさん:2012/05/25(金) 20:12:18.61
単にboost分からないから使わせないだけだよ

314 :デフォルトの名無しさん:2012/05/25(金) 20:13:50.23
じゃあ標準ライブラリは完全にわかってるのか。すごいなぁ。

315 :デフォルトの名無しさん:2012/05/25(金) 20:19:58.86
const auto_ptr ぐらいは使えるだろ

316 :デフォルトの名無しさん:2012/05/25(金) 20:24:12.06
というかC++だって完璧にわかってるやつなんてそうそういねぇよ

317 :デフォルトの名無しさん:2012/05/25(金) 20:50:09.14
C++はあのPL/Iよりも言語仕様が大きいんだぜ
全部覚えたら神様と崇めるよ

318 :デフォルトの名無しさん:2012/05/25(金) 20:58:47.74
std::vector<Hoge>でHogeをコピーしないでHogeのデフォルトコンストラクタ呼び出す方法ありますか?

319 :デフォルトの名無しさん:2012/05/25(金) 21:02:10.59
ソースで示して

320 :デフォルトの名無しさん:2012/05/25(金) 21:06:08.79
>>318
resize

321 :デフォルトの名無しさん:2012/05/25(金) 21:07:54.55
C++11より前だとコピるぞ。

322 :デフォルトの名無しさん:2012/05/25(金) 21:08:02.54
resizeでコピーが発生せずデフォコンで構築されるのはC++11から

323 :デフォルトの名無しさん:2012/05/25(金) 21:31:17.40
>>307
どんな理由で禁止されてんの?

324 :デフォルトの名無しさん:2012/05/25(金) 21:45:46.59
上司「今の僕には理解できない」

325 :デフォルトの名無しさん:2012/05/25(金) 21:47:35.90
上司「うちはBCC使ってるんだけどコンパイル通らないじゃんあれ」

326 :デフォルトの名無しさん:2012/05/25(金) 21:47:36.00
「なぜあなたが理解できないということが禁止の理由になるのですか?」

327 :デフォルトの名無しさん:2012/05/25(金) 21:47:46.73
>>323
テンプレが役に立たなかった時の名残

328 :デフォルトの名無しさん:2012/05/25(金) 21:49:27.89
>>327
なら今はもう問題ないな。

329 :デフォルトの名無しさん:2012/05/25(金) 21:50:34.36
VC6が未だ現役という・・・

330 :デフォルトの名無しさん:2012/05/25(金) 21:51:37.50
boostのコンパイルが通らない環境の仕事つい最近まであった

331 :デフォルトの名無しさん:2012/05/25(金) 21:53:21.90
先輩「STLも禁止な」

332 :デフォルトの名無しさん:2012/05/25(金) 21:55:01.37
俺様「OTL」

333 :デフォルトの名無しさん:2012/05/25(金) 22:13:36.61
Oresama Template Library

334 :デフォルトの名無しさん:2012/05/25(金) 22:26:00.18
先輩「templateも禁止な」
俺「それC++を使う意味なくないっすか?」

335 :デフォルトの名無しさん:2012/05/25(金) 22:26:55.36
C99非対応の処理系ならベターCとして十分実用性が

おっとMicrosoftの悪口はそこまでだ

336 :デフォルトの名無しさん:2012/05/26(土) 00:23:07.53
>>334
3〜5年前なら当たり前のようにそういう話があった
今でも少なくない

337 :デフォルトの名無しさん:2012/05/26(土) 00:34:43.34
そうだな、昔も今もアホは居るからな。

338 :デフォルトの名無しさん:2012/05/26(土) 01:21:21.23
もっと昔だと・・・templateは予約語だった

339 :デフォルトの名無しさん:2012/05/26(土) 01:25:34.85
mapに特定のキーが登録されているかいないか調べる方法ありますか

340 :デフォルトの名無しさん:2012/05/26(土) 01:27:44.73
find

341 :デフォルトの名無しさん:2012/05/26(土) 01:30:26.65
count

342 :デフォルトの名無しさん:2012/05/26(土) 02:09:27.73
VS2010を用いているのですが、コントロールがクラシックデザインなのはどうしようもないんですか?

343 :デフォルトの名無しさん:2012/05/26(土) 02:13:27.57
>>342
ttp://eternalwindows.jp/control/controlbase/controlbase09.html

344 :デフォルトの名無しさん:2012/05/26(土) 02:46:18.77
>>313
コンパイラが変わると、コンパイルが通らないからだよ。
ビルド環境にboostがあるとは限らんし。

早くboostがstlになればいいんだよ。

345 :デフォルトの名無しさん:2012/05/26(土) 02:51:18.55
糞環境自慢されても

346 :デフォルトの名無しさん:2012/05/26(土) 03:05:38.09
業界標準以外は導入しづらい

347 :デフォルトの名無しさん:2012/05/26(土) 07:27:02.37
>>294
遅レス&&全レス読んでないが、関係はある
クラスFooのコンストラクタ内で例外が発生すると、
その時点で構築済みメンバのデストラクタはもれなく呼ばれるが
Fooインスタンス自体のデストラクタが呼ばれない
したがって、Fooがメンバとして単純なポインタFoo::m_pを含んでおり、
それに対するnewが成功した後に(別のnew等で)例外が発生すると
Foo::m_pが指すメモリを解放する奴が居ないからリークする

解決策はFoo::m_pのような奴を生のポインタではなくauto_ptrにするとか



348 :デフォルトの名無しさん:2012/05/26(土) 07:41:07.42
いやすまんnew_handlerか、
new_handler中身でやることのパターンは何通りかあるが、結局例外を投げてしまう場合、と読み替えてちょ

349 :デフォルトの名無しさん:2012/05/26(土) 13:07:43.57
コンパイラごとのSTLのアルゴリズムは
イテレーターのクラスによって要請されているインターフェイスの
オペレーターを全て実装していることを仮定されていますか?
よろしくお願いします。

350 :デフォルトの名無しさん:2012/05/26(土) 16:52:27.58
>>349
C++に準拠してれば、C++の仕様に沿ったオペレーターを実装してるだろう。
C++に準拠してないコンパイラーの話なんかされても知らんがなとしか言えん。

351 :デフォルトの名無しさん:2012/05/26(土) 17:23:19.31
>>349
何を聞きたいのかわからんが、
一応テンプレートに現れるシンボル(オーバーライドされたオペレータ含む)はtwo-phase lookupと言う規則で解決され、
インスタンス化しないテンプレートに現れるシンボルやオペレータについては宣言も実装も一切要らない

352 :デフォルトの名無しさん:2012/05/26(土) 17:43:29.25
すなわちSTLアルゴリズムの使用するイテレーターテンプレートのインスタンスの
インターフェイスの提供するファンクションはSTLで実装されているイテレーターのイテレータークラス
によって類別されて決定される全てのファンクションが実装されていることを前提としているのでしょうか?

353 :デフォルトの名無しさん:2012/05/26(土) 18:00:41.46
コンセプトが導入されてない現状ではそのアルゴリズムの実装が使うイテレータの機能だけが使用可能ならば問題ない
だから現状ではイテレータの要件を完全には満たしてないクラスを渡しても動作するアルゴリズムの実装はありえる

354 :デフォルトの名無しさん:2012/05/26(土) 18:05:54.57
ただし、あるアルゴリズムがイテレータのどの機能(ってfunction=関数?)を使うかは実装依存。
一回動けばいいような書き捨てプログラムでもない限りきっちり作っておくが吉。

355 :351:2012/05/26(土) 18:56:58.81
ああスマン、自作イテレータをSTLのアルゴリズムに食わせる話か、
初心者なものでイテレータはSTLのコンテナから出てくるものが全てだと思い込んでいた、

356 :デフォルトの名無しさん:2012/05/26(土) 20:27:12.61
自前でちゃんとしたイテレータを書くのは
結構面倒くさいからboost使うといいよ

357 :デフォルトの名無しさん:2012/05/26(土) 21:41:27.08
>>348 読み替えてもやっぱり new_handler とメモリーリークの関連が見えてきませんね。

358 :デフォルトの名無しさん:2012/05/26(土) 21:50:08.94
変態イテレータあるよな
for_eachで回すだけで面白い事が出来る奴とか

359 :291:2012/05/26(土) 21:52:12.10
>>357=294 ?
俺は、>>275がnew_handlerでなんとか出来るらしいと
書いてたからnew_handlerでメモリーリーク対策できなくねと書いたまで。
new_handlerとメモリーリークが関係するかはしらんがな。

360 :デフォルトの名無しさん:2012/05/26(土) 21:57:56.25
そうか。すまんかった。

361 :デフォルトの名無しさん:2012/05/26(土) 22:03:50.90
>>357
Fooのコンストラクタ内で例外を捕捉しないものとして、
>347な状況でnew_handlerから(何でもいいが)bad_alloc等の例外をスローすると、Foo::m_pが指す先のメモリがリークする
>347の状況であってもnew_handler内で(あらかじめ非常用にリザーブしておいたメモリから割り当てる等の手段で)
例外をスローせずに処理した場合、リークは起きない

よって、new_handlerの中身がリーク発生に全く無関係とは言えない


362 :デフォルトの名無しさん:2012/05/26(土) 22:09:06.28
空きがもうない状況の話なのに
空きがあったらってぶっちゃけ関係ないよな

363 :デフォルトの名無しさん:2012/05/26(土) 22:18:29.67
>>362
>空きがあったらってぶっちゃけ関係ないよな
空き0前提はともかく、非常用のリザーブ領域まで0前提なのか否かはスレの流れからは自明ではありませんね〜
new_handler内でユーザー向けダイアログボックス用にリザーブ領域メモリを割り当て、
エラー表示した後プログラム終了、という設計も有り得る

364 :デフォルトの名無しさん:2012/05/26(土) 22:22:05.70
>>363
newが例外を出した時点で、new_handlerは失敗してる。

365 :デフォルトの名無しさん:2012/05/26(土) 22:25:43.17
>>363
newが例外だしてりゃリザーブ領域空ですよね

366 :デフォルトの名無しさん:2012/05/26(土) 22:30:47.43
>>364,>>365
kwsk
デフォルトのnew_handlerを自作new_handlerに差し替えた後でも
newが勝手に例外をスローするというのは初耳


367 :デフォルトの名無しさん:2012/05/26(土) 22:36:04.77
>>366
自作new_handlerが何も割り当てできなかったらNULLでも返す気か?
要点は例外じゃなくて、new_handlerがなすすべがない状態におちいてっるて
所なんだからそれぐらいは解れよ

368 :デフォルトの名無しさん:2012/05/26(土) 22:41:05.88
>>366
つまらん事で意地をはるな
得することなんて何もないんだから

369 :デフォルトの名無しさん:2012/05/26(土) 22:48:40.40
>>367
自作new_handlerなんだから、なすすべがない状態に陥らないように設計もできるよ?
単純な方法としては、プログラムの起動時に数KBかそこらのメモリを非常用にnewしておき、
そのポインタを大域変数g_pReservedに記録、
その後本当にメモリが0になったらg_pReservedからとりあえず返し、ただしプログラム終了フラグをセットして
速やかにプログラムを終わらせる、みたいな

そのためのnew_handlerです


370 :デフォルトの名無しさん:2012/05/26(土) 22:53:03.92
>>365 の話がでてるのに、リザーブがあればという。
もうダメだなこの人完全に意固地になってる

371 :デフォルトの名無しさん:2012/05/26(土) 22:53:30.08
>>369
g_pReserved が使われた後にもっかい new したら同じこと。

372 :デフォルトの名無しさん:2012/05/26(土) 22:55:46.29
>>361
元々可能性の低い失敗がもし起こったらどうなるか、って話をしてるのに
可能性をもう少しほんのちょっとだけ下げる方法の話をしても意味ないでしょ。

373 :デフォルトの名無しさん:2012/05/26(土) 22:57:52.31
>>369
話の論点からずれるけどアホだろあんた
最初にnewしてなければその分空きがあったはずで、意味がない。
new_handlerとして有効な使い方は、高速化の為にだけ先読みしてた
画像データなどのキャッシュ解放。不要なデータを削除すんのが普通。

#余談だから無視してくれ

374 :デフォルトの名無しさん:2012/05/26(土) 23:09:46.56
>>370
デフォルトのnew_handlerを自作new_handlerに差し替えた後ならnewが勝手に例外を投げることはないから、
>365の言うような現象は起きない。よって、>365に基づく批判はナンセンスだし

>>371
まあそこらの細かい設計は一考を要するが、
別にg_pReservedをただ一つのオブジェクトに一括で返さねばならないわけでもなし

>>372
可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
本当にヒープ0になってからでは何も仕事はできない、という主張をするなら、
後始末という仕事を正しく遂行するため用のメモリをあらかじめ確保しておくという発想に到らねばおかしい

>>373
無視するが、>372へのレスの通りである


375 :デフォルトの名無しさん:2012/05/26(土) 23:17:56.17
>>374
g_pReservedが空になったらどうする気だ?

376 :デフォルトの名無しさん:2012/05/26(土) 23:21:13.73
>>375
本当にそうなったら万事休すだが、
やる仕事は後始末、と限定し、それに必要十分なメモリ量を見積もって
g_pReservedとして確保しておけば、それは避けられる

377 :デフォルトの名無しさん:2012/05/26(土) 23:23:24.66
>>376
万事休すになった時のことをみんな言っているんだけど
それと、その時あんた例外なげないっていってたけどどうする気だ?

378 :デフォルトの名無しさん:2012/05/26(土) 23:33:22.47
>>376
newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
取れれば有効なポインタが返り、取れなければ例外、それだけ。
足りなくなったのでクリーンナップして終了させる必要があるなんて知る余地もない。
std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?

379 :デフォルトの名無しさん:2012/05/26(土) 23:36:22.15
>>377
「万事休す」に2種類あることに注意だな。ただしどっちの解決策も示し済みwwwwww

(1) 後始末を遂行するためのメモリがリザーブ領域に残っているがそれ以外が0になった「万事休す」なら、
  リザーブ領域のメモリからの割り当てて後始末を遂行し、プログラムを正常終了すれば良い(>369, >374の3コ目)

(2) 後始末を遂行するためのメモリまで0になる「万事休す」は、
  >376のようにきちんと必要なメモリ量を見積もって確保しておけば生じない

ていうか、漏れとしてはnew_handlerの一活用方法を述べているだけで、そればかりに食いつかれてもなんだか悲しい
興味がおありの向きは、自力でnew_handlerを調べて活用方法でも考えたらどう?
例えば、new_handlerから自作GCを起動してしばらく使っていないオブジェクト(当然GCで管理する設計にする)
を解放し、空いたメモリを返すとか

380 :デフォルトの名無しさん:2012/05/26(土) 23:40:36.58
>>376
>>369のやり方をすれば、ヒープが枯渇するタイミングが早まるだけで、
使えるヒープの総量は変わらないんだけど

381 :デフォルトの名無しさん:2012/05/26(土) 23:54:34.16
>>378
>newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
おk newがメモリをどこから取るかに依存するような話はしていないつもりだが

>std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?
漏れはg_pReservedに残っているメモリでプログラムの後始末を遂行し、終了するという考え方を示した。
後始末と終了以上の仕事をさせたいというならどうするか考えるのはYOUの仕事ですな

>>380
使えるヒープの総量が変わらない、はその通り
>369のやり方は、後始末を遂行する余力を残した状態で、ちょっとだけ早期にヒープ枯渇を察知することに意味がある。

382 :デフォルトの名無しさん:2012/05/27(日) 00:22:31.86
>>381
おい、new_handlerが不足を察知したところでnewを呼ぶ側にはそれを知る術がない、といっているのだが。

383 :デフォルトの名無しさん:2012/05/27(日) 00:27:33.02
>>379
リザーブが枯渇した後なんだから(1) は文脈としてありえないだろ
見積もれないからnew_handlerが呼ばれてるわけで(2)も終ってる

384 :デフォルトの名無しさん:2012/05/27(日) 00:36:22.89
>>374
> 可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
どっちにしてもメモリーリークと関係なくね?

プログラムを正常終了させる話にしても、普通にスマートポインタつかってりゃ
例外が飛んで catch されるなり terminate() されるなりしてプログラムを終了
させたければさせられるわけだが、そのよくわからん new_handler を使う方法は
何がうれしいのかさっぱり。

385 :デフォルトの名無しさん:2012/05/27(日) 14:26:48.55
>>328-383
Effective C++ 改訂2版 p.49に>363に類似だがより良い方法の記述がある
>たとえばプログラム起動時に予備として大きなメモリブロックを割り当てておき、
>new-handlerが初めて呼び出されたときにそのブロックを開放するという方法がある。

記憶管理の話は荒れますねwwwwww


386 :デフォルトの名無しさん:2012/05/27(日) 14:31:55.15
>>385
荒れてる原因は話題じゃなくて、無理を通そうとする若干一名に見える。

387 :デフォルトの名無しさん:2012/05/27(日) 14:34:23.79
>>384
>385の引用の続きだが
>予備のメモリを解放するときには、ユーザーにメモリが少ないことを警告
>し、もっとメモリを追加しないと今後の要求が失敗する恐れがあることを
>知らせるメッセージを出す事が多い。
↑これはメッセージを出すケースだが、予備が十分なら、
メッセージを出すのがある程度高価な処理であるケース
(例えばダイアログボックススに長いメッセージを出す必要があり、文字列をnewしたい場合等)に対応できる。

また、ヒープメモリが予備含めて完全に0になった状態で
「(例外をcatch等して)プログラムを(正常に)終了させたければさせられる」
という>384の自信はどこから来るんだ;


388 :デフォルトの名無しさん:2012/05/27(日) 14:36:00.96
>>386
違うな。Effective C++の著者と漏れとで少なくとも2名だ

389 :デフォルトの名無しさん:2012/05/27(日) 15:00:39.65
>>388
お前か。

みんなが >>361 の「new_handlerの中身がリーク発生に全く無関係とは言えない」について
ツッコミを入れているのがわからないの?

390 :デフォルトの名無しさん:2012/05/27(日) 15:19:59.91
>>389
じゃあ藻前ら流の「全く無関係」のwell-definedな定義と「全く無関係」であることの論証よろ

少なくとも>388は、A,Bを命題として、「A→Bかつ¬A→¬BだからAとBは無関係とはいえない」、
という論法(のちょい派生)なわけだが

391 :デフォルトの名無しさん:2012/05/27(日) 15:21:59.07
しつれい
× >388
○ >361

392 :デフォルトの名無しさん:2012/05/27(日) 15:27:48.24
>>390 命題A,Bってそれぞれ何のこと?

393 :デフォルトの名無しさん:2012/05/27(日) 16:04:43.89
\           /     /. : : : : : : : :ヽ-‐.: :_;. --- .._: : : : : : : :\       \      /
_  争  も  _   /, -‐==ミ: : : : _,ィニ-‐……ー-: 、`ヽ、: : : : ヽ、      _   争   _
_  え  っ  _     . .:´: : : : : : : ≠:7: : : : : : : : : : : : :ヽ、 ヽ| : i : : :,     _    え   _
_   : . と   _   /.: : : : -‐: :7´: : /:,ハ : : : :ヽ : : : ゝ-- :\ | : :! : : : ,   _    :   _
_  :      _ /, -‐/.: : : : :i : : /ィ:爪: : :\ :\ : : :\: : :`ト : !: : : :′   _   :    _
             〃  /. : : : : : : |.:イ :ハ:| \: .、\: : xィ¬ト、: :| : : ! : : : : :,
/          \   /.: :/.: : : : /l : |/Гト、       / |_,ノ0:::ヽ : : :i : : : : :′ /        \
 /  |  |  \    | .:/.:/. : : :i: i : | |ノ0:::ト :::::::::::::   |: :∩::::::ト: : : !: : : : : : :,  / | | \
             ∨i: |: : : : |: :ヽ| |::∩::| ::::::::::::::::  !.::∪::::::| |: : :i : : : : : : ′            ,ィ /〉
               |: |: : i : :', : |  |::∪::| ::::::::::::::::  !: : : : : :||: : i : : : : : : : :,          / レ厶イ
                ヽハ: : :、: :ヽ|  l : : : |:::::  ,  ::::└――┘ ! : : i : : : : : : : ′        /   ⊂ニ、
                い、: :\/   ̄ ̄                 ', : : i : : : : : : : : ,     _, -‐'    ⊂ニ,´
    r 、  _          ヽ: :〈        <  ̄ フ         |: : : ! : : : : : : : :′,.-‐T   _,. -‐'´ ̄
    くヾ; U|           | : \                   /| : : :i : : : : :_, -‐'    |  /
   r―'   ヽ、             | : : : \               イ: : :| : : :i_,. -‐       |/
    `つ _   ̄ ̄Τ`ー―-- L: : : : : `: : . . .  __    .:〔: : :|: : :r┬'              |


394 :デフォルトの名無しさん:2012/05/27(日) 19:45:53.79
このスレはC++/CLIもやってるの?

395 :デフォルトの名無しさん:2012/05/27(日) 19:49:06.86
共通の話題なら扱うだろうけどCLI固有の話となるとご遠慮願いたい。

396 :デフォルトの名無しさん:2012/05/27(日) 20:20:49.72
CLIはこっちか
初心者用しかないのが気にはなるが

くだすれC++/CLI(初心者用)part2
http://toro.2ch.net/test/read.cgi/tech/1268613679/

397 :デフォルトの名無しさん:2012/05/27(日) 21:00:36.93
初心者といっても、C++/CLI初心者にはC++と.NETの両方とも中級以上が必須だぜ
向こうはC++/CLIに固有の内容以外(C++や.NETの基礎知識)は基本的にスレチだし

398 :デフォルトの名無しさん:2012/05/27(日) 21:42:40.23
int main()
{
 int *array = new int[0];
 delete[] array;
 return 0;
}
Visual Studio 2008搭載のコンパイラーでこのコード走らせると
異常終了してた気がするけど、もし異常終了したらバグじゃね?
仕様として正常終了と異常終了どっちが正しいんだ?

399 :デフォルトの名無しさん:2012/05/27(日) 21:58:07.72
>>398
new が失敗→ bad_alloc → terminate() → abort() という可能性はあるが、
現実に VS が対象としてる Windows 環境でそうなることは考えづらいな。

400 :デフォルトの名無しさん:2012/05/27(日) 22:00:21.06
>>390
メモリー不足→new_handler作動→リザーブが足りない→newが例外→直前にnewで確保したメモリーがリーク

もしくは、
メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了

メモリーリークとnewが例外出す以前は全く関係ない

401 :デフォルトの名無しさん:2012/05/27(日) 22:01:47.57
>>399
俺Windows持ってないから、実際やったらどうなるか試してもらえるか?
正常終了したら正常終了したと教えてくれ。

402 :デフォルトの名無しさん:2012/05/27(日) 22:10:53.15
new int[0] は合法。変える値もnull値とは限らない(配列の格納に必要な追加のメモリを要求することは実装上許されているので)。
…規格票はJISのページがアレなので、誰か英語の規格でも貼っておくれ^^

403 :デフォルトの名無しさん:2012/05/27(日) 22:12:54.12
bad_allocが投げられるようなシチュエーションではもはや何をやっても大抵ダメ
って書いてある本があったな

Exceptional C++だったかな?

404 :デフォルトの名無しさん:2012/05/27(日) 22:14:48.61
>>402
new int[0]が何を返そうがどうでも良いんだけどね。
どうせ0なんだから代入しないわけだし。
問題はdelete[]がnew int[0]で確保した何かを
削除して落ちるのが合法かというわけで。

405 :デフォルトの名無しさん:2012/05/27(日) 22:17:32.68
>>404
勿論合法。>>398もエラー無しの正常終了。VCでもエラーでなかったよ。

406 :デフォルトの名無しさん:2012/05/27(日) 22:20:18.83
>>403
大抵はダメでも対処するケースはそれなりにある
可能な限りキャッシュを開放してロックを解除とかね
プロセス外部にあるロックは鼓動が止まってから
しばらく立たないと解除されないから、開放できるものがあるなら
最後の余力を使って可能な限り解放したほうがいい

407 :デフォルトの名無しさん:2012/05/27(日) 22:21:29.08
>>405
de;ete[] new int[0];で異常終了が合法なの?
りょうかーい。

408 :デフォルトの名無しさん:2012/05/27(日) 22:25:00.40
大抵は盛大にリークしまくりモードで焼け牛に水状態なんだけどな。
実装によっては開放した途端OSにボッシュートされてヨソにもってかれたりとかも。

409 :デフォルトの名無しさん:2012/05/27(日) 22:29:37.55
Windows Me以前か、Windows以外のOSか?
基本的に
ヒープが空 = アドレス空間に空きがない
であって
ヒープが空 = システムの記憶領域が足りない
じゃないからな。後者だとプログラム以前にOSが止まる。

410 :デフォルトの名無しさん:2012/05/27(日) 22:30:27.97
>>407
ちゃうねん。異常終了しないのが合法。

411 :デフォルトの名無しさん:2012/05/27(日) 22:31:42.59
焼け牛…そういえば、牛に衝突すると「モー」となくドライビングゲームがあってだな…

412 :デフォルトの名無しさん:2012/05/27(日) 22:58:10.60
若干スレチですが、
cmathのrand()って周期いくつか分かりますか?

413 :デフォルトの名無しさん:2012/05/27(日) 23:00:29.78
若干スレチですが、
cmathのrand()って周期いくつか分かりますか?

414 :デフォルトの名無しさん:2012/05/27(日) 23:03:46.58
2分弱かな・・・。

415 :デフォルトの名無しさん:2012/05/27(日) 23:15:26.42
>>413
そんなもの存在しない

416 :デフォルトの名無しさん:2012/05/27(日) 23:26:07.12
C++11ならMT19937が装備されたじゃん

417 :デフォルトの名無しさん:2012/05/28(月) 00:05:41.96
>>413
cmathの中にrandはない。他の場所にあるrandの周期は実装によって異なる。

418 :デフォルトの名無しさん:2012/05/28(月) 00:15:04.79
randの仕様見たけど、ほとんど仕様ないんだな

419 :デフォルトの名無しさん:2012/05/28(月) 00:24:54.98
線形合同法だったり、なんかビット操作して128bit周期にしてみたりとか色々実装があるね。

420 : ◆QZaw55cn4c :2012/05/28(月) 03:46:04.96
最近のはやりは、それでも基本線形合同、ただし表に返すのは上から半分

421 :デフォルトの名無しさん:2012/05/28(月) 05:52:39.32
それは仕様がない

422 :デフォルトの名無しさん:2012/05/28(月) 10:47:20.39
土日に盛り上がってたんだな・・・

>>361
RAII(スマポ)使うかtry-catch(-rethrow)するか2択なんだし
両方しないのは単なる例外安全でないバグコードじゃね

Fooがバグってるのに
Foo「俺のせいじゃないです、bad_alloc投げたやつせいです」
それあんまりじゃね

423 :デフォルトの名無しさん:2012/05/28(月) 12:00:15.12
>>403
どうしようも無いケースも多いだろうけど
オンメモリで小さいテキストを処理する機能にクソでかいファイル渡すとか
オプションで何かのバッファサイズに無茶な値を設定したとかあるし

対話型なら別にプロセス落とさなくても
入力ハンドラあたりでcatchしてエラー表示して続行でよくね

424 :デフォルトの名無しさん:2012/05/28(月) 12:34:04.34
まったくだ。数ある「例外処理したくない」言い訳のひとつだろ。

425 :デフォルトの名無しさん:2012/05/28(月) 14:26:54.15
>>423
画面表示もメモリ食うんじゃないのか?

426 :デフォルトの名無しさん:2012/05/28(月) 18:21:20.59
>>425
>>423の2,3行目のケースならメモリ大量消費処理から
入力(\nやマウスイベント)ハンドラまでスタックが戻った時点で
メモリは解放されてる(例外安全なコードなら)

戻って尚足りないなら、どうしようも無いケースってことで

427 :デフォルトの名無しさん:2012/05/29(火) 09:45:22.55
リソースが厳しい組み込み系以外で、
コンパイラオプションで例外を無効にしてる人っている?

428 :デフォルトの名無しさん:2012/05/29(火) 13:24:28.38
>>427
Google社員がそうじゃね?

429 :デフォルトの名無しさん:2012/05/29(火) 21:19:59.03
PSP、DS、360、Wii全部例外切ってやってた

430 :デフォルトの名無しさん:2012/05/29(火) 21:59:51.13
>>429
コンパイラー何使った?

431 :デフォルトの名無しさん:2012/05/29(火) 22:52:35.80
CODE WARRIOR

432 :デフォルトの名無しさん:2012/05/30(水) 01:10:25.39
>>429
427 じゃないけど、なんで切ったのか気になるなー。
プログラムサイズ?実行速度?

433 :デフォルトの名無しさん:2012/05/30(水) 04:20:14.38
>>431
それはコンパイラーじゃなくて統合開発環境じゃん。てのは置いといて、
CodeWarriorについて来るコンパイラーは、そもそもthrow-try-catchが
まともに動かんだろ。

434 :デフォルトの名無しさん:2012/05/30(水) 07:38:21.36
例外切るとstd::stringやstd::vectorとかも実質使えないから
ベターCとしてのC++になるのかな

435 :デフォルトの名無しさん:2012/05/30(水) 08:05:44.79
STLも使えなくなるな
いやまて例外を投げるメンバ関数だけ切ればいい話か

436 :デフォルトの名無しさん:2012/05/30(水) 08:28:18.20
クラスのポインタって実体はあるの?

class sub{
public:
int aaaa;
};

claaa sper{
public:
sub* s;
};

↑特にこういう時

437 :デフォルトの名無しさん:2012/05/30(水) 08:37:44.75
メンバへのポインタあるだろ

(sub::**s)になるのかな

438 :デフォルトの名無しさん:2012/05/30(水) 08:38:14.93
あ、ただしこれは単独では使えないからね
インスタンスと組み合わせて使わないと意味をなさない
オフセットのようなものか

439 :デフォルトの名無しさん:2012/05/30(水) 08:46:53.93
sperをインスタンス化してもsubは不定かNULLポインタだな。

440 :デフォルトの名無しさん:2012/05/30(水) 08:50:28.22
それはコンストラクタの初期化リストか他のメンバ関数でnewするしかないね
他の配列やPODなんかを指しても別にいいけど
ただクラスはstaticメンバでない限り多数生成する目的なんだからやはりnewだろうね
そしてデストラクタにはdeleteを入れる

スマポを使うと楽だけどな

441 :デフォルトの名無しさん:2012/05/30(水) 08:52:29.69
オブジェクトを作って配下の変数やクラスにもデータを入れているのに
初期化関数を抜けたらポインタで持たせているデータだけNULLになっていました。
char*とかがそうです。中身を持たせているのにも関らず消えてしまうのはなぜなんでしょうか?

442 :デフォルトの名無しさん:2012/05/30(水) 09:00:09.20
具体的に書いてみろや
文章だけじゃイメージ沸かない

443 :デフォルトの名無しさん:2012/05/30(水) 09:17:17.40
>>436
こんな感じかなあ
class sub {
public:
int aaaa;
};

class sper {
public:
sub* s;
};

int main()
{
sub* su = new sub;
sper* sp = new sper;

sp->s = su;
int sub::*aa = &sub::aaaa;
su->*aa = 1;
std::cout << su->*aa << std::endl;
sp->s->aaaa = 2;
std::cout << su->*aa << std::endl;

delete sp;
delete su;
}

444 :デフォルトの名無しさん:2012/05/30(水) 09:42:39.53
クラスの配列をコンストラクタで初期化することってできますか?
class test{
public:
cObj* objArray[10];
test() : objArray[0](new cObj) {};
};

みたいな感じなんですが・・・・・

445 :デフォルトの名無しさん:2012/05/30(水) 09:50:21.49
>クラスの配列をコンストラクタで初期化することってできますか?
できる。

446 :デフォルトの名無しさん:2012/05/30(水) 09:56:04.82
>>445
どうやって?

447 :デフォルトの名無しさん:2012/05/30(水) 09:58:31.43
やればできる
できないと思った瞬間にゲーム終了だ

448 :デフォルトの名無しさん:2012/05/30(水) 09:58:34.74
>>445
それできるのか? 知らんかった

449 :デフォルトの名無しさん:2012/05/30(水) 10:05:05.19
newしたオブジェクトをdeleteする際に下のエラーが出て困っています。 どうしたらいいか教えてください。

HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 )
Windows によって hoge.exe でブレークポイントが発生しました。

ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。

可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

450 :デフォルトの名無しさん:2012/05/30(水) 10:19:59.96
ソースを示せ

nullをdeleteしてるんだろ

451 :デフォルトの名無しさん:2012/05/30(水) 10:23:54.40
>>444
デフォルトコンストラクタでいいならvectorにでも突っ込めばいいけどな

452 :デフォルトの名無しさん:2012/05/30(水) 10:41:58.15
>>449
地道にデバッグするしかない
書いちゃダメなところに書いてる
多くの場合、配列の添字かポインタが意図しない値になってる

453 :デフォルトの名無しさん:2012/05/30(水) 10:51:41.49
>>450
無理!
超雑だし、吐き気を催すだろうからww

>>452
なるほど・・、取りあえずやってみます。

454 :デフォルトの名無しさん:2012/05/30(水) 10:57:58.23
答え:雑だから

455 :デフォルトの名無しさん:2012/05/30(水) 11:04:26.07
>>454
明日から背中に気をつけろよ

456 :デフォルトの名無しさん:2012/05/30(水) 11:13:47.59
ソースも出せないカスプログラムをデバッグさせられるのは嫌だ

457 :デフォルトの名無しさん:2012/05/30(水) 11:25:43.53
どっちにしろって所だけどな
カスだろうがカスじゃなかろうが、カス扱いは確実だろう
やりたくなきゃやらなきゃ良い

458 :デフォルトの名無しさん:2012/05/30(水) 11:32:25.52
心のさけびをぶっぱされても・・・

459 :デフォルトの名無しさん:2012/05/30(水) 11:40:58.92
動的メモリ確保でいいならアライメントを解決した領域に単純なplacement new、
それが嫌ならaligned_storageから作れるスタック領域にplacement newをforなりwhileなりの
繰り返し構文で回せばできるだろ。

460 :デフォルトの名無しさん:2012/05/30(水) 11:43:19.03
sizeof使った部分特殊化で重複定義を回避する方法って何か無いですかね?
http://ideone.com/Axkqv
http://ideone.com/k4arh
http://ideone.com/7vhhV

461 :デフォルトの名無しさん:2012/05/30(水) 11:43:25.50
自分でnewしたものをdeleteできないなんてプログラマとしてどうなんだ

462 :デフォルトの名無しさん:2012/05/30(水) 11:46:14.46
おとなしくスマートポインタ使えよ。

463 :デフォルトの名無しさん:2012/05/30(水) 11:56:39.78
>>460
mpl::mapを使えばできる。
ちょっと待っててね。

464 :デフォルトの名無しさん:2012/05/30(水) 12:18:14.76
>>460
できたよー(^o^)ノ
ttp://ideone.com/pkiS4

465 :デフォルトの名無しさん:2012/05/30(水) 12:35:47.70
またnullをdelete出来ないと思ってるアホが居る…

466 :デフォルトの名無しさん:2012/05/30(水) 12:35:57.38
>>464
ありがとうございます
template<int n>にして目的のものが出来ました

467 : ◆QZaw55cn4c :2012/05/30(水) 12:41:05.43
free(0)はOKなんですけど、delete はだめなんですか?

468 :デフォルトの名無しさん:2012/05/30(水) 12:45:23.75
delete nullptr; は何ら間違ってはいない。
前規格だと delete NULL; かな。

469 :デフォルトの名無しさん:2012/05/30(水) 18:35:27.65
ソースも出さずにデバッグ出来るのはエスパーだけ

元のソースが秘密で出せないのならせめて症状が再現する最小のプログラムだけでも
示してくれないと何も出来ないから

470 :デフォルトの名無しさん:2012/05/30(水) 18:57:32.46
質問の意図や前提をくみ取れない糞質問
が多い。それで回答者が逆質問をしたり
悪口を言ったりする。それを前もって思
い描く力が絶望的に欠如してるに違いない。
スーパーハッカーだけが意図を理解できる。
レアなそういう神が颯爽と登場する予感。

471 :デフォルトの名無しさん:2012/05/30(水) 19:47:02.72
>>468
NULLじゃなくて0じゃね?
NULLは、Cとの互換で残ってて
元々非推奨だし

472 :デフォルトの名無しさん:2012/05/30(水) 20:19:34.26
NULLが非推奨って何の話だ

473 :デフォルトの名無しさん:2012/05/30(水) 20:24:15.21
0がNULL扱いになった頃の話

474 :デフォルトの名無しさん:2012/05/30(水) 20:24:50.01
逆じゃね?

475 :デフォルトの名無しさん:2012/05/30(水) 20:29:53.11
ネットじゃ文章が見当たらんけど
NULLだと、0だということがぼやけるから
という事だったハズ

476 :デフォルトの名無しさん:2012/05/30(水) 20:36:29.39
#define NULL (void*)~0

0がぼやけるってのを補足するとNULLだと別に
0じゃなくてもいいんだけど、C++じゃdynamic_castとか
deleteとか無効アドレスとして0を前提とした
言語機能があるもんで、NULLだと値が不定でマズイ


477 :デフォルトの名無しさん:2012/05/30(水) 20:39:30.91
4.10 Pointer conversions [conv.ptr]
1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that
type and is distinguishable from every other value of pointer to object or pointer to function type. Two null
pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer
to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification
conversion (4.4).

JIS-X3014
4.10 ポインタ変換
ゼロと評価される右辺値を持つ整数型の汎整数定数式(5.19)を、空ポインタ定数と呼ぶ。空ポインタ定数
は、ポインタに変換する事ができる。その結果は、その型の空ポインタ値となる。空ポインタ値は、オブジェクト先
ポインタ型 又は 関数型ポインタ型のどんな値とも区別できる値とする。同じ型の二つの空ポインタ値は、
比較で等しくなるものでなければならない。空ポインタ定数から、cv修飾付きの型へのポインタの変換は、
単一の変換となり、ポインタ変換の後で修飾変換(4.4)を行うことはできない。

C++ではCと違い、void*を任意のポインタに代入する場合には明示的なキャストをしなくてはならなく
なったためにvoid*を使うメリットがなくなったという話

しかし単なる 0 をヌルポインタなのかdouble型の0.0なのかコンパイラが判別出来ないためにまだ問題が
残ったので、C++11ではnullptrを新設した

478 :デフォルトの名無しさん:2012/05/30(水) 20:42:10.74
>>477
C++98とかそんな最近の話じゃないぞ

479 :デフォルトの名無しさん:2012/05/30(水) 20:44:03.62
>>478
ISO/IEC 14882:2003だぞ

480 :デフォルトの名無しさん:2012/05/30(水) 20:48:17.83
>>479
98年以前から言われてた話だってこと
そっからすると2003は最近でしょ

あと、仕様が出来た理由と非推奨の話は別だからね
仕様書に書いてる話じゃなく禿のコラムとかそっちに
書いてあった内容だから

481 :デフォルトの名無しさん:2012/05/30(水) 21:01:09.85
http://www.libjingu.jp/trans/bs_faq2-j.html#null
標準化前というとiostream.hとかの時代かなあ

482 :デフォルトの名無しさん:2012/05/30(水) 21:15:42.11
>>434
例外切ってるけどstd::stringやstd::vectorはフルに使うよ。何かまずいの?

483 :デフォルトの名無しさん:2012/05/30(水) 21:43:54.88
>>480
D&Eの日本語版のP291から書いてあるな

484 :デフォルトの名無しさん:2012/05/30(水) 23:01:04.82
>>482
中でメモリ確保失敗したらどうすんの?

485 :デフォルトの名無しさん:2012/05/30(水) 23:12:10.31
>>484
メモリ確保失敗しないように作る。ゲーム開発では普通のこと

486 :デフォルトの名無しさん:2012/05/31(木) 00:04:33.51
>>485
そりゃ製品はそうなるだろうけど、開発中には失敗しちゃうこともあるでしょ。
呼び出し元でチェックとかできないわけだけど、どうすんの?
わけわかんない動作が起こってから調べに行くの?

487 :デフォルトの名無しさん:2012/05/31(木) 00:13:37.94
>>486
なぜ呼び出し元でチェックできないのかよくわからんけど

488 :デフォルトの名無しさん:2012/05/31(木) 00:17:11.33
NULLチェックすりゃいいじゃんね

489 :デフォルトの名無しさん:2012/05/31(木) 00:25:19.96
new (nothrow) 使うんだろ

490 :デフォルトの名無しさん:2012/05/31(木) 00:27:53.20
>>487
vectorの中のメモリ確保失敗は標準C++ではbad_allocなんかの例外で通知されるんだけど、
例外無効にしてる状態で呼び出し元でチェックしようとしたら何かしら標準以外の方法を使うことに
なるんじゃないの?

>>488-489 vectorやstringではそうはいかないでしょ。

491 :デフォルトの名無しさん:2012/05/31(木) 00:29:39.31
>>490
例外未対応の処理系ならabortへ直行

492 :デフォルトの名無しさん:2012/05/31(木) 00:35:15.99
GoogleならSTLに頼らない独自の配列クラスとか作ってるらしい

493 :デフォルトの名無しさん:2012/05/31(木) 00:44:25.22
>>491
やっぱそうか。ありがとう。

494 :デフォルトの名無しさん:2012/05/31(木) 00:45:33.18
まあヌルポにアクセスしちゃうからね

495 :デフォルトの名無しさん:2012/05/31(木) 00:46:14.25
>>476
んなこたーない。

496 :デフォルトの名無しさん:2012/05/31(木) 07:20:19.34
ヌルポは必ず 0 だよ
ビット表現が ~0 だろうが
ソース上は必ず 0 で表現する
だから >>476 はあり得ない
というか (void*) 付きの NULL は C++ じゃなくて C だし
>>476 は無茶苦茶やで

497 :デフォルトの名無しさん:2012/05/31(木) 07:29:48.78
~ヌルポ

498 :デフォルトの名無しさん:2012/05/31(木) 10:50:31.28
ソースコード上のポインタリテラルの0はNULLとして扱われるが
内部表現が0(0番地)とは限らない

//OK
int* p = 0;
delete p;

//NG ただし殆どの環境で問題は起こらない
int n = 0;
int* p = reinterpret_cast<int*>(n);
delete p;

499 :デフォルトの名無しさん:2012/05/31(木) 11:32:04.45
そんなもん知ってる

500 :デフォルトの名無しさん:2012/05/31(木) 12:16:01.43
C FAQ 読め。んで、そこに書いてあることは繰り返し書かなくていい。
http://www.kouno.jp/home/c_faq/c5.html

501 :デフォルトの名無しさん:2012/05/31(木) 12:30:10.64
それCや

502 :デフォルトの名無しさん:2012/05/31(木) 12:57:36.36
規格票読んでもこの点に付いては同じ

503 :デフォルトの名無しさん:2012/05/31(木) 13:01:32.98
規格にこだわる人に限ってたいしたプログラムを書けない

504 :デフォルトの名無しさん:2012/05/31(木) 13:02:29.84
○○○さんのことかー

505 :デフォルトの名無しさん:2012/05/31(木) 13:08:12.51
deleteするのとNULLを代入するのとどう違うんだよ

506 :デフォルトの名無しさん:2012/05/31(木) 13:19:43.41
>>503
馬鹿かお前は
規格票は無駄な議論を終わらせるためにある

507 :デフォルトの名無しさん:2012/05/31(木) 13:20:03.68
どこが同じなんだよ

508 :デフォルトの名無しさん:2012/05/31(木) 14:39:11.68
deleteしてからNULLにしなきゃいけないのはなぜ?
最初からNULLじゃ駄目なの

509 :デフォルトの名無しさん:2012/05/31(木) 14:51:05.54
>>508
int *a = new int(0);
delete a;
a = nullptr;

の事?それなら、

int *a = new int(0);
delete a;
a = nullptr;
... // いろいろな処理
delete a; // 重複delete

っていうのを仮にしたとしてもプログラムを落とさせないためだと思う。
でもそれやるくらいならunique_ptr使った方がいいし、これが必要な場面というと
「もしかしたらコードの中途半端な所でメモリ削減のためにdeleteする場合があるけど最終的な終了場面でもdeleteしたい」
っていうそうとうトリッキーで可読性の低い時だから推奨は推奨はしない。

510 :デフォルトの名無しさん:2012/05/31(木) 14:51:43.63
誤字まくりだけど気にしないで。

511 :デフォルトの名無しさん:2012/05/31(木) 15:16:43.24
>>505 >>508
GCの話・・・なわけないよな

512 :デフォルトの名無しさん:2012/06/01(金) 00:39:38.16
>>400
>メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了
ないわwwwwww
newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって
set_new_handler()に有効なnew_handlerを設定すれば、メモリ確保に成功するか、
new_handlerから例外を投げるかするまでnew_handlerが繰り返し呼ばれるのじゃ

というわけでど素人相手に潰れた漏れの土日を返せよ;

ま、漏れの意見を潰したければ、>369の無駄な複雑さに噛み付くべきであった

513 :デフォルトの名無しさん:2012/06/01(金) 00:47:51.29
>>422
Fooがバグっていたとして、叫ぶことになるのがFooの作者とは限らん
ていうか、std::vector<T>にしても、コンストラクタからTのコンストラクタが呼ばれるわけだが、
その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?
いちおうVS2008ではリークしないみたいだけど、ようわからんので>376への回答は避けといた

514 :デフォルトの名無しさん:2012/06/01(金) 01:07:08.93
>>512
> newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって

そんな動作しません。

set_new_handler(0) はデフォルトのハンドラを指定していることになるので、普通に bad_alloc が飛ぶ。

515 :デフォルトの名無しさん:2012/06/01(金) 02:06:07.06
>>513
> Tのコンストラクタが呼ばれるわけだが、
> その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?

new TでTのコンストラクタが例外を投げたらTのために確保されたメモリは解放される。
new T[x]でどこかの要素の構築中にTのコンストラクタが例外を投げたら構築済みの要素のデストラクタが呼ばれ確保されたメモリは解放される。
ただしTの内部でコンストラクタの中断でリークがおきるならそれはリークする。

516 :デフォルトの名無しさん:2012/06/01(金) 02:12:02.44
>>513
>リークしないことが仕様で
リークしたらバグ
リークしないためのRAII
http://ideone.com/Z52HM

517 :デフォルトの名無しさん:2012/06/01(金) 06:27:50.13
>>512
お前が例外出さない方法があるって言ったから提示してくれた案だろ
痴呆かよ

518 :513:2012/06/01(金) 06:36:18.11
しつれい ×: >376 ○: >378

>>514
ありゃ確かにそうかも、、、
// (main()の冒頭で)
std::new_handler prevHandler = std::set_new_handler(foo);
std::cout << "p=0x" << prevHandler << std::endl; // p=0x00000000



519 :デフォルトの名無しさん:2012/06/01(金) 06:39:59.13
>>517
>お前が例外出さない方法があるって言ったから提示してくれた案だろ
┐(´ー`)┌
気持ちは有難いが、規格準拠じゃない挙動を案と言われても困るな、、


520 :デフォルトの名無しさん:2012/06/01(金) 06:51:04.78
ということで結局メモリー枯渇したらnewで例外は避けられん訳だ

521 :デフォルトの名無しさん:2012/06/01(金) 07:25:18.44
nothrowしろよ

522 :デフォルトの名無しさん:2012/06/01(金) 08:15:17.43
例外安全にするかabortだろ
NULL返す意味ねーよ

523 :デフォルトの名無しさん:2012/06/01(金) 10:10:18.87
C++で背景画像とロゴ画像が二つ作ってあるときに
ロゴ画像のロゴ以外の部分(何も無い余白部分)を透明にして
ロゴ画像の何も無い部分には背景画像が映るようにするにはどうしたらいいんですか?

524 :デフォルトの名無しさん:2012/06/01(金) 10:13:12.39
>>523
画像を二枚読んで合成する。
具体的には、
ロゴ画像のとある位置の色が透過色だったら背景色を出力バッファに書き込む。
透過色じゃなかったらロゴの色を出力バッファに書き込む。

それだけ。

525 :デフォルトの名無しさん:2012/06/01(金) 10:30:01.46
だからそのやり方を(ry

526 :デフォルトの名無しさん:2012/06/01(金) 10:36:08.00
分かってない人に分かり難く言っても絶対分からない

527 :デフォルトの名無しさん:2012/06/01(金) 10:38:55.07
む〜。これ以外にどう説明しようか。

>>524
画像を読むときはファイルオープンして画像フォーマットにそって画素データを読み込む。
画像ファイルフォーマットは数多にあるので対象になるものをググれ。
後は画素を比較して出力バッファに書き込むだけなんだが・・・。

コードがほしいなら宿題スレでお願いしてみるのがいいかもしれん。
あんまりいい方法じゃないけどな。


528 :デフォルトの名無しさん:2012/06/01(金) 10:41:38.98
>>523の内容だけじゃ
>>524ぐらいしか言えないだろw

APIも画像フォーマットも謎なんだし

529 :デフォルトの名無しさん:2012/06/01(金) 10:43:34.01
できるだけプラットフォーム非依存にするならDeVILで読み込んでOpenGLのテクスチャにして
合成はOpenGL側でやるとかか

530 :デフォルトの名無しさん:2012/06/01(金) 11:19:10.19
>>528
用件が解決する方法であればなんでもいいだろ
客先で「画像形式は?」「API使います?」なんて聞くエンジニアは見たこと無い
指定が無いなら勝手に決めればいいこと

531 :デフォルトの名無しさん:2012/06/01(金) 11:22:53.98
>>526
このスレではよくあること
理解してても他の人の説明聞くと「えっ?」ってなる

532 :デフォルトの名無しさん:2012/06/01(金) 11:23:40.51
何で客に聞く話になるんだよwアホ杉だろw

533 :デフォルトの名無しさん:2012/06/01(金) 11:31:27.28
質問もせずに独断で決めるエンジニアとか嫌だ
同じチームなら困る

534 :デフォルトの名無しさん:2012/06/01(金) 11:59:26.97
画像形式ぐらいさすがに聞くだろ…

535 :デフォルトの名無しさん:2012/06/01(金) 12:51:38.25
暇でしょうがないから突貫で作ったよ。3時間ではこれが限界。
ttp://www1.axfc.net/uploader/File/so/79537.zip&key=2ch

もっと手を抜くつもりだったけど思ったよりかかってしまった。
画像形式はPGMテキストだ!まさに外道。

我を崇めよ〜〜〜。はっは〜〜。

536 :デフォルトの名無しさん:2012/06/01(金) 13:21:30.92
カスだった

537 :デフォルトの名無しさん:2012/06/01(金) 13:36:25.45
>>536
よく言った。その功績を讃えてすごいサンプルを作る義務をあげるよ。
たのんだよ〜。

538 :デフォルトの名無しさん:2012/06/01(金) 13:38:30.63
ヘッダーに定義を書くなよ

539 :デフォルトの名無しさん:2012/06/01(金) 13:46:27.56
>>538
テンプレート書いてた時の癖でベタ書きしてしまう。
手抜きの意味もあるんだが、正直スマンカッタ。

540 :デフォルトの名無しさん:2012/06/01(金) 15:29:52.12
なにもしないやつほど文句を言う典型例

541 :デフォルトの名無しさん:2012/06/01(金) 16:48:21.33
突貫としても低レベル過ぎ

542 :デフォルトの名無しさん:2012/06/01(金) 19:23:02.02
>>538
今は、ヘッダー別のプリコンパイルドヘッダーも
あって速度も速いんだからいいじゃねぇか

543 :デフォルトの名無しさん:2012/06/02(土) 00:03:30.05
>>542 そういう問題じゃないだろ。

544 :デフォルトの名無しさん:2012/06/02(土) 02:49:02.35
>>541
腕がないのはしょうがない。仕様だ。
処理が低級っていうだったら、概念を説明出来ればいいかなと割り切ったんだよ。

ま、高尚なライブラリは俺がドキュメント読めなくて使えないんだけどね。
お、俺にもっと能力をくれ・・・。

545 :デフォルトの名無しさん:2012/06/02(土) 04:07:18.14
胸がないのはしょうがない。仕様だ。

546 :デフォルトの名無しさん:2012/06/02(土) 04:09:06.20
>>545
きょぬー甘え。

547 : ◆QZaw55cn4c :2012/06/02(土) 04:34:28.04
>>545
賓乳萌え

548 :デフォルトの名無しさん:2012/06/02(土) 10:53:04.80
貧乳が好きなのは肉体労働者だそうです
頭脳労働者はグラマーが好きな傾向が高いです

549 :デフォルトの名無しさん:2012/06/02(土) 12:15:53.19
プログラマーと言いたいようだから先に言っておこう

550 :デフォルトの名無しさん:2012/06/02(土) 12:21:02.95
数学者はたぶん虚乳が好き。

551 :デフォルトの名無しさん:2012/06/02(土) 12:21:38.68
このスレおやじばっかw

552 :デフォルトの名無しさん:2012/06/02(土) 12:24:48.04
わてはピチピチの女子高生でおまんがな

553 :デフォルトの名無しさん:2012/06/02(土) 13:54:10.94
>>551
オヤジはプログラマなんて出来ないよ
連日徹夜でしかも頭の柔らかさを必要とするIT土方だから、定年が35才と言われている
それまでに管理職に移動出来ないと悲惨な人生が待っている

554 :デフォルトの名無しさん:2012/06/02(土) 16:03:52.76
>>553
確かに力づくでコーディングしている人は体力がなくなると終わりだが、
センスや技術がある人はいくつになってもプログラマできるよ。


555 :デフォルトの名無しさん:2012/06/02(土) 16:40:55.85
センスも技術も年で劣化するから・・・

556 :デフォルトの名無しさん:2012/06/02(土) 16:52:31.83
プログラマ35歳定年説とか
ただのヘボプロブラマだけの話だよ

557 :デフォルトの名無しさん:2012/06/02(土) 17:09:55.44
経験豊富になってダメな囲い込み技術の(未来のどん詰まり具合を)見抜けるようになると
その日の飯の種を拾う(3年後には)無駄/死亡と判りきってる学習が億劫に成っちゃうからねー

ケツの軽い若い時期しか無理ってのは確かだと思うよ

558 :デフォルトの名無しさん:2012/06/02(土) 17:12:13.66
マ板でやれ

559 :デフォルトの名無しさん:2012/06/02(土) 18:14:27.03
>>556
お前プログラマじゃないだろ・・・

560 :デフォルトの名無しさん:2012/06/02(土) 19:05:05.40
>>559
プログラマだよ
まだ35じゃないけど

561 :デフォルトの名無しさん:2012/06/02(土) 19:13:26.54
>>555
センスも技術も年で劣化するからダメというのなら、
どんな職業も35歳で定年だな。


562 :デフォルトの名無しさん:2012/06/02(土) 19:14:14.71
クラスを配列に動的に確保したいんですが
hoge *h;
h = new hoge(int ho)[size];
とかだとコンストラクタの引数を変えれないので
*(h+1) = new hoge(int ho);
*(h+2) = new hoge(int ge);
みたいにできないでしょうか

563 :デフォルトの名無しさん:2012/06/02(土) 19:21:04.50
別にコンストラクタを使わなあかんゆう決まりはないんやで

564 :デフォルトの名無しさん:2012/06/02(土) 19:27:14.73
コンストラクタでなくても
parent *h;
h[0] = new child1();
h[1] = new child2();
みたいな使い方がしたいんです

565 :デフォルトの名無しさん:2012/06/02(土) 19:29:43.99
いや、h[0].init(ho); やあかんのん?

どうしても new したいのなら boost::ptr_vector<T> でも使っとき
C++11 なら std::vector<std::unique_ptr<T>> でもええけど

566 :デフォルトの名無しさん:2012/06/02(土) 19:33:32.17
>>562
std::vector<hoge> h;
h.reserve(size);
h.push_back(hoge(ho));
h.push_back(hoge(ge));
...

567 :デフォルトの名無しさん:2012/06/02(土) 19:36:28.00
>564 ttp://ideone.com/Q0B7n

568 :デフォルトの名無しさん:2012/06/02(土) 19:53:32.36
>>565-567
ありがとうございます、試してみます

569 : ◆QZaw55cn4c :2012/06/02(土) 20:19:43.25
>>548
へーそうなんだ、なして?

570 :デフォルトの名無しさん:2012/06/02(土) 21:45:33.58
Java使いで、C++初心者です。
C++でも、
xxx.method(new A());
と書けると思うんですが、
この場合、Aのインスタンスのdeleteは、
どこですべきなのでしょうか?
method内ですると、
A *a = new A();
xxx.method(a);
のときにもdeleteされてしまい、その後使えなくなってしまいます。

C++では、
xxx.method(new A());
という使い方はよくないのでしょうか?


571 :デフォルトの名無しさん:2012/06/02(土) 21:49:42.82
うん。良くない。unique_ptrとかshared_ptrを使うべき。

572 :デフォルトの名無しさん:2012/06/02(土) 21:58:36.41
そもそもmethod側がnewすべきじゃね

573 :デフォルトの名無しさん:2012/06/02(土) 22:19:09.09
っていうかぁー。
Javaはすべてのオブジェクトをnewで生成するけど、
C++はnewでオブジェクトと生成するのは
「スコープを私(プログラマ)が管理しますよ」って宣言するのとほとんど同義なのでー
生成した人が、破壊を管理しないといけないんですよー。

で、xxx.methodの中で破棄するなら、
それは生成と破棄をxxxが管理すべきですしー
xxx.methodを呼び出す側が生成しているなら、破棄も呼び出す側の責任ですしー
もしくは、A自身が己の破棄を自前で行うよう設計する必要があるわけですよー。

…タブンネ。

574 :デフォルトの名無しさん:2012/06/02(土) 22:20:16.71
Decorator とか Builder とか Strategy とか


575 :570:2012/06/02(土) 22:44:41.62
shared_ptrを使えば、deleteしなくていいみたいなので、
Java感覚でできるということですね。
>>571さんありがとうございました。


576 :デフォルトの名無しさん:2012/06/02(土) 23:01:03.29
Java感覚でプログラミングしたら
C++使う意味ないね

577 :デフォルトの名無しさん:2012/06/02(土) 23:16:06.28
基本はconst参照か右辺値参照でどうにかする事を考えるみたいなのがC++極右

578 :デフォルトの名無しさん:2012/06/02(土) 23:20:47.09
うっへんち参照はライブラリ(コンテナ)設計者以外はあんまし考えなくていいみたいよ?
ライブラリが正しく設計されていると、その利用者は右辺値参照について考慮しなくて済む。

579 :デフォルトの名無しさん:2012/06/03(日) 01:18:34.69
>>572
method関数がnewするなんてどこに書いてあった?

580 :デフォルトの名無しさん:2012/06/03(日) 08:22:12.26
C++は自動ガベージコレクションしてくれたりしないのでJavaみたいにnew/deleteを乱発してると
そのうちメモリが断片化してbad_alloc例外飛ばされるぞ

581 :デフォルトの名無しさん:2012/06/03(日) 08:23:50.71
GCと断片化に何のつながりが

582 :デフォルトの名無しさん:2012/06/03(日) 08:25:37.74
コピーガベージコレクションならコンパクションかけられると言いたいんだろ

583 :デフォルトの名無しさん:2012/06/03(日) 08:44:04.41
g++でgprofの使い方がイマイチ分からん。
何かいいリファレンスかサイトある?
特にclassのメソッドをよく使っているプログラムで解析しやすい方法が知りたい。

584 :デフォルトの名無しさん:2012/06/03(日) 08:45:23.25
あとついでにインライン展開を止める方法も。

585 :デフォルトの名無しさん:2012/06/03(日) 09:42:01.37
>>584
___attribute( 何か )___ で止められたはず
何かは、何だったか忘れた volatileだったかnoinlineだったかそんな感じだったはず

586 :デフォルトの名無しさん:2012/06/03(日) 12:51:55.87
GLSLシェーダやOpenCLカーネルのような実行時にコンパイルされるソースコードを
main.cpp等のファイル内に簡単に埋め込む方法はないでしょうか。
現在はchar型配列に

char data="int main(){..."

上のように書き込んでいますが見にくいので・・・(改行ごとにバックスラッシュを入れています)
boostや標準機能の中でもっと綺麗に書く方法があればご教示お願いします。

587 :デフォルトの名無しさん:2012/06/03(日) 12:56:38.80
ある

588 :デフォルトの名無しさん:2012/06/03(日) 12:59:33.93
>>586
std::stringを返す専用の引数なし関数にキックするとか。

589 :デフォルトの名無しさん:2012/06/03(日) 13:00:14.86
>>586
エスケープ済みの別ファイルsource.cppとか
作ってmainで#include"source.cpp"じゃだめなんけ
source.cppは、cl.cppみたいな別ファイルにソース書いといて
置換コマンドで、\,"を\\, \"に置き換えるだけ

590 :デフォルトの名無しさん:2012/06/03(日) 13:31:19.36
>>587,588,589
レスありがとうございます。
>>588
string型を返す専用関数で少しうまい方法を考えて見ます。
>>589
ヘッダのように別ファイルに書き込んで置換、というのは一度やってみたのですが
次の2点から少し敬遠していました。

・IDE上に並ぶファイルが増える。
・友人にコードを渡すときにヘッダが増殖する(lib化しろ、というのは最もなのですがWinとMac・・・)

588さんの書き込みを見ていろいろ探していたところ、
string tmp=STRINGIFY(int main(){...);
のような書き方をしているコードを見かけたので中を調べてみます。

皆様すぐにレスしていただきありがとうございました。

591 :デフォルトの名無しさん:2012/06/03(日) 14:13:54.22
構文エラー : ';' が '*' の前にありません。
と出てしまいます。エラー場所はこれだと思うのですが、文法が間違っているのかよくわかりません。

class Cabc{
 Cbdf* bdfaddr;
public:
 Cabc(Cbdf*);
};

Cabc::Cabc(Cbdf* tmp):bdfaddr(tmp){}

class Cbdf{
 Cabc* abc;
private:
 Cbdf(){abc = new Cabc(this)}
};

592 :デフォルトの名無しさん:2012/06/03(日) 14:22:16.98
Cabc(Cbdf*);

これは
Cabc(int*)
って書いてるようなものだ
Cabc(Cbdf* hoge);
とすれば消える

593 :デフォルトの名無しさん:2012/06/03(日) 14:36:17.77
Cabc(きゃびっく?)ってなんよ?

594 :デフォルトの名無しさん:2012/06/03(日) 14:44:26.79
>>591
きゃびっく型が事前に宣言してないきゃぶどふ型使ってるからだろ
きゃびっくの前に、class Cbdf;と書いとくか、Cbdf *bdfaddr;を
class Cbdf *bdfaddrと書けば行けるはずだ。
ただ、よっぽどの事情が無い限りクラス同士を循環参照すべきじゃない。
オブジェクト同士の循環参照は構わないが、その場合、抽象クラスなどを
用いてクラス定義では単一参照にする。

595 :デフォルトの名無しさん:2012/06/03(日) 14:45:17.51
>>593
Class ABC じゃね?

596 :デフォルトの名無しさん:2012/06/03(日) 14:49:01.51
プリフィクスはヤメロと・・・

597 :デフォルトの名無しさん:2012/06/03(日) 15:01:37.39
>>592
なるほど・・・
宣言時は省略できるもんだと思ってました

598 :デフォルトの名無しさん:2012/06/03(日) 15:02:43.71
>>596
便利じゃないですかー

599 :デフォルトの名無しさん:2012/06/03(日) 15:11:23.54
何に使うんだよ・・・
(今やプリフィクス禁止が基本なのに)

600 :デフォルトの名無しさん:2012/06/03(日) 15:22:11.28
今やというか、昔から禿はプリフィクス付けんなと言っているけどな
代わりに名前空間使えや

601 :デフォルトの名無しさん:2012/06/03(日) 15:23:27.27
>>597
いや、省略できるよ。そこは問題ない。問題は循環参照。

602 :デフォルトの名無しさん:2012/06/03(日) 15:25:32.98
これからはフィリックスの時代

603 :デフォルトの名無しさん:2012/06/03(日) 15:51:11.79
>>602
懐かしいな。黒い猫だろ。

604 :デフォルトの名無しさん:2012/06/03(日) 15:59:12.44
プラスネジじゃないの?

605 :デフォルトの名無しさん:2012/06/03(日) 19:44:49.39
>>591そのままのソースならnew Cabc(this)の後ろに;がないのが間違いだが

606 :デフォルトの名無しさん:2012/06/03(日) 20:03:46.47
>>601
ポインタの場合具体的な変数名を記入すれば回避できるという話では無いんですか?
それにしてもfunc(int*)という宣言は出来たような気がしますけど・・・

607 :592:2012/06/03(日) 20:05:20.92
592はただの知ったかだから無視すればいい

608 :デフォルトの名無しさん:2012/06/03(日) 20:08:14.92
えーと、じゃあ>>591のソースコードで出るエラーは>>605ぐらいしかなく、
とりあえず他のエラー要因は無いということですか?

609 :デフォルトの名無しさん:2012/06/03(日) 20:23:15.28
>>608
だから循環参照が原因だっつってんじゃねぇかハゲっ

610 :デフォルトの名無しさん:2012/06/03(日) 21:08:37.12
>>608
両方ポインタなら回避できると聞いたんですけど、違うんですか?

611 :デフォルトの名無しさん:2012/06/03(日) 21:15:31.14
ポインタでもCbdfが何かは書かないとわからない。class Cbdf;みたいに


612 :デフォルトの名無しさん:2012/06/03(日) 21:41:55.41
> とりあえず他のエラー要因は無いということですか?
既出のように>>591の適切な場所にCbdfの宣言と;を追加すればとりあえずコンパイルは通る
が、意図したように動くか?

613 :デフォルトの名無しさん:2012/06/03(日) 22:30:35.03
>>612
設計の話になってしまうのですが
マネージャークラスが保持する任意のクラスから、
同じくマネージャークラスが保持する他の任意のクラスにアクセスしたいんです。

ファイルの階層構造みたいな感じで、例えばwindowsの
Program FilesフォルダからWindowsフォルダにアクセスするときローカルディスクC:に戻るみたいな設計です。
C++風に書くと
LocalDiscAddress->GetWindowsAddr()->hoge

でも中々に読みづらい(´・ω・`)

614 :デフォルトの名無しさん:2012/06/03(日) 23:43:59.83
メモリポインタを使うと動くよ

615 :デフォルトの名無しさん:2012/06/04(月) 00:21:22.68
親クラス 子クラスがあります
親 hoge = new 子1
親 hoge = new 子2
みたいな感じで1つのオブジェクトで親と子の2クラスを両方扱いたいんです。

これは可能で、キャストすれば子独自のメソッドも使用可能なのはわかるんですが。

今親クラスのオブジェクトの宣言を std::auto_ptr で行なっているため、キャストが上手くいきません。
解決法としては、std::auto_ptr を辞めるしかないんでしょうか?他にいい方法がありましたら、
ご教授お願いします。



616 :デフォルトの名無しさん:2012/06/04(月) 00:22:55.89
std::auto_ptrはそれ無理です
std::unique_ptr使ってください

617 :デフォルトの名無しさん:2012/06/04(月) 01:25:07.50
>>615
auto_ptr でも static_cast<子1&>(*p) すりゃ何の問題も無いだろう。
何か他に制約があるようならコード晒せ。

618 :デフォルトの名無しさん:2012/06/04(月) 01:36:00.60
ダウンキャストするぐらいなら最初から子のauto_ptr使えよ

619 :615:2012/06/04(月) 01:36:05.78
dynamic_cast ではなく static_cast を使うんですか?
これは思いつきませんでした。ありがとうございます。

620 :615:2012/06/04(月) 01:42:13.45
初めは子の auto_ptr を使っていたんですが、コーディングが冗漫になったので
ダウンキャストしようかと。


621 :デフォルトの名無しさん:2012/06/04(月) 01:46:09.88
だったら親と子の型2つのスマポを用意して
同じオブジェクトを参照させるべき
auto_ptrじゃ使えねぇからshared_ptr使うことになるけどね

622 :デフォルトの名無しさん:2012/06/04(月) 02:24:53.64
>>619
型を自分で保証できるなら static_cast でいい。

623 :デフォルトの名無しさん:2012/06/04(月) 02:25:16.25
>>621
それはないわ。

624 :デフォルトの名無しさん:2012/06/04(月) 05:39:45.46
安易なダウンキャストは止めたほうがいい
根底と、派生2つのポインターで管理してる場合は、
派生クラスを差し替えた際、派生のポインターで
コンパイルエラーを引き起こせる。根底のポインターを
1個使い回しダウンキャストする方法だと、
派生を交換しても実行時になるまで、キャストミスに
よるエラーが解らない。関数スコープならそこまで
面倒じゃないが、クラススコープだと問題特定が面倒になる。

625 :デフォルトの名無しさん:2012/06/04(月) 07:07:32.40
UNIX系で C++ 勉強してて最近 Visual C++ 2010 はじめたばかりなんですけど
Visual C++ で時刻を取得するにはどうしたらいいんでしょうか

time.h インクルードしても
time_t time;
は宣言できるんですが
time(&time);
でエラーになります

レベルの低い質問ですいません…

626 :デフォルトの名無しさん:2012/06/04(月) 07:15:56.30
エラーの内容を書けと

627 :デフォルトの名無しさん:2012/06/04(月) 07:18:53.48
すいません><

式には(pointer-to0)関数型が必要です

っていうエラーがでます

628 :デフォルトの名無しさん:2012/06/04(月) 07:25:16.64
うわあ はずかしい
ごめんなさい 自己解決しました

time_t t;
time(&t);

にしたらとおりました
C++は関数と変数で名前空間かぶっちゃだめなんですね
授業でならうの Java が多いのでので知りませんでした
おさわがせしました><

629 :デフォルトの名無しさん:2012/06/04(月) 09:28:28.59
一定時間ごとにメッセージボックスを表示するだけのプログラムを作ったんですけど
メッセージボックスが表示されてないときにプログラム終了するには
タスクマネージャーからきるしかないんでしょうか…
好きなときに終了できるようにするにはどうするのがスマートなんでしょうか…

#include <windows.h>
#include <time.h>

#define INTERVAL 60

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
time_t prev = (time(NULL) + 300) / 1800;

while(1) {
time_t now = (time(NULL) + 300) / 1800;
if(now != prev) {
MessageBox(NULL, TEXT("時間で〜す"), TEXT("時間で〜す"), MB_OK | MB_TOPMOST | MB_SETFOREGROUND);
prev = now;
}

Sleep(INTERVAL * 1000);
}
}

630 :デフォルトの名無しさん:2012/06/04(月) 09:33:59.01
>>629
例えば「好きなとき」をキー入力で伝えることにすれば、てきとうな API でキー入力でも監視すればいいだろう。
心を読んで欲しいということならたぶん無理だ。

631 :デフォルトの名無しさん:2012/06/04(月) 09:43:08.60
あ〜 説明不足でごめんなさい

できればキーじゃなくて直感的に分かりやすい操作で終了dけいるようにしたいんですけど

たとえば常にベースパネルだけ表示させてそこに終了ボタンつけるとか…
下のタスクバーに表示させて右クリック終了みたいにできるとか…
って簡単にできますか?

なにぶん GUI プログラミング初心者なもので…

632 :デフォルトの名無しさん:2012/06/04(月) 09:59:34.74
Shell_NotifyIconでgoogle

633 :デフォルトの名無しさん:2012/06/04(月) 10:05:46.32
あ まさにやりことこれでした!
なんか難しそうですけどがんばってよんでみます!
ほんとにありがとうございました!


634 :デフォルトの名無しさん:2012/06/04(月) 10:12:32.33
>>629
今度からは環境を明記の上、環境依存OKのスレに書いてね。

635 :デフォルトの名無しさん:2012/06/05(火) 17:47:30.54
カンマで並列関係にある引数、(a1,a2)や(a,b)の順序が
固定されないのはいいけど
a1,a2,b1,a,b のように並列関係を超えて順序が未規定なのは何でだろう
これのせいで
f(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B()));
が危険なコードになってしまう

C++11で直せばよかったのに
どうせCと完全互換でないんだから例外に絡むところまで合わせる必要ないのに

636 :635:2012/06/05(火) 17:49:38.33
1行目消しちゃった

f(a(a1(), a2()), b(b1())));

637 :デフォルトの名無しさん:2012/06/05(火) 19:13:51.16
>>635
評価順序の話か?
その危険なコードとやらがどう危険なんだ?

638 :デフォルトの名無しさん:2012/06/05(火) 19:33:33.75
>>637
new A()実行後にunique_ptrに渡される前にnew B()が呼ばれ
Bのコンストラクタが例外を出すとAは解放されない
並列関係を超えない場合はnew A()の結果が必ずunique_ptrに渡されるので、
その後Bが例外を出してもunique_ptrのデストラクタで例外安全は保たれる

↓はshared_ptrでの例、C++11/unique_ptrでも同様
http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm
>Avoid using unnamed shared_ptr temporaries to save typing; to see why this is dangerous
>void bad()
>{
>  f(shared_ptr<int>(new int(2)), g());
>}

関数の引数で無名スマポを作ってはいけないという話

639 :デフォルトの名無しさん:2012/06/05(火) 20:01:42.25
一応引数内でもラムダ使えば評価順序をブロック化出来るか
流石にやんないけど
f([&](){return std::unique_ptr<A>(new A());}(), [&](){return std::unique_ptr<A>(new A());}());
http://ideone.com/hJh8q

640 :デフォルトの名無しさん:2012/06/05(火) 20:06:10.81
>>636
引数の評価順が固定されない方が最適化が楽な処理系があるからに決まってるじゃん

641 :デフォルトの名無しさん:2012/06/05(火) 20:16:38.14
>>640
それと引き換えにスマポを一時オブジェクトにすることで可能な最適化が出来なくなってる

あと評価順の固定とまでは言ってない、並列関係を越えないことの保証と言ってる
f(a(), b(d()), c())がb,c,aという順でもいいけど、
dとbの間にa,cが入らないのを保証して欲しいということ
その制限でも出来なくなる最適化はあるだろうけどさ、トレードオフに見合うかは疑問

642 :デフォルトの名無しさん:2012/06/05(火) 20:37:01.40
>>640
stdcallとcdeclじゃ引数の積み方が逆だし
今更固定にできないよな

643 :デフォルトの名無しさん:2012/06/05(火) 20:51:49.09
>>641
スマポはtemplateが入ってきてからboostから入れられた概念だろ
それに対し引数の評価順はC時代から規定されていない
スマポがC++98/2003にもう入っていたら規定されてたかもね

他にも&&や||のオーバーロードも短絡評価ではなく全部評価してしまう
という元の演算子とは異なる挙動を見せるなど問題点は一杯あるだろ
More Effective C++に書いてあるけど

644 :デフォルトの名無しさん:2012/06/05(火) 20:55:17.19
てか便利な仕様だな
コンパイラーベンダーは、引数で時間のかかる処理呼ばれたら
スレッド化する最適化とかすりゃいいのに

645 :デフォルトの名無しさん:2012/06/05(火) 21:03:14.06
でも並列化で早くなるかどうかは環境次第だしなあ
1コアで並列化しても意味が無いし

646 :デフォルトの名無しさん:2012/06/05(火) 21:06:49.51
アーキティクチャー指定でいいんじゃね
今でもSSEなんてそうだし

647 :デフォルトの名無しさん:2012/06/05(火) 21:28:25.32
数値と文字列で比較はできても結合できる必要は無いな
既に似たような仕組みがあるし

648 :デフォルトの名無しさん:2012/06/05(火) 21:28:43.05
誤爆した・・・

649 :デフォルトの名無しさん:2012/06/05(火) 21:31:12.76
似てるからね

650 :デフォルトの名無しさん:2012/06/05(火) 21:32:15.39
どこのを誤爆したかすぐにわかってしまったw

651 :デフォルトの名無しさん:2012/06/05(火) 22:23:05.31
このスレいつからC++11板に・・・(笑

現実的に考えて日本語版Effective C++11が出るくらいまで
(2年後くらい?)はC++11普及しない気がする。
もっと悲観的な見方をすれば、爆発的な機能増強のせいで、
C++03に対するC言語ユーザの認識程度にしか広まらなかったりして。
「あ〜C++11ね、コンパイラは使ってるけどね」
そのへんどう考えてるの>偉い人

652 :デフォルトの名無しさん:2012/06/06(水) 12:59:59.19
C++11板とか単一言語しか許されない板怖すぎる

653 :デフォルトの名無しさん:2012/06/06(水) 14:45:53.32
C++11はC++の一方言だ

654 :デフォルトの名無しさん:2012/06/07(木) 10:09:46.63
>>652
auto_ptrは板違いとか言われそうw

655 :デフォルトの名無しさん:2012/06/07(木) 20:46:47.32
まだ規格から消えてないから大丈夫

656 :デフォルトの名無しさん:2012/06/07(木) 21:07:08.62
でもdepricatedなんだろ

657 :デフォルトの名無しさん:2012/06/07(木) 21:28:46.06
exportに比べればマシな扱いさ

658 :デフォルトの名無しさん:2012/06/07(木) 21:33:27.84
const auto_ptrなら残してもいいと思う

659 :デフォルトの名無しさん:2012/06/08(金) 16:01:44.79
const auto_ptrは感動した

660 :デフォルトの名無しさん:2012/06/08(金) 20:08:17.52
別にunique_ptrでええやん

661 :デフォルトの名無しさん:2012/06/08(金) 20:37:16.62
だってまだ無かったりtr1だったりする環境が・・・

662 :デフォルトの名無しさん:2012/06/08(金) 20:40:21.33
boostに03で動くのなかったか
使ったことないからどんなできかは知らんが

663 :デフォルトの名無しさん:2012/06/08(金) 21:38:15.30
LPCTSTRも仲間に入れてあげて

664 :デフォルトの名無しさん:2012/06/08(金) 21:41:46.55
>>662
C++11のものと同じような使い勝手だと思うとモニターに右ストレート叩き込みたくなるレベル

665 :デフォルトの名無しさん:2012/06/08(金) 22:58:15.54
C++11が使えないならboost::scoped_ptrを使えばいいじゃない

666 :デフォルトの名無しさん:2012/06/09(土) 01:11:55.09
boostで日本提供のライブラリって多いよな
日本優秀だな

667 :デフォルトの名無しさん:2012/06/09(土) 01:12:53.39
たとえば?

668 :デフォルトの名無しさん:2012/06/09(土) 01:14:28.80
boost::sinobi
boost::geisha
boost::shogun

669 :デフォルトの名無しさん:2012/06/09(土) 03:27:19.55
boost::harakiri

670 :デフォルトの名無しさん:2012/06/09(土) 03:59:45.65
boost::fukushima
このライブラリは日本の優秀さをみごとに示している

671 :デフォルトの名無しさん:2012/06/09(土) 04:21:40.19
え?これってマジ?なわけないか

672 :デフォルトの名無しさん:2012/06/09(土) 22:08:27.44
最近アクセスしたデータを高速に取出し、
アクセス頻度の低いデータをちゃっちゃと
削除する(所謂キャッシュ)のに、適した
STLコンテナーの組み合わせってなんだろうか?
大量の配列からデータを検索するんだが、
その検索速度よりは、速くしたい。

673 :デフォルトの名無しさん:2012/06/09(土) 22:23:21.20
priority_queueとか

674 :デフォルトの名無しさん:2012/06/09(土) 22:30:55.99
言ってる事はLRUアルゴリズムの事だと思うんだけどこれをSTLでするにはなあ

LRU STL でぐぐってみたら?

675 :デフォルトの名無しさん:2012/06/09(土) 22:49:25.47
>>672
こんなのは?

http://timday.bitbucket.org/lru.html

676 :デフォルトの名無しさん:2012/06/10(日) 00:07:32.88
>>675
商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ

677 :デフォルトの名無しさん:2012/06/10(日) 00:12:42.90
スプレー木自作コースだな
バグ多発のヨカーン

678 :デフォルトの名無しさん:2012/06/10(日) 00:14:14.01
>>676
2chで金取るような質問すんなよ
そこまで言うなら自分で考えな

679 :デフォルトの名無しさん:2012/06/10(日) 00:21:08.76
スプレー木 Boost にあるじゃん

680 :デフォルトの名無しさん:2012/06/10(日) 00:21:59.97
>>679
商用なんで、そんな得体の知れない、何の保障もないものは使えないんですよ

681 :デフォルトの名無しさん:2012/06/10(日) 00:22:45.47
>>675
ありがとうございます。もっと詳しく調べてみようと思いますが
キャッシュ管理コスト自体が重そうですね・・・

682 :デフォルトの名無しさん:2012/06/10(日) 00:24:13.85
dllが複数のアップリケーションから読み込んで使われるとして、そのdllの別々のインスタンスに共通のデータを持たせる方法はありますか?
具体的には、読み込まれたdllのインスタンスが自分が何番目のdllインスタンスなのかを知ることができるかどうかなのですが
HD書き込みよりも直接的な方法で

683 :デフォルトの名無しさん:2012/06/10(日) 00:26:56.11
共有メモリ

684 :デフォルトの名無しさん:2012/06/10(日) 00:30:58.11
>>682
templateのinstanceは共有できんぞ
単に変数とか記憶領域の事をいってんならMemory-Mappedか、
data_segをつかう↓。ただし処理系依存だし、addressも制御できんから
特別事情がない限りMemory-Mappedを使うべき
http://msdn.microsoft.com/ja-jp/library/h90dkhs0(v=vs.80).aspx

685 :デフォルトの名無しさん:2012/06/10(日) 00:31:33.01
>>683
ありがとうございます、ググっていけばなんとかなりそうな雰囲気がつかめました
これって言語レベルで使えるものなんですかね?

686 :デフォルトの名無しさん:2012/06/10(日) 00:40:59.55
>>684
更にありがとうございます
チラッとし食べてみた感じ言語レベルで使えそうですね、ありがたい

687 :デフォルトの名無しさん:2012/06/10(日) 00:44:43.61
class nekoあったとして
下記をやるために用意しなければいけないnekoのメソッドって何ですか?
const char* koe = "wan";
neko pochi = neko(koe);

688 :デフォルトの名無しさん:2012/06/10(日) 00:46:02.33
メモリポインタ

689 :デフォルトの名無しさん:2012/06/10(日) 00:46:56.73
C++は関数はあってもObjective-Cの様にメッセージの対になるメソッドは持っていない

690 :デフォルトの名無しさん:2012/06/10(日) 03:01:36.67
C++11じゃない場合は
is_rvalueで条件文分岐するのは無理なのでしょうか
boostの中にもis_rvalueないみたいですし

例えばこんなことしたい

template<T>
struct glue
{
T & value
glue(T & v):value(v) {}
};

template<>
struct glue<rvalue<float> >
{
float value;
glue(float v):value(v) {}
};


float f=10.2;

glue<float> g1(f);
glue<rvalue<float>> g1(2.3);





691 :デフォルトの名無しさん:2012/06/10(日) 03:58:06.88
それだけだとこれでいいように見える

template<T>
struct glue
{
T value
glue(T v):value(v) {}
};

float f=10.2;

glue<float&> g1(f);
glue<float> g1(2.3);

692 :デフォルトの名無しさん:2012/06/10(日) 12:58:03.71
boost.moveにrvalue判定できるマクロあったよね

693 :デフォルトの名無しさん:2012/06/10(日) 20:37:33.46
C++の標準STLって覚えたほうがいいのか

694 :デフォルトの名無しさん:2012/06/10(日) 20:38:47.45
STL覚えてないってことはC++の基本すら習得出来てないってことだろ

695 :デフォルトの名無しさん:2012/06/10(日) 20:45:12.22
>>694
なるほど

696 :デフォルトの名無しさん:2012/06/10(日) 21:10:27.44
インターフェースクラスのGetメソッドで
サブクラスのフィールドのオブジェクトポインタを
返したいんだけどどうしたらいいですか?

インターフェースクラスは複数のサブクラスに継承されて、それぞれのオブジェクトの定格は違う

697 :デフォルトの名無しさん:2012/06/10(日) 21:29:30.05
コンパイル通らなくてもいいから
どんなことしたいかソース書いた方がいい

698 :デフォルトの名無しさん:2012/06/10(日) 21:45:35.96
>>694
C++に詳しそうだから聞こう。std::messageってLinuxだと
gettextと同じカタログファイルでいいんだが、
windowsだと、どこのカタログから文字列取ってくるんだ?

699 :デフォルトの名無しさん:2012/06/10(日) 21:54:16.40
STLならともかくlocale系なんてまともに使ってる人いるんだろうか

700 :デフォルトの名無しさん:2012/06/10(日) 21:56:41.90
多言語対応は大抵ICUまかせ

701 :デフォルトの名無しさん:2012/06/10(日) 21:58:09.30
localeはvactor<bool>ぐらいのうんこ

702 :デフォルトの名無しさん:2012/06/10(日) 22:12:53.22
>>697
あっ
メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね
ありがとうございました

703 :デフォルトの名無しさん:2012/06/10(日) 22:13:18.02
>>697
あっ
メソッドのおしりに=0をつければサブクラスでそのメソッドを定義できるんですね
ありがとうございました

704 :デフォルトの名無しさん:2012/06/10(日) 22:15:22.58
メッセージカタログの仕様、MSDNで探しても見つからんな…
つかVC++の日本語localeはゴミみたいな仕様なのでもしかしたら未実装なのか?^^

705 :デフォルトの名無しさん:2012/06/10(日) 22:21:21.59
ttp://cpplover.blogspot.jp/2010/06/clocale.html
ttp://cpplover.blogspot.jp/2011/04/boostlocale.html

706 :デフォルトの名無しさん:2012/06/10(日) 22:28:38.43
std::message ←

707 :デフォルトの名無しさん:2012/06/10(日) 22:47:28.40
>>704
http://stdcxx.apache.org/doc/stdlibref/messages.html#sec12
http://en.cppreference.com/w/cpp/locale/messages
に書いてある
rwstdmessages.catや/usr/share/locale/de/LC_MESSAGES/sed.moを探してみたら?

708 :デフォルトの名無しさん:2012/06/10(日) 23:04:06.31
インタフェース
インターフェース
インタフェイス
インターフェイス

どれ派?

709 :デフォルトの名無しさん:2012/06/10(日) 23:08:32.63
>>697
じゃなかった、返り値の型が定まらないです。
class Interface{
 public:
 virtual Object GetObject() = 0;
};

class hoge:Interface{
 Object obj;
public:
 hoge(Object obj):this.obj(obj){}
};

710 :デフォルトの名無しさん:2012/06/10(日) 23:15:37.27
>>708
google
約 1,510,000 件
約 3,400,000 件
約  363,000 件
約 2,550,000 件

711 :デフォルトの名無しさん:2012/06/10(日) 23:19:41.67
>>710
yahooにしろよ

712 :デフォルトの名無しさん:2012/06/10(日) 23:22:30.47
ヤホーで調べました

713 :デフォルトの名無しさん:2012/06/10(日) 23:29:12.97
>>709
よく分からんけどこういうこと?
http://ideone.com/jC5TY

それとも
class hoge:Interface{
 HogeObject obj;
とかになるってこと?

714 :デフォルトの名無しさん:2012/06/10(日) 23:32:46.96
>>713
それっぽいけど、Objectポインタってなんでもいいの?
まぁ4バイト固定だからできるんですか。
実際に仮想関数作る時に適当なポインタいれるのは一般的に使われる手法なんですか?

715 :デフォルトの名無しさん:2012/06/10(日) 23:43:56.65
>>714
= 0のこと?
4バイト固定でも適当なポインタでもなく
純粋仮想関数を定義するただの構文で、0に数値としての意味は無いよ

716 :デフォルトの名無しさん:2012/06/10(日) 23:58:54.33
>>701
まともに動かない事もあるしな

717 :デフォルトの名無しさん:2012/06/11(月) 00:01:09.69
メモリポインタでいいよ

718 :デフォルトの名無しさん:2012/06/11(月) 00:01:58.47
>>715
いや、リンク先の1行目でObjectを定義してて
それをポインタとして利用してるから、それはよく使われるのかなーと・・・

例えるなら、数値データリストクラスと文字データリストクラスがあって、
それぞれ数値データクラスのリストと文字データクラスのリストを持っている。
データクラスのポインタを各リストクラスで共通のメソッドでGetしたいので同じインターフェースクラスを作って継承することにする。

・・・すると、インターフェースクラスの宣言?のGetメソッドの返り値は、
数値データクラスのポインタも文字データクラスのポインタでも適さないのでは?
という感じです。
Object構造体はあくまでポインタを使うための使い捨てするのは一般的な手法なのかなと・・・

わかりにくてすいません。

719 :デフォルトの名無しさん:2012/06/11(月) 00:24:10.23
>>718
>それをポインタとして利用してるから
structはstructでしかなくポインタではないよ
Object ←実体
Object* ←Objectのポインタ
&objの& ←アドレス演算子
hogeのメンバobjは実体、hogeコンストラクタのaobjも実体(値渡し)
GetObject()の戻り値はObjectのポインタ
というところまで分かる?

>>709のObjectはどう扱いたいの?

720 :デフォルトの名無しさん:2012/06/11(月) 08:39:54.15
>>719
例えが悪かったです

class Interface{
 public:
 virtual ??? GetObject() = 0;
};

class hoge:Interface{
 ObjectA obj;
public:
 hoge(ObjectA obj):this.obj(obj){}
};

class hage:Interface{
 ObjectB obj;
public:
 hage(ObjectB obj):this.obj(obj){}
};

このような時、InterfaceのGetObjectメソッドの返り値をどのように宣言したらいいのか
ということです。

>>713でいうなら、hogeクラスの他にhuga,hogaクラスがあったとして
それぞれの扱うobjの型は違います。

721 :デフォルトの名無しさん:2012/06/11(月) 09:42:53.65
同じように扱えるからinterfaceなのであって、
ObjectAとObjectBが同じinterfaceを持つならそれを返せばいい。
class Object{
public:
 virtual int GetID() = 0;
};

class ObjectA : Object {
public:
 int GetID(){...}
};

class ObjectA : Object {
public:
 int GetID(){...}
};

class Interface{
public:
 virtual Object* GetObject() = 0;
};

ObjectAとObjectBが同じinterfaceを持たないなら、
そもそもInterface::GetObject()を使って何をしたいか意味不明。

722 :デフォルトの名無しさん:2012/06/11(月) 13:03:15.13
ああ、インターフェイスを2個使えばいいという感じですか

723 :デフォルトの名無しさん:2012/06/11(月) 20:59:01.80
Javaとかの出身なのかなあ

724 :デフォルトの名無しさん:2012/06/11(月) 23:54:12.27
union foo { int f; };
struct bar {
 foo a;
 union { int b; };
};

bar zot;
int bar::*p = &bar::b;
int x = zot->*p; // is zot.b
int bar::*q = XXX;
int y = zot->*q; // is zot.a.f

これを満たすようにするにはXXXの所どう書けばいいんでしょうか?

725 :デフォルトの名無しさん:2012/06/12(火) 00:12:16.32
できないと思う

726 :デフォルトの名無しさん:2012/06/12(火) 00:15:18.44
C++ってGUIライブラリが貧弱だよね

winのデスクトップアプリを作成するとき皆さんはなにをつかってるの?


727 :デフォルトの名無しさん:2012/06/12(火) 00:24:56.62
C++

728 :デフォルトの名無しさん:2012/06/12(火) 00:28:10.44
>>724 やっと動いた 思ったより厄介だぞこれ

union foo {
int f;
void operator=(int x) {
f = x;
}
};
struct bar {
foo a;
union { int b; };
friend std::ostream& operator<<(std::ostream& os, foo& f);
};

std::ostream& operator<<(std::ostream& os, foo& f)
{
std::cout << f.f;
return os;
}

int main()
{
bar zot;
zot.b = 123;
zot.a = 456;
int bar::*p = &bar::b;
int x = zot.*p; // is zot.b
foo bar::*q = &bar::a;
foo y = zot.*q; // is zot.a.f
std::cout << x << std::endl;
std::cout << y << std::endl;
}

729 :デフォルトの名無しさん:2012/06/12(火) 01:35:48.51
なにがしたかったの?やりたいことによってはBoost.Variant使ったほうが楽かも知れんよ

730 :デフォルトの名無しさん:2012/06/12(火) 08:43:54.54
>728 qがint bar::*じゃないじゃん。

731 :デフォルトの名無しさん:2012/06/12(火) 09:09:03.00
>>730
unionが名前空間じゃないしクラス名でもないから通らないんだって
やってみろ

732 :デフォルトの名無しさん:2012/06/12(火) 10:35:05.45
>>725の言うように出来ないだろ。
int bar::*単体でネスト内にアクセスしたいんだろうし。

呼び出し側を変えていいならコピーしなくてもzot.*q1.*q2で十分。
http://ideone.com/OR9Zp

pとqが同じ型であればいいだけなら関数ポインタで似たものにはなる。
http://ideone.com/22kQL

733 :デフォルトの名無しさん:2012/06/12(火) 10:39:53.63
関数ポインタちょっと訂正(int→int&)
http://ideone.com/KnuVI

734 :デフォルトの名無しさん:2012/06/12(火) 11:01:35.15
reinterpret_cast使うしかないな

735 :デフォルトの名無しさん:2012/06/12(火) 11:20:23.42
移植性無視するのか

736 :デフォルトの名無しさん:2012/06/12(火) 12:16:05.92
>>728
Boost.Variantを使ってやってみた
ttp://ideone.com/cSE2g

737 :デフォルトの名無しさん:2012/06/12(火) 20:15:35.48
offsetofとreinterpret_cast使うしか無いな

738 :デフォルトの名無しさん:2012/06/12(火) 21:08:41.94
それにしてもunionに名前が付いただけでなんだってこんな面倒な事になるんだろうな

739 :デフォルトの名無しさん:2012/06/12(火) 23:30:49.04
unionなんか使うから

もともとC++ではunionは型安全でない点で推奨できるものではなかったし
最近では(型を意識しない)ジェネリックなプログラミングにも対応できないしで
Cから引き継いでしまった負の遺産といっていいだろ

740 :デフォルトの名無しさん:2012/06/12(火) 23:38:09.53
>>739
無名構造体が書けるC++11で>>724のunionを両方ともstructに置き換えても同じことが起きるぜ。

741 :デフォルトの名無しさん:2012/06/13(水) 00:13:25.65
それは 無名構造体なんか使うから になるだけでは・・・

というかもともとの話の本質はunionも無名なんちゃらも関係なく
直接のメンバとメンバのメンバを同列に扱いたいけどどうしようという話だよな

742 :デフォルトの名無しさん:2012/06/13(水) 00:18:58.86
そういう事ならハンドリング時ラッピングテンプレートクラス+関数を作ればいいんじゃね

743 :デフォルトの名無しさん:2012/06/13(水) 01:46:00.21
>>728
>>732と同じ方向性だが最初からC++っぽい設計にしとけば悩むほうが難しいくらいだったろうに

union foo { int f; };
struct bar {
foo a;
struct { int b; };
int get_f() { return a.f; }
int get_b() { return b; }
};

int main()
{
bar zot;
zot.b = 123;
zot.a.f = 456;
int (bar::*p)() = &bar::get_b;
int x = (zot.*p)(); // is zot.b
int (bar::*q)() = &bar::get_f;
int y = (zot.*q)(); // is zot.a.f
std::cout << x << std::endl;
std::cout << y << std::endl;
return 0;
}

744 :デフォルトの名無しさん:2012/06/13(水) 14:40:09.67
std::list<double &> に相当するものってないの?
boost:intrusive
がそれっぽいけど doubleとかintとかは扱えないっぽい

745 :デフォルトの名無しさん:2012/06/13(水) 15:58:15.10
ある文字列(std::string型)からユニークなIDを作成する静的な方法はないでしょうか。

ある文字列のペアを引数に取ることで自作クラスの実体のアドレスを返す関数、またはクラスを
作りたいと考えています。

Hoge* rtnHoge(std::string a,std::string b){...; return &hoge;}//例

上記のような方法で一度作成したのですが、
・この方法ではペアの検索に時間がかかる(std::mapを使用しました)
・aとbに入れる文字列はコーディング時に決めうちで入力する

の二つの特徴から、
テンプレート等を利用して別途にアドレスを確保する箇所を作成したいと考えています。
テンプレートの特殊化では文字列を受けることができないため、
文字列からint型のユニークなIDを再生することが出来ると思い、その方法を探しています。

もしどなたか良い案などがありましたらアドバイスのほう頂けたら幸いです。

746 :デフォルトの名無しさん:2012/06/13(水) 16:05:28.09
crc

747 :デフォルトの名無しさん:2012/06/13(水) 16:22:51.36
なぁなぁ。静的ってことはコンパイル時ってことじゃろ?
しかしクラスのオブジェクトのアドレスっていうのはコンパイル時にはわかっていないじゃろ。
どうやってMooRieなんじゃないかって気がするんだよね。

748 :デフォルトの名無しさん:2012/06/13(水) 16:24:04.04
>>745
CLSIDかSHA256とか

749 :デフォルトの名無しさん:2012/06/13(水) 16:50:14.75
>>746,748
レスありがとうございます。
CRC,CLSID,SHA256を少し調べてみましたが、動的な方法になってしまいそうですね・・・。

>>747
そうですね、コンパイル時に確定したいと思っています。
テンプレートを使えば
template<int ID=0>
class Hoge{}

Hoge<0>,Hoge<1>,Hoge<2>
上記は全て異なる型として生成されるので、
この中それぞれに別途にシングルトンのようなクラスを生成してアクセスすれば
実現できると考えました。
ですので、静的に、コンパイル時に文字列からユニークなIDが生成できれば・・・と思い、
こちらに質問させていただきました。


750 :デフォルトの名無しさん:2012/06/13(水) 16:55:53.76
aとbの最大長が固定なら連結してmapのキーにすればいいんじゃないの?

751 :デフォルトの名無しさん:2012/06/13(水) 17:01:30.60
>コンパイル時に確定
・#defineで自分で連番化
・ユーザー定義リテラル(C++11)
・GNU gettext

752 :デフォルトの名無しさん:2012/06/13(水) 17:01:57.34
ユニークなIDが欲しいのはいいとして文字列にこだわる理由が分からん…
マクロでも列挙でも定義すればいいと思うのだが…
自分は壮大な勘違いをしているのかな?

753 :デフォルトの名無しさん:2012/06/13(水) 17:39:19.12
文字列のペアとアドレスの対応表を作れ

754 :デフォルトの名無しさん:2012/06/13(水) 17:48:20.74
>>749
文字列そのものが動的に変化する性質のものなのになぜユニークなIDが?

755 :デフォルトの名無しさん:2012/06/13(水) 17:54:40.28
.NETならSHA1CryptoServiceProviderを使えば簡単に生成できるから
stringとSHA1のstructをコレクションに突っ込んでおればいいしな

756 :デフォルトの名無しさん:2012/06/13(水) 17:57:07.63
皆様レスありがとうございます。
>>750,753
はじめはmapで実装を行っていたのですが、文字列ですのでどうしても検索速度が気になって・・。
>>751,750
やはりマクロか列挙型しかないですか・・・。

実は実行時コンパイルの必要なGLSLのプログラムクラスを作りたいと思っています。
本来ならば以下のようにすれば特に問題ないのですが
class Hoge
{
public:
Hoge(){prog.init("foo.vert","bar.frag");}
void run()
{
prog.bind();
○○何らかの処理○○
prog.unbind();
}
private:
GLSLProgram prog;
};
prog自体はrunの中でしか呼び出さないためメンバ変数として保持するほどでもないので
出来れば以下のようにしたいなと考えています。
void run()
{
prog("foo.vert","bar.frag");//コンストラクタ、デストラクタでbind,unbindを行う
}
ただ、prog("foo.vert","bar.frag")自体はほかのクラスでも使うときがあるかもしれないので、
"あるペアに対する実体は一つ"のクラスを作りたい、と考えています。

757 :デフォルトの名無しさん:2012/06/13(水) 17:58:16.34
ハッシュはユニークじゃなくね
実用上ユニークと考えて差し支えは無いかもしれないけど

758 :デフォルトの名無しさん:2012/06/13(水) 18:04:18.81
メモリを自動的に確保したら
intを作る必要なんかないのでは?


759 :デフォルトの名無しさん:2012/06/13(水) 18:05:23.41
多分2倍程度しか早くならないけどhash_mapっていうハッシュ使うマップもあるよ
あとはハッシュ関数自前で作ってaとbの命名を被らないように特徴づけるとかすればいいんじゃないの?

760 :デフォルトの名無しさん:2012/06/13(水) 18:08:28.50
>>757
衝突する確率はゼロじゃないわな
でも文字列も同一文字列である可能性もあるわけで

761 :デフォルトの名無しさん:2012/06/13(水) 18:23:11.70
void Hoge::run(){
  static id = id_from_map("foo.vert", "bar.frag");
  GLSLProgram prog(id);
}

762 :デフォルトの名無しさん:2012/06/13(水) 19:02:57.58
>>756
http://ideone.com/B4Sri
cache find, new glsl_bodyは2回、bind,unbindは4回
文字列での検索は関数毎に1回だけ
コンパイル時じゃないけど初回くらいいいだろうということで

763 :デフォルトの名無しさん:2012/06/13(水) 22:06:36.71
無料ではじめたい、無料でソフトつくりたい・・・はやっぱり贅沢すぎるか・・・

764 :デフォルトの名無しさん:2012/06/13(水) 22:24:01.97
PCと電気代、通信費以外は無料でプログラム作れるぞ?
回線も一昔前のISDN時代とは違うしな。

765 :デフォルトの名無しさん:2012/06/13(水) 22:46:02.09
PCもネットも無料で使える図書館的なものが欲しいって話かと思った

766 :デフォルトの名無しさん:2012/06/13(水) 22:47:27.45
Visual Studio の無料版なくなったってよ

767 :デフォルトの名無しさん:2012/06/13(水) 22:48:51.21
情弱乙

768 :デフォルトの名無しさん:2012/06/13(水) 22:53:15.51
提供されないよ!って大風呂敷広げた記事が数日で訂正されてたのには笑った

769 :デフォルトの名無しさん:2012/06/13(水) 22:59:02.78
仮にVSなくなろうとPlatform SDKかWindows SDKもしくは、gcc使えば済むしな
お勉強したいだけなら、cintやcodepad使う手もある

770 :デフォルトの名無しさん:2012/06/13(水) 23:01:54.02
テキストに「ド、レ、ミ」と入力してMIDIファイルを書き出すソフトって難しそうだ


771 :デフォルトの名無しさん:2012/06/13(水) 23:07:47.88
一応ここでいいかな?
mp3だとかwavみたいな音楽ファイルから、
タイトルとかアルバム名を取れるライブラリってないかな?

772 :デフォルトの名無しさん:2012/06/13(水) 23:19:17.89
mp3infp

773 :デフォルトの名無しさん:2012/06/13(水) 23:35:31.84
>>772
ありがとう。
とりあえずこのプログラムから解析してる部分の抜き出しをがんばってみる。

774 :デフォルトの名無しさん:2012/06/13(水) 23:36:17.30
テンプレート関数の事なのですが、
戻り値が引数と同じ型で、
かつ特殊化をするコードを教えていただけませんでしょうか。

C#でのコードだと↓です
public T getObject<T>() where : Hoge
{
~~~~~~
~~~~~~
return T;
}

775 :デフォルトの名無しさん:2012/06/13(水) 23:43:01.91
引数ないじゃん

776 :デフォルトの名無しさん:2012/06/13(水) 23:45:50.36
すみません説明不十分でしたorz
テンプレート引数です。

777 :デフォルトの名無しさん:2012/06/13(水) 23:48:22.98
template <> Hoge getObject() { /* */ }
特に悩むところもないと思うけど

778 :デフォルトの名無しさん:2012/06/13(水) 23:57:26.61
>>756
究極的には文字列を分解して一文字ずつテンプレートに渡す方法だな

template<char C1, char C2 ・・・ > hoge;
hoge<'f', 'o', 'o'> h;

11ならconstexprと組み合わせて文字列から↑まで持っていくのも不可能ではなさそうなんだが実際できるのかな?

779 :デフォルトの名無しさん:2012/06/14(木) 00:05:36.70
boost::mpl::stringみたいな魔境に近づくのはやめようぜ

780 :デフォルトの名無しさん:2012/06/14(木) 00:09:44.66
>>777
それはちょっと違うと思う
特定の型から派生されているかの制約を持たせたいなら
メタプロでなんとかなると思われ
C++11 なら std::is_base_of ってのがあるが
C++11 でなくても真似すればいいと思う

781 :デフォルトの名無しさん:2012/06/14(木) 00:19:00.62
>>744
list< shared_ptr<double> >

782 :デフォルトの名無しさん:2012/06/14(木) 00:20:07.66
>>777
すみません。また説明不足でした。すみません。
>>778
関数の処理結果に応じて戻り値の型を変える事ができるのでしょうか?勉強不足ですみません。

説明不足で申し訳ありません。
↓のような場合の時でテンプレート引数がHogeの派生クラスになるように制約をかけたいです。

class Hoge()
{
public T getObject<T>() where T : Hoge()
{
~~~~
~~~~
return T;
}
}
class Poge() : public Hoge
{
}
class Foge() : public Hoge
{
}

>>780
メタプロでぐぐってみます。

783 :デフォルトの名無しさん:2012/06/14(木) 00:22:39.49
boostにis_base_ofがあるな
BOOST_STATIC_ASSERTと組み合わせて使えばいいはず

784 :デフォルトの名無しさん:2012/06/14(木) 00:25:59.51
template <typename T> typename std::enable_if<std::is_base_of<Hoge, T>::value, T>::type getObject(){return T();};

こうだろ

785 :デフォルトの名無しさん:2012/06/14(木) 00:28:09.48
enabled_ifはキモいなあ
今回はたまたま戻り値の型でしかTが使われてないけど
2箇所以上で使われている場合に
1箇所だけenabled_ifってのも何かバランス悪いし

786 :デフォルトの名無しさん:2012/06/14(木) 00:28:38.38
enable_ifだよ
ミスったよ

787 :デフォルトの名無しさん:2012/06/14(木) 00:41:45.51
boostなんて実用はありない
あんなのヲタが使うもの

ソースが汚くいことこの上ない

788 :デフォルトの名無しさん:2012/06/14(木) 00:47:04.52
自分が使いこなせないからってライブラリのせいにする人はちょっと…

789 :デフォルトの名無しさん:2012/06/14(木) 00:53:53.73
>>784
今さっきなんとなくわかりました。長いのは戻り値だったんですねー…

Boostをインストールしてみて、
きびしそうなら別の方法を執ってみます。
みなさんわざわざありがとうございました。

790 :デフォルトの名無しさん:2012/06/14(木) 00:56:23.34
>>788
使いこなせないとどこに書いてあるんだ?

脳内補完もここまで来ると感服だなw

791 :デフォルトの名無しさん:2012/06/14(木) 02:38:33.34
STLにTree構造データないのは何故だ

792 :デフォルトの名無しさん:2012/06/14(木) 03:04:06.37
Setは?

793 :デフォルトの名無しさん:2012/06/14(木) 04:11:05.53
ありない
ありない
ありない

汚くい
汚くい
汚くい

794 :デフォルトの名無しさん:2012/06/14(木) 06:05:26.57
>>780
そんな事するんだったらconst定数使った方がましじゃね?

template<const char *array> class Example;
namespace Keys
{
   const char alpha[] = "Alpha";
   const char beta[] = "Alpha";
}
Example< Keys::alpha > object;

>>782
template<class type> type Example::Function()
{
   type value;
   ExampleBase *base_check = &value; // 親子関係がなければコンパイルエラー
   return value;
}



795 :デフォルトの名無しさん:2012/06/14(木) 06:27:38.53
>>791
map, set, priority_qeueは内部的にtree使ってる
std::make_heapを使えば自前の二分木を楽に作れる

796 :デフォルトの名無しさん:2012/06/14(木) 08:43:30.62
class Object {};

class User
{
public:
User(std::shared_ptr<Object> o = std::make_shared<Object>())
: o_(o)

};

797 :796:2012/06/14(木) 08:45:31.56
すみません、記述途中で投稿してしまいました。
デフォルト引数にstd::make_shared〜とやると、make_sharedがglobal namespaceのメンバーでないとエラーが出てしまいます。
当然、using namespace std;を行うと、正しくコンパイルできるのですが、それはしたくありません。
どのように記述するのが正しいのでしょうか?

798 :デフォルトの名無しさん:2012/06/14(木) 09:24:56.76
VC++が悪い

799 :デフォルトの名無しさん:2012/06/14(木) 10:06:41.32
そのコンストラクタはデフォルト引数の指定無しにして引数なしのコンストラクタも書けばいいじゃないか

800 :デフォルトの名無しさん:2012/06/14(木) 11:35:13.06
こんなのはどう?
User(std::shared_ptr<Object> o = [](){return std::make_shared<Object>();}()) : o_(o) {}


801 :デフォルトの名無しさん:2012/06/14(木) 11:44:08.99
>>769
そもそも勉強用にMSVC使うってのが間違ってるだろ。
LLVM/clang使えばいろいろ捗るぞ。ここまで無料で高品質でライセンスの緩いコンパイラは珍しいし他にない。
本来ならば金の要らないLinux前提だしmingw入れればwindowsでも動くしな。

802 :デフォルトの名無しさん:2012/06/14(木) 11:54:10.94
Linux前提やクロス開発を考慮する場合はともかく
Windows前提ならmingw選ぶのは間違ってる

803 :デフォルトの名無しさん:2012/06/14(木) 12:40:59.56
windows使ってるならcygwin入れろ。
ファイル消せなくなって困るぞ。

804 :デフォルトの名無しさん:2012/06/14(木) 12:45:48.23
問題なのはcygwinを入れないとファイルが消せなくなるんじゃなくて
cygwinを入れたせいでファイルを消せなくなる点なんだよな。

805 :デフォルトの名無しさん:2012/06/14(木) 12:49:49.76
Windows前提をはずすのが一番って尊師が言ってた

806 :デフォルトの名無しさん:2012/06/14(木) 13:30:06.78
そりゃあ尊師はUNIXライク前提ですから

807 :デフォルトの名無しさん:2012/06/14(木) 13:52:33.44
cygwin()

808 :デフォルトの名無しさん:2012/06/14(木) 16:22:24.28
マハーポーシャでPC組んでLinux入れよう

809 :デフォルトの名無しさん:2012/06/14(木) 18:03:24.84
LinuxはTagジャンプをなんとかしろ
global.elとか仕様頻繁に換えんな

810 :デフォルトの名無しさん:2012/06/14(木) 18:28:20.78
カーネル開発者や鳥のメンテナにEmacsの文句言うのかー


811 :デフォルトの名無しさん:2012/06/14(木) 19:22:16.79
C++で、外部の.exeファイルを実行するにはどうすればいいですか?
使っているソフトはVS2010です

812 :デフォルトの名無しさん:2012/06/14(木) 19:30:59.40
>>811
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1331894668/l50

813 :デフォルトの名無しさん:2012/06/14(木) 19:39:57.21
環境依存でないsystemがあるじゃないかー
(使い方はある程度環境に依存はするけど)

814 :デフォルトの名無しさん:2012/06/14(木) 19:41:19.39
#include <cstdlib>
int std::system(const char*);

のことかな。

815 :デフォルトの名無しさん:2012/06/14(木) 20:37:55.88
>>811
単に実行するならexecとか
標準入出力の内容を操作したいならpopen/_popenを使ふ

816 :デフォルトの名無しさん:2012/06/14(木) 22:05:13.07
そんな環境依存の事を言われても・・・

817 :デフォルトの名無しさん:2012/06/15(金) 22:09:00.46
popenか_popenどっちも持ってないなんて組み込み環境ぐらいだろ

818 :デフォルトの名無しさん:2012/06/15(金) 22:24:09.16
規格に無いものは開発環境ごとのスレでやった方がいい

819 :デフォルトの名無しさん:2012/06/15(金) 22:26:06.03
POSIXぐらい、半標準なんだからいいだろうに
標準ライブラリなんて元々POSIXのサブセットだぞ

820 :デフォルトの名無しさん:2012/06/15(金) 22:35:30.41
pthreadsもここでやるのか?とか
あまり手広く広げてもなあ

821 :デフォルトの名無しさん:2012/06/15(金) 22:49:13.90
posix名前空間が用意されたとはいえ
現状std名前空間にあるC関数もあんまり積極的には扱ってないだろ

822 :デフォルトの名無しさん:2012/06/15(金) 23:06:35.34
C関数でないと無理なものはまあ扱わなくもない

823 :デフォルトの名無しさん:2012/06/16(土) 05:48:02.11
LLVM CLANGってgccやMSVCより高速なの?
場合によりけり?
どういう場合に速いんだろ

824 :デフォルトの名無しさん:2012/06/16(土) 09:43:38.23
Nativeだとgcc以上 MS C++未満
VM実行の場合は、VMの性能次第

825 :デフォルトの名無しさん:2012/06/16(土) 18:01:49.09
CLANGはエラー表示の賢さにびっくり。

826 :デフォルトの名無しさん:2012/06/17(日) 18:42:17.05
スペルミスの可能性とか人間の思考レベルのミスまで指摘してくれるからな

827 :デフォルトの名無しさん:2012/06/17(日) 18:43:04.79
僕の脳内の欠陥も指摘してくれますか?

828 :デフォルトの名無しさん:2012/06/18(月) 21:31:39.61
エラー:人間性に問題があります

829 :デフォルトの名無しさん:2012/06/18(月) 23:14:28.28
uyには欠陥しかない

830 :デフォルトの名無しさん:2012/06/18(月) 23:29:23.07
uyはデフォルトの名無しさんが人柱にされたとき切り離された負の感情だからな

831 :デフォルトの名無しさん:2012/06/19(火) 13:46:05.44
人柱力の間違いだってばよ

832 :デフォルトの名無しさん:2012/06/20(水) 16:25:14.31
明快入門C++って本読んだけど、クラスについてよく理解できなかった。

833 :デフォルトの名無しさん:2012/06/20(水) 16:35:07.58
クラスとはメタ関数のために用意された単なる構造体である ―梶本裕介

834 :uy:2012/06/20(水) 17:13:51.17
俺はゴミカスだがエリートゴミカスだ
お前らのような下級ゴミカスとは格が違う

835 :デフォルトの名無しさん:2012/06/20(水) 17:22:24.68
>>834
うるせーゴミカス

836 :uy:2012/06/20(水) 17:37:41.96
言葉を慎みたまえ

837 :デフォルトの名無しさん:2012/06/20(水) 18:01:38.16
台湾人が発言「韓国人は日本人のように正直でない」―韓国サイト

韓国のコミュニティサイト「ガセンイドットコム」の掲示板に「韓国人は日本人のように正直ではない」とのスレッドが立てられたところ、さまざまな意見が寄せられた。
スレ主は、18日に行われた台湾大手EMS企業・鴻海集団の株主総会に関して、日本で報じられた記事を紹介。
同社の郭台銘(グオ・タイミン)理事長は、日本のシャープと協力することにより、韓国のサムスンとの競争に勝算があると話した。
郭理事長は、日本人を尊重していると語り、日本人の行動力やコミュニケーション力、面と向かって断っても裏切ることはない正直さを評価した。
一方で、韓国人は日本人のように正直ではないと語ったという。

スレッドには、この記事に対する批判的な意見が数多くあがった。
・「台湾がそんな言葉を!」
・「台湾はいつまでたっても日本に奴隷根性」
・「台湾が正直さについて語るとは、笑える」
・「日本は勝てないライバルを悪役にするのが上手。到底実力では勝てないからキム・ヨナを性格の悪い子のようなイメージを植えつけ、真央は良い子に。」
・「日本がサムスンに勝つ方法は、台湾を味方につけることだけ」
・「最も正直から距離が遠い民族が笑わせる」
・「常に韓国人から、認定と関心を受けたいようだね」
・「台湾が計算しているのでは」
・「台湾人は中国人より日本人が好きだろう。」
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0620&f=national_0620_035.shtml


838 :デフォルトの名無しさん:2012/06/20(水) 20:31:06.50
クラス理解したいならロベールがいい

839 :デフォルトの名無しさん:2012/06/21(木) 01:07:06.66
>>837
またネトウヨの陰謀論か

840 :デフォルトの名無しさん:2012/06/21(木) 03:01:48.72
・Qはいつまでたっても他の2ch住民に奴隷根性
・Qが正直さについて語るとは、笑える
・Qは勝てないライバルを悪役にするのが上手。到底実力では勝てないからキム・ヨナを性格の悪い子のようなイメージを植えつけ、真央は良い子に
・Qが他の住人に勝つ方法は、他の住人を味方につけることだけ
・最も正直から距離が遠いQが笑わせる
・常にネット住民から、認定と関心を受けたいようだね
・Qが計算しているのでは
・Qはネット住民より自分が好きだろう。

自 己 愛 性 人 格 障 害

841 :デフォルトの名無しさん:2012/06/21(木) 09:21:21.17
>>840
ブログにでも書いとけ。

842 :デフォルトの名無しさん:2012/06/21(木) 19:00:03.51
WindowsでC++して奴に聞くけど
Embarcadero C++BuilderってC++使いから見てどうなん?
使っている理由何?
使っていない理由は何?


843 :デフォルトの名無しさん:2012/06/21(木) 19:06:34.66
日本語でおk

844 :デフォルトの名無しさん:2012/06/21(木) 19:07:50.61
使う理由がまずないだろ

845 :デフォルトの名無しさん:2012/06/21(木) 19:10:20.96
>使っていない理由
・そもそもその製品を知らない
・VC++EEで困ってない

846 :デフォルトの名無しさん:2012/06/21(木) 19:22:22.07
ググってきたけどこれBorland C++ Builderの買収後の名前か

無料版コンパイラは相変わらずBCC5.5で古すぎてゴミ
http://www.embarcadero.com/jp/products/cbuilder/free-compiler

有償版はどの程度か分からないけど
同価格帯のVC++の有償版を超える程とは考え辛い・・・

847 :デフォルトの名無しさん:2012/06/21(木) 21:15:08.98
エンバカデロは長いことバージョンアップせずC++への準拠度が低いままだったんだよね
現状、C++コンパイラは規格に合致するものひとつも存在せず
個々のコンパイラ毎の方言を理解してそういう部分を局所化したコードを書かないといけない
つまり実績のないコンパイラは存在価値がない

848 :デフォルトの名無しさん:2012/06/21(木) 21:26:23.49
前はVC6よりBCCの方が準拠度が高かったのにな
VC7.1から逆転した

849 :デフォルトの名無しさん:2012/06/21(木) 21:36:21.94
使っていない理由
VC++MFCの方が生産性が高いから


850 :デフォルトの名無しさん:2012/06/21(木) 21:40:43.20
C++ Builderが出た当初はVC++でMFC使うよりずっと生産性高かったんだけどねぇ
結局進準拠度の低さがすべてをダメにした
規格に準拠しないオレオレ規格で開発効率優先するなら.NET使ったほうがよっぽどいい

851 :デフォルトの名無しさん:2012/06/21(木) 22:05:35.06
VC以外で作ったアプリは、
ボタンを自動で押すなどの外からの操作がしにくいから迷惑

852 :デフォルトの名無しさん:2012/06/21(木) 22:21:15.82
お前ら感謝あげ
名前すら知らない、眼中にない、準拠度が低いからが使わない理由か
たとえば、stdのスマポ使いたいになったとき他のではサポートしているのに
それが未対応じゃ使う気起こらないよな

俺のところは俺が入社したころはまだ会社ではC++builder6を使っていたが
理由は知らないがそれ以降はVC++に統一なったな。
それがVC2003あたりだった気がする。
俺、C++builder6はほとんど使ったことないけど、GUI作るのがVCより楽だったって記憶はあるな

853 :デフォルトの名無しさん:2012/06/21(木) 22:35:34.66
GUIは多少もっさりするけど.NETで十分だろう
ライブラリの豊富さでは歯がたたないし

854 :デフォルトの名無しさん:2012/06/21(木) 22:53:28.19
その頃ってボーランドがお先真っ暗だった時代じゃね

855 :デフォルトの名無しさん:2012/06/22(金) 11:00:10.84
Qt使うと殆どC#で作るのと余り変わらない感覚のように思える

856 :デフォルトの名無しさん:2012/06/22(金) 11:05:44.51
C#なんてC++挫折組みの為のおこちゃま言語だろ
比較にならん

857 :デフォルトの名無しさん:2012/06/22(金) 11:18:21.61
平日の昼間は愚痴が多いですね^^

858 :デフォルトの名無しさん:2012/06/22(金) 11:29:03.69
やはりGUIもロジックもC++でおkだと
GUIだけはC#の方がいいとかいうのは幻想だったと

859 :デフォルトの名無しさん:2012/06/22(金) 11:41:01.96
GUI、C# ロジック、C++なら
MFCでやったほうが100倍マシ

前者はどのみち、利用者からもっさり感やレスポンスの悪さを指摘される
FAでman-machine-interfaceの作成ツールを.netを用いているが
未だに、起動時の遅さを文句言われる

次VerではMFC、VCL、Qtが検討されていて、繰り返しDR、CRを行っているが
安易に.netを採用した結果の失敗例だと思う。


860 :デフォルトの名無しさん:2012/06/22(金) 12:01:40.35
コーディングが下手糞なだけ

861 :デフォルトの名無しさん:2012/06/22(金) 12:27:08.95
あえて言うなら、設計が下手糞なだけだろ
コーディングに上手いも下手もないだろ



862 :デフォルトの名無しさん:2012/06/22(金) 12:47:26.57
.NETアプリとネイティブアプリが同じ速度で動作すると思っている馬鹿がいるような気がする

863 :デフォルトの名無しさん:2012/06/22(金) 12:53:33.51
速度を犠牲にした.netは何だったんだ

864 :デフォルトの名無しさん:2012/06/22(金) 12:57:40.11
>>859
そんなの客にきちんと説明すればいいだけじゃん

「.netを使っているため、起動時に毎回ネイティブにコンパイルしているから遅いんですよ」

「じゃ、ネイティブでかいてよ」

「工数が掛かってしまいます」

「じゃ、他社使うからいいよ」

865 :デフォルトの名無しさん:2012/06/22(金) 13:37:42.56
だってC#のunsafeは仕様が硬すぎてろくにP/Invokeが組めない
やるならもっと柔軟にしとけよ

866 :デフォルトの名無しさん:2012/06/22(金) 15:20:45.81
WinCE用のアプリ書くときは今はC#だなぁ
他から持って込んでも.NETの標準ライブラリが使えるし
端末のSDKに.NET用API付いてたから

ActiceXとかNPAPIプラグインはC++で書いてるけど

867 :866:2012/06/22(金) 15:22:02.63
×c
○v

868 :デフォルトの名無しさん:2012/06/22(金) 15:45:28.45
適材適所で使い分けないとね

殆ど全く使わない無駄なプログラムはC#
年に一回以上使用する可能性があるプログラムはC/C++

869 :デフォルトの名無しさん:2012/06/22(金) 17:34:17.24
C++/CLI とはいったい

870 :デフォルトの名無しさん:2012/06/22(金) 18:27:20.14
名前を呼んではいけない

871 :デフォルトの名無しさん:2012/06/22(金) 18:30:55.41
>>896
説明しよう!
C++/CLIとは、某企業がC++の名声を残しつつ自己実現するために送り込んだエイリアンである。
しかし、結果は裏腹にC++の奇形児として扱われ人気も出ず、.NETブリッジとしか使われないのだ〜。
南無三!

872 :デフォルトの名無しさん:2012/06/22(金) 18:49:11.65
もともとそれ以外の用途はないだろ…

873 :デフォルトの名無しさん:2012/06/22(金) 18:52:24.96
>>872
いや〜、もっとプログラマ囲えたら更に独自規格出して逃げれなくなってたと思うよ。

874 :デフォルトの名無しさん:2012/06/22(金) 18:55:44.62
そもそもMS社員は使ってるのか?

875 :デフォルトの名無しさん:2012/06/22(金) 18:59:12.04
噂はきかないねー。

876 :デフォルトの名無しさん:2012/06/22(金) 19:05:59.85
いつになったら return a, b; できるようになるんだよ

877 :デフォルトの名無しさん:2012/06/22(金) 19:07:18.85
return { a, b };ならできるんじゃね

878 :デフォルトの名無しさん:2012/06/22(金) 19:12:56.83
delete a, b, c;
もしたい。

879 :デフォルトの名無しさん:2012/06/22(金) 19:18:03.81
a,b
の型は何だと思ってるんだ?

880 :デフォルトの名無しさん:2012/06/22(金) 19:20:06.56
operator overloadしてvoid以外の何かにしよう

881 :デフォルトの名無しさん:2012/06/22(金) 19:21:37.82
>>879
僕の頭の中では

template<typename X1, ... , typename Xn>
class cartesian_product;

ってのが n=2, ..., 20 ぐらいまで定義されているんです。

882 :デフォルトの名無しさん:2012/06/22(金) 19:21:56.51
そこでカンマ演算子のオーバーロードですよ。

883 :デフォルトの名無しさん:2012/06/22(金) 19:42:35.23
ポインタって宣言するときは
void func(p*);
で、使うときは
func(&hoge);
でいいんだよな


884 :デフォルトの名無しさん:2012/06/22(金) 19:43:31.79
>>883
×ポインタって宣言するときは
○ポインタを引数にする関数を宣言するときは

でしたすいません。

885 :デフォルトの名無しさん:2012/06/22(金) 19:45:33.65
BASICでもつこててください

886 :デフォルトの名無しさん:2012/06/22(金) 19:50:11.64
>>885
あんな気持ち悪いのいやです

887 :デフォルトの名無しさん:2012/06/22(金) 19:50:54.59
>>884
ビルドしてみれば判る。

888 :デフォルトの名無しさん:2012/06/22(金) 19:52:55.82
>>886
C#でもシコシコやっててください

889 :デフォルトの名無しさん:2012/06/22(金) 19:54:22.45
>>887
もしもしなので無理です
わがままですいません

890 :デフォルトの名無しさん:2012/06/22(金) 20:09:15.04
>>889
http://ideone.com/clone/Au4m0

891 :デフォルトの名無しさん:2012/06/22(金) 22:12:30.13
VC++2010のstd:hash_mapにfind()の部分がやけに遅いんで調べてみたら、なんと線形探索してやがった
C#で言うところのDictonary.TryGetValue()みたいなメソッドがあると助かるんだが、C++にはそういうメソッドはないの?


892 :デフォルトの名無しさん:2012/06/22(金) 22:14:07.33
STLにhash_mapなんてクラスはないけど

893 :デフォルトの名無しさん:2012/06/22(金) 22:18:39.93
>>891
同じkeyに対する要素なら線形探索になる。
もう一度アルゴリズムをやり直して仕様も読み直せ。

894 :デフォルトの名無しさん:2012/06/22(金) 22:23:44.40
>>891
それC++11のSTLを部分的に取り入れた物だと思う

>>893も言ってるけど要するにこれオープンハッシュだよね?
同じキーならハッシュも同じなのでその後は線形探索しかない
ダブルハッシュにすればいいけどメモリを馬鹿みたいに食うので

std::hash_map<key, std::hash_map<key2, value> > とすれば擬似的に
ダブルハッシュに出来るから速度実測してみな

895 :デフォルトの名無しさん:2012/06/22(金) 22:26:58.19
>>893
同じキーがあればO(N)ってことはキーが全く存在しなければO(1)なんだよな?

xhashのソースコード読んでたら、こんな実装になっていて、全要素文サーチしてたんだが、俺の勘違いだよな

iterator find(const key_type& _Keyval)
{ // find an element in mutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}

iterator lower_bound(const key_type& _Keyval)
{ // find leftmost not less than _Keyval in mutable hash table
size_type _Bucket = _Hashval(_Keyval);
for (iterator _Where = _Begin(_Bucket);
_Where != _End(_Bucket); ++_Where)
if (!this->comp(this->_Kfn(*_Where), _Keyval))
return (this->comp(_Keyval,
this->_Kfn(*_Where)) ? end() : _Where);
return (end());
}


896 :デフォルトの名無しさん:2012/06/22(金) 22:29:16.13
>>895
lower_bound内の_Bucket = _Hashval(_Keyval)に注目。
ここで探索対象が存在するbucketを判別している。
あとはそのbucketを線形探索だから何も間違いはない。

897 :891:2012/06/22(金) 22:29:32.97
訂正
× キーが全く
○ 同じキーが全く


898 :デフォルトの名無しさん:2012/06/22(金) 22:31:59.96
for文見ただけで、全要素サーチとか言ってるのか?

899 :891:2012/06/22(金) 22:33:50.92
>>896
なるほど
ためしに存在しないキーを指定して、ソース追ってみたら、_Hashval(_Keyval)のところで0を返していて、その後、最後まで検索していたorz
キーが重複しても意味ない用途なんで重複を許さないhash_mapというのはないのかな…

900 :デフォルトの名無しさん:2012/06/22(金) 22:35:10.15
map知らずにhash_map使っちゃってるんだろ言おうと思ったら、その通りだったでござる

901 :デフォルトの名無しさん:2012/06/22(金) 22:36:03.34
mapは重複許さんだろ
何を言ってるんだ

902 :デフォルトの名無しさん:2012/06/22(金) 22:36:24.93
だってlower_boundだし

903 :デフォルトの名無しさん:2012/06/22(金) 22:36:36.80
俺はregex rx("\\[(\\d+)-(\\d+)-(\\d+)\\]([-+@!.]).*$")
で時間食われる
by VC++

904 :デフォルトの名無しさん:2012/06/22(金) 22:37:27.34
>>903
Flex使いましょう

905 :デフォルトの名無しさん:2012/06/22(金) 22:38:20.12
>>903
それぐらい自前でパースすりゃいい

906 :デフォルトの名無しさん:2012/06/22(金) 22:39:10.68
>>901
え、それが欲しいんでないの?
ようはただの連想配列を探していて、mapの前にhash_mapに辿りついたんだと思ってた。

907 :デフォルトの名無しさん:2012/06/22(金) 22:41:24.17
ああ俺へのレスじゃないのか失礼。

908 :デフォルトの名無しさん:2012/06/22(金) 22:41:29.25
>>900
>>901
hash_mapに切り替える前はmapを使ってたんだが、そいつもfind()で存在しないキーを指定すると全要素検索していた
キーの重複は許さなくてもいいからfind()で存在しないキーを指定してO(1)なやつはないんだろうか

909 :デフォルトの名無しさん:2012/06/22(金) 22:42:33.00
>そいつもfind()で存在しないキーを指定すると全要素検索していた
VSのmapは赤黒木なんだからそれをend()に当たるまで探索するのは当たり前

910 :デフォルトの名無しさん:2012/06/22(金) 22:42:46.98
>>906
C#のDictonary相当の奴を探してる
mapならfind()でもO(log(n))、hash_mapならO(1)かと思ったら、そうでなかったでござる

911 :デフォルトの名無しさん:2012/06/22(金) 22:43:50.92
>>910
もしかして存在しない要素を探すのにO(1) = 定数時間しか掛からないと思ってるのか?

912 :デフォルトの名無しさん:2012/06/22(金) 22:46:26.93
>>908
理想的なハッシュ関数ならO(1)で済むよ
現実はそうじゃないから妥協しなきゃいけない

913 :デフォルトの名無しさん:2012/06/22(金) 22:52:54.16
>>911
要素が存在してなければ、定数時間だったと思うが

>>912
それってキーが重複している場合の話だよな
キーが存在しないのにo(1)で済まないというのも変な気がするが…

914 :デフォルトの名無しさん:2012/06/22(金) 22:54:21.64
要素が存在しなくても、ハッシュは生成されるよ。

915 :デフォルトの名無しさん:2012/06/22(金) 22:55:43.90
>>914
その生成はもちろんO(N)だろうかハッシュテーブルの探索自体はO(1)だろ

916 :デフォルトの名無しさん:2012/06/22(金) 22:57:44.80
>>913
キーの重複は関係ないだろ
キーが存在しないってことは、コンテナの中に入ってるキーすべてと合致しないことを確かめないといけないのだから
ハッシュマップは確かめなきゃいけないキーの数が少なくて済むってだけの話

917 :デフォルトの名無しさん:2012/06/22(金) 23:05:49.97
>>916
キーが存在しないということはハッシュに対応するコンテナの中に何もないからコンテナの中を調べる必要はないんじゃないか?
念のためにくぐってみたら教科書的な実装はこういう風になってた
http://www.geocities.jp/ky_webid/algorithm/014.html


918 :デフォルトの名無しさん:2012/06/22(金) 23:10:48.57
>>917
キーが存在しないって
コンテナのサイズが0って意味か?

919 :名無しのデフォルトさん:2012/06/22(金) 23:14:11.19
座標配列を動的に変更する方法ってわかりますか?

920 :デフォルトの名無しさん:2012/06/22(金) 23:18:50.02
>>918
存在しないキーに対応するコンテナーは0だね

921 :デフォルトの名無しさん:2012/06/22(金) 23:20:55.41
>>919
ChangeDynamicPointArray

922 :デフォルトの名無しさん:2012/06/23(土) 10:02:38.94
vc++のstl::hash_mapからstlport::hash_mapに変えてみた
CPU負荷が半分以下に減っていて笑った


923 :デフォルトの名無しさん:2012/06/23(土) 12:05:53.04
トレードオフは何だろう・・・

924 :デフォルトの名無しさん:2012/06/23(土) 12:09:18.78
stlportはC++11に対応しているのか?

925 :デフォルトの名無しさん:2012/06/23(土) 14:07:04.84
stl名前空間って何だ

926 :デフォルトの名無しさん:2012/06/23(土) 14:16:50.44
コンパイラじゃねーんだから補完してやれよw

927 :デフォルトの名無しさん:2012/06/23(土) 14:20:33.11
お前らの脳味噌にはIntelliSense搭載してないのかよ

928 :デフォルトの名無しさん:2012/06/23(土) 14:22:48.51
IntelliSense: 名前の後に '::~' を付けることができるのはクラス名または名前空間名だけです

929 :デフォルトの名無しさん:2012/06/23(土) 15:13:02.33
std::hash_mapはVC6とかの時代だっけ?
stdexに隔離された方しか使ったことないや

930 :デフォルトの名無しさん:2012/06/23(土) 20:27:22.56
template <class T>
class P{
 private:
  double hoge;
public:
  double Hoge(){ return hoge;}
};

double F(P<double> a, P<double> b){
  return a.Hoge() + b.Hoge();
}

テンプレート型のクラスを引数に持ってくる際に型を固定したいのですが
以上のようにできるでしょうか

931 :デフォルトの名無しさん:2012/06/23(土) 20:40:58.47
なにか問題でも

932 :デフォルトの名無しさん:2012/06/23(土) 20:43:57.34
>>929
VS2010だが、std::hash_mapは普通に使えてる


933 :デフォルトの名無しさん:2012/06/23(土) 20:52:06.48
std::hash_mapってどこのヘッダに入ってんの?

934 :デフォルトの名無しさん:2012/06/23(土) 20:56:24.14
>>926>>927
よく知らないSTLの実装かもしんないじゃん!

935 :デフォルトの名無しさん:2012/06/24(日) 03:08:40.25
shared_ptrを同等品とかも込みでまったく使ってない人って結構いるんかね?

936 :デフォルトの名無しさん:2012/06/24(日) 03:24:45.63
ベターCの連中は多いよ

937 :デフォルトの名無しさん:2012/06/24(日) 11:05:14.26
COMを使っていれば自動的に同等品を使うことになるな
COM限定だけど

938 :デフォルトの名無しさん:2012/06/24(日) 11:09:15.48
COMはinstrusive_ptrが使える

939 :デフォルトの名無しさん:2012/06/24(日) 11:11:02.99
別種でintrusive_ptrが有るから
COM≒shared_ptrは違うな

940 :デフォルトの名無しさん:2012/06/24(日) 11:13:14.13
そか
COMは確かにintrusive_ptr扱いだな

941 :デフォルトの名無しさん:2012/06/24(日) 23:14:57.24
>intrusive_ptr
理屈じゃわかってたけど目からウロコだわ
ADLの有効な使い方初めて見た

942 :デフォルトの名無しさん:2012/06/24(日) 23:34:55.98
>>922
どうせならunordered_mapも比較してよ。
もちろん、VC++付属のとSTLportのと両方。

943 :デフォルトの名無しさん:2012/06/27(水) 15:11:39.12
>>935
C++/CLIだと使いたくても使えない


944 :デフォルトの名無しさん:2012/06/27(水) 15:59:45.95
C++/CLIでshared_ptrがもし使えたとしても使う必要があるのか?
GC標準装備なのにスマポなんかいらないだろ

945 :デフォルトの名無しさん:2012/06/27(水) 16:12:24.10
ファイルとかのリソースを持ってるクラスなら欲しくなるかも
GCはメモリか、プロセス終了まで開きっぱなしでも良いようなリソースにしか使えないから

946 :デフォルトの名無しさん:2012/06/27(水) 20:54:48.26
C++/CLI だと managed クラスはスマポを直接フィールドに持てないので
ほとんど意味がない → shared_ptr
shared_ptr を new してポインタで保持するという・・・

947 :デフォルトの名無しさん:2012/06/27(水) 21:03:31.24
>>946
スレチだけどこんな感じであるいは
template <typename T> ref class managed_shared_ptr{
  shared_ptr<T>* sp;
public:
  managed_shared_ptr(T* p):sp(new shared_ptr<T>(p)){}
  ~managed_shared_ptr(){delete sp;}
  ...

948 :デフォルトの名無しさん:2012/06/27(水) 22:15:55.38
>>947
>>946と何が違うのん

949 :デフォルトの名無しさん:2012/06/28(木) 00:54:23.69
>>948
もう1段かましてmanagedクラスのフィールドに直接持てるスマポにする

950 :デフォルトの名無しさん:2012/06/28(木) 07:24:31.06
Dispose できないとあんま意味ないぜ
そして Dispose するくらいなら delete したのでもいい罠

951 :デフォルトの名無しさん:2012/06/28(木) 07:27:02.41
って、デストラクタ = Dispose だったな
最近 C# ばっかだから混乱したわ

で、その Dispose を呼ぶためには
C++/CLI 的には delete を使うのであって
本当に意味が無い

952 :デフォルトの名無しさん:2012/06/28(木) 08:04:48.57
>>951
>C++/CLI 的には delete を使うのであって
いや、C++/CLIではC++の自動変数ライクな構文が用意されている

ref class A{public: A(){} ~A(){}};
ref class B{
  A a; //実体は実際にはgcnewされる(A^ a = gcnew A();)
};
void f(){
  B b; //実体は実際にはgcnewされる
  f2(b);
}

これはC#での

class A : IDisposable {public A(){} public void Dispose(){}};
class B : IDisposable {
  A a = new A();
  public void Dispose(){using(a){}}
};
void f(){
  using(B b = new B()){
    f2(b);
  }
}
になる

953 :デフォルトの名無しさん:2012/06/28(木) 18:19:10.10
メンバ変数
bool (Choge::*func[NUM][NUM])(Chage*,Chage*); //関数ポインタ配列

↑宣言
↓実際に使おうとしたとき

bool a = this->*func[Array[Ai]->Getnum()][Array[Bi]->Getnum()](Array[Ai],Array[Bi]);

式にはpointer-to- 関数型が必要です
って出ます。どうしたらいいでしょうか?

954 :デフォルトの名無しさん:2012/06/28(木) 18:23:11.25
bool a = (this->*func[Array[Ai]->Getnum()][Array[Bi]->Getnum()])(Array[Ai],Array[Bi]);
じゃなかったっけ

955 :デフォルトの名無しさん:2012/06/28(木) 18:30:10.40
>>954
警告でなくなった!!
ありがとう!

956 :デフォルトの名無しさん:2012/06/28(木) 18:59:55.77
あともう一個・・・
boolの返値って受け取らなくても大丈夫ですか?
オーバーロードさせるのが不便なんですけど、コンパイラによって違う〜とか、正式に定義されていないとかありますか?

957 :デフォルトの名無しさん:2012/06/28(木) 19:06:18.41
>>952
Oh, そうだったのか・・・

958 :デフォルトの名無しさん:2012/06/28(木) 20:04:21.84
>>952
デストラクターもつかえるけど
!A(){}ってなデストラクターもどきを使うんじゃなかったか?


959 :デフォルトの名無しさん:2012/06/28(木) 20:06:00.67
>>955
エラーじゃないのか?これでコンパイル通ったら問題だろ。

960 :デフォルトの名無しさん:2012/06/28(木) 20:12:27.52
>>958
~A()はDisposeに相当して
!A()はファイナライザに相当する
普通はDispose(bool)を用意してそれを呼ぶ形で実装する

961 :デフォルトの名無しさん:2012/06/28(木) 20:16:12.34
>>960
>普通はDispose(bool)を用意してそれを呼ぶ形で実装する
これはなんで?~A()から!A()よべばええんちゃうん?

962 :デフォルトの名無しさん:2012/06/28(木) 20:17:08.19
>>958
ファイナライザだね
javaでも同様だけどファイナライザというのは気休め(後処理を書き忘れるアホプログラマ対策用)に過ぎないので
呼ばれることを前提にしては駄目な機能

963 :デフォルトの名無しさん:2012/06/28(木) 20:34:45.08
>>962
Finalizerそのものを当てにする必要はないけど、
deleteすればFinalizerが呼ばれるんだから
わざわざ別の関数にする必要ないじゃないの?
!A()に記述しとけば、関数から戻ってきたobjectを
managed用のunique_ptrに突っ込んで消すってことが
出来るじゃん。Disposeの明示的な呼び出しだと
忘れそうでこわひ。

964 :デフォルトの名無しさん:2012/06/28(木) 20:47:21.20
managedに対するdeleteで呼ばれるのはデストラクタ(=Dispose)であって
ファイナライザじゃないよ
あとunique_ptrはRAIIによってちゃんとdeleteする

>>947でラップして>>952のように埋め込めば勝手にDisposeを呼んでくれるから
明示的な呼び出しは必要無くなる

965 :デフォルトの名無しさん:2012/06/28(木) 21:03:25.36
>managedに対するdeleteで呼ばれるのはデストラクタ(=Dispose)であって
>ファイナライザじゃないよ
了解。

ただ後半が何が言いたいのかわからないな。
managed用unique_ptrやscoped_ptrで消すって話と何が違うの?

966 :デフォルトの名無しさん:2012/06/28(木) 21:14:24.18
違うも何も後半がmanaged用スマポを実装及び使用する方法ということだよ
スマポは直接フィールドに持ってRAIIすることに意味があるから

967 :デフォルトの名無しさん:2012/06/28(木) 22:26:49.81
例えば

(1,2,3)
(4,5,6)
(7,8,9)

のような値が入っているCSVファイルから
括弧とカンマを除いて一文字ずつ配列に格納する方法ってありますか?

説明下手で申し訳ないです…

968 :デフォルトの名無しさん:2012/06/28(木) 22:36:38.73
>>967
fscanf

969 :デフォルトの名無しさん:2012/06/28(木) 22:57:03.02
fscanfよりは
fgets, strtok, atoi の方がやりやすそうではある

970 :デフォルトの名無しさん:2012/06/28(木) 23:21:27.59
boostありなら、こういうの使ったら?
https://github.com/tonicebrian/csv_iterator/blob/master/src/main.cpp
https://github.com/tonicebrian/csv_iterator/blob/master/include/csv_iterator.hpp

971 :デフォルトの名無しさん:2012/06/28(木) 23:23:27.58
const std::string ln = "\n";
while( !feof( stream ) )
{
  do
  {
    if( 2 != fscanf( stream, "%d %[,\n]", value, stab ) ) throw ParseError( "あうちっ" );
    col.push_back( value );
  }
  while( ln != stab );
  row.push_back( col );
}

なんでC++にscanfファミリーに当たるもんがねぇんだよ・・・。

972 :デフォルトの名無しさん:2012/06/28(木) 23:24:27.45
copy_ifってないのかしらん

973 :デフォルトの名無しさん:2012/06/28(木) 23:32:26.11
remove_copy_ifでは力不足ですか?

974 :デフォルトの名無しさん:2012/06/28(木) 23:33:30.11
removeしたくないのです

975 :デフォルトの名無しさん:2012/06/28(木) 23:45:12.62
transformでいいじゃない

976 :デフォルトの名無しさん:2012/06/29(金) 01:24:15.74
>>972
SGIの原型にはあったけど98/03で無くなり、そして11で復活した

977 :デフォルトの名無しさん:2012/06/29(金) 07:15:47.48
>>971
istringstreamでは不満か?

978 :デフォルトの名無しさん:2012/06/29(金) 09:00:11.35
>>969
CSVの展開にstrtokを使うバカ発見。

979 :デフォルトの名無しさん:2012/06/29(金) 09:31:24.87
そもそも、>967のようなフォーマットをcsvと呼ぶのは如何な最中と。

980 :デフォルトの名無しさん:2012/06/29(金) 09:38:21.60
むしろstd::complex<int>を中途半端にしたようなデータ形式だよな

二元数(複素数)や四元数(クォータニオン)や八元数はあっても3つしかデータがないのは
ベクトルか何かのつもりか?

981 :デフォルトの名無しさん:2012/06/29(金) 09:49:20.67
RGBとかかもな?

982 :デフォルトの名無しさん:2012/06/29(金) 10:42:15.96
>>977
C++ではそうなるよな
boost::lexical_castでも内部ではそれ使ってるし

983 :デフォルトの名無しさん:2012/06/29(金) 12:41:10.46
CSVではない

984 :デフォルトの名無しさん:2012/06/29(金) 19:21:58.57
CSVだと , を含む項目を考慮する必要があるからstrtok使えないけど
これはCSVではない

985 :デフォルトの名無しさん:2012/06/29(金) 19:24:03.40
int csv[] = { #include "csvfile" };
普通のならこれでいいのに

986 :デフォルトの名無しさん:2012/06/29(金) 19:45:14.14
修正するたびにリコンパイルか
何のための外部ファイルだよw

987 :デフォルトの名無しさん:2012/06/29(金) 19:50:19.52
なら名前を外部ファイルにすればいい

988 :デフォルトの名無しさん:2012/06/29(金) 20:40:43.56
XBMとXPMという画像形式は
修正のたびに再コンパイルだったなあ

989 :デフォルトの名無しさん:2012/06/29(金) 20:44:02.04
>>977
C++のiostream系は、"<a %[!"#$%&'()~] >"ってな集合に対するパターンマッチが
出来ないから不便。同じ事をしようとしたら自前でパターンに一致する範囲を抜き出さなきゃならん。
scanf駆使すりゃXMLの読み込みでも、半日足らずで書けるが、iostreamじゃとてもじゃないけど半日は無理。

あと、sscanfとかstringstreamとか、一旦メモリーに読み込む奴は
ストリーム系に流用できないし、流用しようとすると複雑になるからナシ。


990 :デフォルトの名無しさん:2012/06/29(金) 20:48:53.06
iostreamとかマヌケ仕様だよな

演算子のオーバーロードの単なるデモだろ

991 :デフォルトの名無しさん:2012/06/29(金) 20:56:37.95
TCPソケットからウィンドウにまで使ってるんだら便利だろ

992 :デフォルトの名無しさん:2012/06/29(金) 21:04:21.76
そろそろ次スr

993 :デフォルトの名無しさん:2012/06/29(金) 22:59:08.27
>>989
やはりC++11のregexに頼るしかないのか(´・ω・`)

994 :デフォルトの名無しさん:2012/06/29(金) 23:42:32.22
lexer/parser くらい自分で作ろうぜ

995 :デフォルトの名無しさん:2012/06/30(土) 02:14:36.88
>>988
逆に言えば、コンパイル時に取り込める有り難い画像ファイルフォーマットってことじゃないか。
再コンパイルがいやなら他のフォーマット同様実行時に取り込めばいいだけだ。

それにしても、WikipediaのXPMは私が書いたっきりか(苦笑

996 :デフォルトの名無しさん:2012/06/30(土) 11:44:43.82
tr1::regexは遅すぎて実用には耐えれん

997 :デフォルトの名無しさん:2012/06/30(土) 12:49:19.02
それは仕様の問題じゃなくて実装の問題じゃ

998 :デフォルトの名無しさん:2012/06/30(土) 12:55:46.66
建てられるひと次スレお願い

999 :デフォルトの名無しさん:2012/06/30(土) 13:10:42.06
ほれ

C++相談室 part96
http://toro.2ch.net/test/read.cgi/tech/1341029267/

1000 :デフォルトの名無しさん:2012/06/30(土) 13:16:31.03
Gooooal

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

238 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)