C++相談室 part80

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part79
http://pc12.2ch.net/test/read.cgi/tech/1268846738/
2デフォルトの名無しさん:2010/04/18(日) 20:51:46
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2010/04/18(日) 20:51:56
■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デフォルトの名無しさん:2010/04/18(日) 20:52:03
5デフォルトの名無しさん:2010/04/18(日) 20:52:10
6デフォルトの名無しさん:2010/04/18(日) 20:52:16
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
7デフォルトの名無しさん:2010/04/18(日) 20:52:22
    >>1 乙 もう俺に用はない

    ミ ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |


テンプレは以上です。
8デフォルトの名無しさん:2010/04/18(日) 21:02:15
9デフォルトの名無しさん:2010/04/18(日) 21:04:24
C++は全てスタティックリンクでね
ダイナミックリンクなんてしないでね
10デフォルトの名無しさん:2010/04/18(日) 22:26:14
■長いソースを貼るときはここへ。■
について

ttp://codepad.org/
もいいけど
Ideone.com | Online IDE & Debugging Tool
ttp://ideone.com/
これもなかなか良いよ。

ただ俺はcodepadの方が慣れているしそっち使うけど。
11デフォルトの名無しさん:2010/04/18(日) 22:42:09
templateクラスの共通する変数とかは非templateにまとめて
それをprivate継承すると実行ファイルのサイズとかコンパイルコストが減るようなんですが
実際そこまでこだわるほどの価値ってありますか?
12デフォルトの名無しさん:2010/04/18(日) 23:08:18
価値観って人それぞれだよね。
13デフォルトの名無しさん:2010/04/18(日) 23:10:24
>11
必要になってからやる。
構造の簡素化とか汎用化、一貫性を優先した方が良い。といってもこっちも必要にならなきゃやらんかも。
14デフォルトの名無しさん:2010/04/19(月) 06:40:58
class Hoge
{
 std::string name;
public:
 const std::string& GetName() const{return name;}
};
ってクラスがあり、そのクラスのインスタンスへのポインタを
抱いてるvectorが下記のようにあります。

std::vector<Hoge*> vecString;

このvecStringの中にあるHogeのnameの長さが5以上の数を
C++らしくcount_ifで数えるにはどうなりますか?

15デフォルトの名無しさん:2010/04/19(月) 07:10:36
16デフォルトの名無しさん:2010/04/19(月) 10:01:36
>>14
using boost::bind;
std::count_if(vecString.begin(), vecString.end(),
  bind(std::greater_equal<std::string::size_type>(), bind(&std::string::size, bind(&Hoge::GetName, _1)), 5))
17デフォルトの名無しさん:2010/04/19(月) 10:03:28
>>16
それだとぬるぽの可能性が
18デフォルトの名無しさん:2010/04/19(月) 10:04:26
C++0xが一番ありがたく思えるシチュエーションかな、こういうのが。
19デフォルトの名無しさん:2010/04/19(月) 21:47:27
たしかにC++らしいwwww
20デフォルトの名無しさん:2010/04/19(月) 22:45:31
std::count_if(vecString.begin(), vecString.end(),
[](Hoge* h){return h->GetName().size()>=5;})

あまり楽になった気がしないのは何故だろう
21デフォルトの名無しさん:2010/04/20(火) 01:17:30
多分、それはコンパイラの気持ちになってパースしてしまうから…
22デフォルトの名無しさん:2010/04/20(火) 17:48:03
今更だけど、「C++ってコンパイラの気持ち(動作)を良く理解しないと
いけない度合い」が他の言語より相当強いよね。

標準C++の仕様ってのがつまりは"広義のコンパイラ"の動作なわけだけど。

前スレのfriend議論もそうだけど、なかなか強烈な議論だった。
23デフォルトの名無しさん:2010/04/20(火) 19:11:50
しゃあーない
禿の思惑とは反対方向にC++はどんどん肥大化してしまったからな
PL/Iの二の舞になっとる
24デフォルトの名無しさん:2010/04/20(火) 22:02:33
std::mapの二分木を巡回しながら各要素に適当な操作をしたいのですが
行きがけ順、帰りがけ順、などを切り替えて巡回する方法って用意されてますか?
25デフォルトの名無しさん:2010/04/20(火) 22:12:21
マクロ関数

a-> ## b

って記述したいんですけどプリプロセッサエラー
出ちゃうなんとかして困った
26デフォルトの名無しさん:2010/04/20(火) 22:16:19
そのスペースはなんだい
27デフォルトの名無しさん:2010/04/20(火) 22:16:32
イミフ
28デフォルトの名無しさん:2010/04/20(火) 22:18:58
そもそもmapを二分木で実装しなきゃいけないって決まってたっけ?
要素の並び順が規定されてるだけ(ISO の 23.1.2)だから、二分木を想定した方法はないような
29デフォルトの名無しさん:2010/04/20(火) 22:19:19
#define test(a, b) a-> ## b = 100

C++ってこんなの作れないのかな?
スクリプト言語なら出きるのになんでC++はできないの?

なんでなの?
30デフォルトの名無しさん:2010/04/20(火) 22:21:53
お前が馬鹿だから
31デフォルトの名無しさん:2010/04/20(火) 22:23:20
>>29
特殊な技法を駆使すればできるよ
32デフォルトの名無しさん:2010/04/20(火) 22:33:13
>>29
C++ができないんじゃなくてお前の頭じゃできないだけ。
33デフォルトの名無しさん:2010/04/20(火) 22:51:48
>>14
つかさ〜
素直にforでまわして、Hoge*へのポインタにlengthじゃダメなの?

>>16の回答があってるかどうかはわからんが、それを書くのに2,3分でかけるならいいけど
20分も30分も悩んでたら、どんだけ工数あっても足らないし、しかもぱっと見わかりづらい・・・
34デフォルトの名無しさん:2010/04/20(火) 23:07:01
>>20
boost::bind にかけられた叡智と努力を無視してるから
35デフォルトの名無しさん:2010/04/20(火) 23:16:10
>>33
boost::bind を理解してれば2、3分も掛からない
掛かるのはタイプにかかる時間だけ

std::count_if(v.begin(), v.end(), bind(&std::string::size, bind(&Hoge::GetName, _1)) >= 5);

確かに見づらいね
でも、 for 文だと余分なローカル変数を導入するし、for 文の方が間違いやすいと思う
36デフォルトの名無しさん:2010/04/20(火) 23:20:48
この程度ならタイプ量の違いなんてカスみたいなもんだろう
実行コストは…これも大差ねーか?
37デフォルトの名無しさん:2010/04/20(火) 23:45:56
タイプ量なんてC++においてはクソの次ぐらいに位置するだろう。

TMPを見てみろあの変態共は…(ry
38デフォルトの名無しさん:2010/04/21(水) 00:13:55
>>35

あの手のコードをタイプ時間のみで書ける、あなたのようは人は多くいはいないでしょ?


39デフォルトの名無しさん:2010/04/21(水) 01:46:28
>>29
#define test(a, b) a-> b = 100
で何がいけないのか
話はそこからだ
40デフォルトの名無しさん:2010/04/21(水) 02:37:44
>>39
Token-Pasting Operator (##)
the tokens preceding and following it are concatenated.
White space preceding or following the operator is optional.

MSDNからの抜粋だが、そのような結果にはならないのでは?
41デフォルトの名無しさん:2010/04/21(水) 03:00:42
29が(bが*で始まってない限り)無意味だから意図を聞いてるんだよ
##の意味くらいみんな知ってるから下らない茶々入れるな
42デフォルトの名無しさん:2010/04/21(水) 05:48:30
>>41
ちょっとなにいってるか分からない
bが*で始まるという表現のひどさはさておいても、それがプリプロセスエラーになると思えるのはどういう考え?
43デフォルトの名無しさん:2010/04/21(水) 07:03:27
>>42
トークン連結の結果は、ひとつのトークンを成していなければならない。
"->" と何かを連結してひとつのトークンを成すとすれば、当てはまる結果は "->*" しか
存在せず、したがって b は "*" で始まるほか無い。

この制約を満たさない場合の動作は未定義。コンパイラによってはエラーになったり、
何もメッセージは出なかったりする。
44デフォルトの名無しさん:2010/04/21(水) 07:12:31
PHPをC++化するOSSツール「HipHop for PHP」、Facebookがベータ版を公開
ttp://www.nikkeibp.co.jp/article/news/20100204/208938/
今更かもしれないけど俺は驚いた。
45デフォルトの名無しさん:2010/04/21(水) 07:19:19
ひどい流れだ
46デフォルトの名無しさん:2010/04/21(水) 10:48:25
自作クラスTestをstd::vectorに入れています。

std::sort(vec.begin(),vec.end(),std::less<Test>());

の為にoperator <をTestクラスのメンバに書きましたが
「二項演算子 '<' : 型 'const Test' の左オペランドを扱う演算子が見つかりません 」
とのエラーメッセージが出たんで

クラスの外に定義したら問題なく動作しました。

が、なぜクラスのメンバではダメなのでしょうか?
4742:2010/04/21(水) 10:49:48
>>43
平身低頭して謝ることしかできません
48デフォルトの名無しさん:2010/04/21(水) 10:55:55
>>46
constつけ忘れたんじゃね
49デフォルトの名無しさん:2010/04/21(水) 11:02:29
>>48
ありがとうございます。

解決しました。
50デフォルトの名無しさん:2010/04/21(水) 16:22:55
VC++でビルドスクリプト的な需要を解決する方法って何が一般的ですか?
eclipseだとIDEから簡単に使えたんだけどそういうサポートはされてますか?
51デフォルトの名無しさん:2010/04/21(水) 16:28:19
カスタムビルドステップのこと?
52デフォルトの名無しさん:2010/04/21(水) 16:46:09
DLLとかつくるときに「シンボルのエクスポート」とかチェックする項目あるけど
シンボルって言うのは関数とグローバル変数を指すの?
どの範囲を指すのかが良く解らん
53デフォルトの名無しさん:2010/04/21(水) 17:08:01
>>50
nmake か msbuild のどっちか。VCのバージョンによるからお好きなほうで。
54デフォルトの名無しさん:2010/04/21(水) 17:58:18
特定のソフトウェアの話じゃなくて
C++についての話をしようぜ。
55デフォルトの名無しさん:2010/04/21(水) 22:45:27
普段はC#メインで数年ぶりにC++を触っています
例えばvectorの特定の要素を見つける(条件は少し複雑)場合に

1.for文をbegin〜endまでまわす(なんかかっこ悪い?)
2.find_ifを使う(別途関数つくるのがうざい)
3.boostでラムダとか使う(使い方もう忘れたよ><)
4.VS2010が出るまで寝る

の四択があるのですが一般的またはお勧めとされるのはどれですか?
ちなみに完全趣味利用です。
56デフォルトの名無しさん:2010/04/21(水) 22:46:48
2
57デフォルトの名無しさん:2010/04/21(水) 22:49:57
4でfind_if+ラムダ式がベスト
58デフォルトの名無しさん:2010/04/21(水) 22:53:57
>>57
それって、普通のC++でも可能なんですか?
MSが開発したヘンテコなC++だけじゃなくて?MC++でしたっけ?
59デフォルトの名無しさん:2010/04/21(水) 22:54:21
C++では滅多にusingは使わないのですか?
60デフォルトの名無しさん:2010/04/21(水) 22:54:52
使いません
61デフォルトの名無しさん:2010/04/21(水) 22:57:09
>>59
boostで使うだろ
いちいちboost::mpl::とかタイプしたいのか
62デフォルトの名無しさん:2010/04/21(水) 22:59:13
>>58
C++0x
63デフォルトの名無しさん:2010/04/21(水) 23:00:26
>>60
それどころかusing使わないとできない大事な技法もあるだろ

using std::swap;
とかまさか意味が分からないなんてヤツはいないよなw
64デフォルトの名無しさん:2010/04/21(水) 23:01:27
>>58
C++0xなら可能。
gccの最新やvc10なら実装されてる。
std::find_if( first, last, [](int v) { return ...; } ); みたいな。
65デフォルトの名無しさん:2010/04/21(水) 23:04:27
まずusing declarationとusing directiveの話がごっちゃになってる件。
66デフォルトの名無しさん:2010/04/21(水) 23:18:01
>>65
いや元の質問がごっちゃになっているから、

>>60わざと使わないと言った(using directiveを意識している?)
>>61反例を挙げた(using directiveについて)
>>63あえて別例を挙げた(using declarationについて)

要するに元の質問者をおちょくっているだけだろう。
6766:2010/04/21(水) 23:19:18
ちなみに分からない人には

using declarationとusing directiveの違い
ttp://cpplover.blogspot.com/2009/06/using-declarationusing-directive.html

これでも読んでください。
68デフォルトの名無しさん:2010/04/22(木) 00:33:16
>>63
ごめんなさい、そうしないとできない大事な技法というのが分かりませんでした
6955:2010/04/22(木) 01:09:18
じゃあVS2010出るまで寝るか
と思ったら20日に公開されてたんですね
早速落としてみるか
70デフォルトの名無しさん:2010/04/22(木) 07:06:52
>>68
例外安全とかCopy & Swapを知らないの?
なら勉強不足なだけ。
71デフォルトの名無しさん:2010/04/22(木) 07:12:17
>>70
usingなんていらねーよカス
72デフォルトの名無しさん:2010/04/22(木) 07:20:26
>>71
いらないなら何のためにあるの?
その論でいくとtypedefも不要になりそうだが
73デフォルトの名無しさん:2010/04/22(木) 07:26:07
#include <iostream>

namespace A {
 class N { };
 void swap(N& a, N& b) { std::cout << "swap N" << std::endl; }
}

int main() {
 using std::swap;
 A::N a, b;
 int c, d;
 swap(a, b); // A::swap が呼ばれる
 swap(c, d); // std::swap が呼ばれる(using が必要)
}

名前空間関連のC++の仕様は複雑だよなあ
74デフォルトの名無しさん:2010/04/22(木) 08:38:27
その例だと std::swap<A::N> で特殊化しないのはなんで?って言われると思う
75デフォルトの名無しさん:2010/04/22(木) 08:53:55
std::swap<A::N> で特殊化しないのはなんでなのJOJO?
76デフォルトの名無しさん:2010/04/22(木) 09:00:54
規格で許されてるとはいえ、stdを汚すよりはいいんじゃない?
結局のところ適切なswapを呼び出してくれるんでしょ
77デフォルトの名無しさん:2010/04/22(木) 13:07:15
swapも演算子レベルで仕様に組み込んでしまえばよかったのに
いびつになってる
7868:2010/04/22(木) 13:32:57
>>70
知ってますが、usingを使わなければならないと思ったことがありませんでした。
usingはコードの記述量を減らす為にしか使ったことがありません。
79デフォルトの名無しさん:2010/04/22(木) 13:55:13
rvalue参照でswapに相当することが出来るようになるし
swapで出来ない、というかちょっと無駄になるような処理も
効率的に表現出来るお
80デフォルトの名無しさん:2010/04/22(木) 15:56:15
すみません。
2つ目のconstが無いとSTLがうまく動かないのですが。
これはどのような効果があるんでしょうか?

bool operator < (const classdata &x) const { return (n<x.n) ; }
81デフォルトの名無しさん:2010/04/22(木) 16:00:59
この中じゃ数値を変更しないよ宣言
82デフォルトの名無しさん:2010/04/22(木) 16:01:30
>>80
エラーならエラーメッセージを貼るべきだし、メンバ関数ならそう断ろうよ。
で、2番目のconstはメンバ関数が静的である。
つまり、メンバの変更は行なわないことを表明している。
ということは、静的なインスタンスからでも呼べるということ。
逆に言うと、静的でないメンバ関数は静的なインスタンスからは呼べない。
83デフォルトの名無しさん:2010/04/22(木) 16:17:29
サンクス。すみません。
このようなクラスがあったとき、x.nもnも変更しないという宣言なんでしょうか?

class classdata {
public:
int n;
bool operator < (const classdata &x) const { return (n<x.n) ; }
};
84デフォルトの名無しさん:2010/04/22(木) 17:05:32
メンバに変更が発生しないという宣言
85デフォルトの名無しさん:2010/04/22(木) 17:09:10
サンクス
86デフォルトの名無しさん:2010/04/22(木) 17:11:09
>>83
一個目のconstはxの参照先が変更不可。
二個目のconstはそのクラスのメンバが変更不可。
従って、nもx.nも変更不可。
87デフォルトの名無しさん:2010/04/22(木) 17:21:33
ああ、そうだな。
>>83では2個目のconstに限っていなかった
8870:2010/04/22(木) 18:13:32
>>78
まず>>67のusing declarationとusing directiveの違いは理解している?
もしご存じなければリンク先を熟読してください、



>>71お前本当にC++でプログラミングしてんのかよ。
無知を曝してる割に一切恥じないとはなかなかのツワモノだな。
言っとくがそうやって煽られてもお前に教える気はないよ。
…………………………
と思ったのだが、ROMってる純真な初学者さんが>>71の言うことを真に受けてしまうと
可哀相なのでヒントだけ書いておく。

上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。
そこで
using std::swap;
が活躍する事になるのだが、その辺のconsensusについては
かの名著『Effective C++第3版』
にも記載があるので未読or忘れた人は読んでおきましょう。

ちなみにまさにこういった事を知らない>>71のような無知プログラマが万一プロジェクトに
居た場合の対策についても『Effective C++第3版』は言及しているという名著っぷり。

他にもusingは
基底クラスのメンバを可視にするとか
CRTP関連の変態イディオムとか
いろいろ出番あるじゃないか。
89デフォルトの名無しさん:2010/04/22(木) 18:18:43
煽りを真に受けて長文レスして越に入っちゃう男の人ってちょっと…
90デフォルトの名無しさん:2010/04/22(木) 18:30:26
using が絶対に必要な例を1つでも示せれば
そんなに凄まなくていいのにな
9168:2010/04/22(木) 18:44:10
>>88
はい、その違いについては理解しているつもりです。
そもそも、using directiveしか知らない方は見かけますが、using declarationの存在を認識していて
それらの違いを理解していない方はあまりいないのではないかと思っています。
起こり得がたい状況にも思えます。

閑話休題しますと、例外安全にするためにswapを使う、その際にstd::swapと記述するのでは
だめなのでしょうか?

繰り返しになってしまって申し訳ないのですが、usingを使わなければならない、逆に言えば、
usingを記述しなければ実現できないという状況をまだ知らないのです。
92デフォルトの名無しさん:2010/04/22(木) 18:44:15
>>73 で using がないと std:: が必要になる。
std:: を書くようになると、swap の引数が何かによって
std:: をつけるかつけないかが変わってしまうので、
swap の中身を変えたら swap できなくなった、とかの問題が起こる事がある。

swap(a, b); で A::swap が呼ばれるのは、
引数の a と b の型が名前空間 A に属しているので、
勝手に名前空間 A の中に swap が無いか探して、
あればそっちを優先してくれるから。

このあたりのことは Effective C++ に書いてあるから、
この重要性が分からない = Effective C++ すら読んでないヘボPGだと声高に叫んでる
ということになる。
93デフォルトの名無しさん:2010/04/22(木) 18:53:36
usingよりtemplate使えよ
メンバswapにもSwapにもPODの最適化にも対応出来る
94デフォルトの名無しさん:2010/04/22(木) 18:59:35
>>76
その結局のところというのは完全合法なのかなぁとか適当に言ってみるんだけどどうなの?
95デフォルトの名無しさん:2010/04/22(木) 19:06:15
>usingよりtemplate使えよ
swap技法について言ってるのなら、ちょっと意味が分からない。
96デフォルトの名無しさん:2010/04/22(木) 19:15:50
>>95
最適なスワップを呼び出してくれる関数をtmp使って書いて
{using std::swap; swap(a, b);}
の代わりに
saikyo::swap(a, b);
って使うんだよ
97デフォルトの名無しさん:2010/04/22(木) 19:18:01
それTMPなの?
98デフォルトの名無しさん:2010/04/22(木) 19:19:08
>>96
saikyo::swapはどうやって書くのさ
まさか、必要な型のぶんだけ全部オーバーロード(もしくは特殊化)するの?
9988:2010/04/22(木) 19:38:28
>>90
> using が絶対に必要な例を1つでも示せれば
> そんなに凄まなくていいのにな
上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。

って一行で済ませているだろ
なんでそれが分からないんだよ
なんでEffective C++すら読んでないんだよ
100デフォルトの名無しさん:2010/04/22(木) 19:39:49
std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう
まあ悪くはないように見えるが、std::swap でなくそちらを使うよう周知させる必要がある点が微妙
101デフォルトの名無しさん:2010/04/22(木) 19:40:03
>>96
お前の言っているテンプレートはC++のテンプレートとは思えんくらい
あり得ない動きを期待しているようだが。

頼むからEffective C++を最低2回は熟読しろ。
10288:2010/04/22(木) 19:41:12
>>100
> std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう
できないっつーの。
なんでお前までも Effective C++ を読んでないんだよ!

> クラステンプレートに対しては(部分特殊化となるため)できない。
って俺が>>88で述べただろうが!
103デフォルトの名無しさん:2010/04/22(木) 19:45:03
>>101
tmp勉強すればわかる
104デフォルトの名無しさん:2010/04/22(木) 19:47:43
>>103
tmpがテンプレートメタプログラミングの略だとしたら
知ったかぶりもいいところだな。

こんなにテンプレートに関してうるさい俺が
Template MetaProgrammingを知らない訳ねえじゃねぇか。
105デフォルトの名無しさん:2010/04/22(木) 19:51:55
>>104
実際わからねぇんなら勉強不足なんじゃない?
106デフォルトの名無しさん:2010/04/22(木) 20:00:52
またhitoが暴れてる予感
107デフォルトの名無しさん:2010/04/22(木) 20:03:02
おまえらただの言語オタクだ
108デフォルトの名無しさん:2010/04/22(木) 20:03:30
hitoってダレだよw
109デフォルトの名無しさん:2010/04/22(木) 20:05:52
saikyo::swapの実装を考えてみたが、
・メンバswapやSwapが存在するかなどSwappableを判定するtraitsでできる限り網羅的に定義する。
・それ以外のものは実装者自身またはサードパーティが適宜saikyo::swapまたはtraitsを特殊化。
というか俺lexical_castを作るのにこういう実装でやったことがある。
swapに関して言えば、どう考えてもusing std::swap(またはboost::swap)のほうが綺麗で便利。

もっと本当に最強な実装があるというなら教えてくれ。まじで。
110デフォルトの名無しさん:2010/04/22(木) 20:07:34
今日はあちこちおもろいな。
宿題スレではhttpはtelnetプロトコル以降に生まれたから互換性があると断言してる人もいるし
ここはここでこんなだしw
111デフォルトの名無しさん:2010/04/22(木) 20:39:54
>>99
特定の書籍をどうするかは他人の勝手だよ
話が通じてないと思うなら、おまえが自分の言葉で語らないことを省みたらどうなんだ

#include <algorithm>
#include <iostream>
namespace A {
struct B {};
void swap(B&, B&) { std::cout << 1; }
}
main()
{
A::B x, y;
swap(x, y);
}

くらいのことを自慢できる相手が2ちゃんしかないんじゃないか?
112デフォルトの名無しさん:2010/04/22(木) 20:50:54
ageてまで自分の無知を宣伝するとかどんなM
113デフォルトの名無しさん:2010/04/22(木) 20:55:05
ADLと言えば済むところをコードまで書いちゃうおとこの人って
114デフォルトの名無しさん:2010/04/22(木) 20:56:03
>>73と同じ事書いてるだけだし
何がしたいのか分からない
115デフォルトの名無しさん:2010/04/22(木) 21:08:54
ヘボかどうかの基準に特定の書籍は登場しないって指摘してるだけだよ
C++ならC++でどんな目的に使ってどのくらい達成できたかに過ぎないのを
わざわざ礼を失した表現を選ぶ者こそ何がしたいのか理解に苦しむ

# スレッドフロートという掲示板の仕様が気に入らないのを一般ユーザに八つ当たりするバカも同類
116デフォルトの名無しさん:2010/04/22(木) 21:13:02
>>115
# スレッドフロート型を拡張した掲示板の慣例を守っていないことに対する指摘は八つ当たりではない、と書いたところでsage進行スレじゃないことを知る
117デフォルトの名無しさん:2010/04/22(木) 21:16:43
さらに、ここはム板
強制と任意の区別がつかない知恵遅れに出る幕はない
118デフォルトの名無しさん:2010/04/22(木) 21:16:50
特定の書籍は共通認識として役に立つぐらいだよなぁ。デザパタと一緒。
デザパタの名前を知らないからヘボと決めてはならないし、特定の書籍を
読んでないことについてももちろん同様。

共通認識としての情報が使えない場合、相手に対して正しく伝えられるかどうかが
ヘボかどうかの基準といえる。

まとめると、この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。
119デフォルトの名無しさん:2010/04/22(木) 21:20:02
> この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。
Effective C++を読んでないからお前アウトとは言っていない。
Effective C++を読んでなくてもそれに相当する最低限の知識を持っていれば
アウトではないし、別にEffective C++を読む必要すらないレベルの方々だということだ。

だが
「それに相当する最低限の知識」を持ち合わせていない
ようなので、お前アウトと申し上げたとおりだ。

120デフォルトの名無しさん:2010/04/22(木) 21:22:25
上記のstd::swapの議論に荷担したいわけじゃなく、
全然関係ない質問として
swapについて質問をさせてください。


他人の作ったクラスOther_s_Classを利用したクラスMy_Classを作る時、
Other_s_Classの仕様のせいでどうしても
swap(const My_Class&, const My_Class&, )
を例外を投げないように実装できない
(頑張っても不可能)ということは
実際にあるのでしょうか?

ありましたら例を教えてください。

よろしくお願い申し上げます。
121デフォルトの名無しさん:2010/04/22(木) 21:28:27
例外を投げないようにというそれだけの要求であればすぐできるよね。
ただ、例外を投げない例外安全性を求めるのならずいぶん難しいと思う。
122デフォルトの名無しさん:2010/04/22(木) 21:29:06
My_Class::swapが例外を投げる可能性があり、しかも何が投げられるか不明確
(たとえばLib+ヘッダのみ公開されていて仕様にも記載がない)なら事実上無理だわね。
throw()で握り潰せば何でもありだけど。
123デフォルトの名無しさん:2010/04/22(木) 21:29:12
Other_s_Class をポインタで持てば
常にポインタの交換で実装できるんじゃない?
swap のためだけにポインタにする、というのが嫌ならアレだが
124120:2010/04/22(木) 21:31:32
みなさんありがとうございます。

> swap のためだけにポインタにする、というのが嫌ならアレだが
swap のためだけにポインタにするのも厭いません。
例外を投げるswapを認めないということは常に実装可能なのかと
疑問に思いまして。
125デフォルトの名無しさん:2010/04/22(木) 21:33:10
アウト・セーフ・よよいのよいってか
何の話だよいったい・・・

知らなければ論外だと思うならそもそも相手すんな
自分が論内に引っぱってるんだろうが
126デフォルトの名無しさん:2010/04/22(木) 21:41:56
>>124
123 のレスが全てでしょ
127デフォルトの名無しさん:2010/04/22(木) 21:44:35
>>124
なんにも制約をつけないとなるとswapってなんだろうという哲学的な問いのような気がしてきた
たとえば連結リストの一つのノードに対する
struct node_t{
node_t *prev; node_t *next; int v;
};
void swap(node_t *n1, node_t *n2);
という関数は必要なのか?
どういう実装にすべきか?
128デフォルトの名無しさん:2010/04/22(木) 21:49:35
作るなら void swap(node_t& n1, node_t& n2); でしょ
値だけの交換と前後の交換の二種類あるけど、
テンプレートだと値が交換可能である保証が無いから
前後の交換で実装するのが無難かと
これはintだから値の交換でもいいと思うが
前後の交換だと、n1, n2 が連続している時に少し考慮が必要かな
129デフォルトの名無しさん:2010/04/22(木) 21:54:31
http://codepad.org/FdFoMETP

なんでコンパイル出来ないんですか?
130デフォルトの名無しさん:2010/04/22(木) 22:06:19
fugaの引数の型がintだけど、
intからhoge<T>::typeのTを類推できないので

typedefされた型は元の型と同じように扱われて、
xには既にhoge<T>::typeという情報は残らない
131デフォルトの名無しさん:2010/04/22(木) 22:16:35
なるほど
引数からの類推って結構制限きついんですね
最終的にその型になればなんでもいいのかと思ってました
132デフォルトの名無しさん:2010/04/22(木) 22:55:08
修飾された型名は推論できないんだよな

>>35
それだと5uにしないと警告の嵐
133デフォルトの名無しさん:2010/04/22(木) 23:17:54
でも警告でしかないんだよね
134デフォルトの名無しさん:2010/04/22(木) 23:28:39
>>133
それがC++さ!
135デフォルトの名無しさん:2010/04/22(木) 23:35:29
嵐っちゅっても結局はこれ↓一つでしょ
warning: comparison between signed and unsigned integer expressions
136デフォルトの名無しさん:2010/04/22(木) 23:48:46
お前らのコンパイラは優秀だな
オレのVCで試したら40行近く出たぜ
137デフォルトの名無しさん:2010/04/23(金) 07:04:49
テンプレートとかその他の細かいとこの仕様を知りたいんだけど仕様書だと読むのしんどい
わかりやすく細かい仕様を解説してるサイトとか書籍ってある?
138デフォルトの名無しさん:2010/04/23(金) 07:22:52
>>137
template metaprogrammingをやりたいの?
それとも初めてtemplateに触れるの?
139デフォルトの名無しさん:2010/04/23(金) 07:27:24
metaのほうで初めてというわけじゃなくて
知識をよりまとまった強固なものにしたい
140デフォルトの名無しさん:2010/04/23(金) 07:39:58
>>139
なら回り道せずに規格読むのが最善手。
他の人の解説では間違いや省略が混ざる可能性が出てくるので、強固な知識とは言いがたい。
141デフォルトの名無しさん:2010/04/23(金) 09:05:11
>>137
C++テンプレート完全ガイドとか
142デフォルトの名無しさん:2010/04/23(金) 16:02:55
激しくスレ違いな気もしますが適切なスレが見つからなかったのでここで失礼します。

C++とDirectXでFlashのようなツールを作っています。
Flashはレイヤーの数やフレームの数が限りなく作れたり、「戻る」もかなりの回数を使うことが出来ますが
編集中のデータは一体どこに保存しているのでしょうか。
自作プログラムでメモリに1分ほどのアニメーションを保持させると
レイヤーの枚数や同時に開いているアプリケーションによってはメモリ不足になります。
ファイルに保存しているのかなと思いましたがファイルアクセス?に若干時間がかかり、
レイヤーやフレームの増減や現在見ているフレームを切り替えたときにカクカクしました。
他に方法があるのかと考えましたが思いつかず・・・何か参考になりそうなことがありましたら教えて頂けると有難いです。
そもそもこういった処理に何か名称があるのでしょうか?
143デフォルトの名無しさん:2010/04/23(金) 16:06:30
画像、イメージの保持じゃないんだろ。
144デフォルトの名無しさん:2010/04/23(金) 16:43:55
前後のフレームをバッファリングするとか。
145デフォルトの名無しさん:2010/04/23(金) 17:58:01
>>142
描画につかったパラメータとかプロパティとかを構造体かなんかでバックアップしといて、
必要になったらそれ使って再描画ってかんじじゃないの??
面データとかはなるべくフラグに落としたり出来ないか考える。
もしくは、ランダムアクセスできるような数式を考えて逆側に進めるとか。

初心者だからよく解らんけど。
146デフォルトの名無しさん:2010/04/23(金) 19:01:37
>>142
参考になるかもしれないキーワード
・ベクターアニメーション
・Mementoパターン
・Commandパターン
147142:2010/04/23(金) 19:03:37
>>143-144
前後のフレームをバッファリングするにしても再生すると毎フレーム必要になることを考えたら変わりがないような気も。
情報量を圧縮するにも限界があるので根本的な解決にはならなさそうですね。
「アニメーションの巻き戻しをしない」が前提であれば差分データだけでいいので若干良くはなりそうですが・・。
148142:2010/04/23(金) 19:06:18
>>147>>145のアンカーの付加ワスレ

>>146
調べてみます。
149デフォルトの名無しさん:2010/04/23(金) 19:10:16
>>147
ああ、編集じゃなくて再生のことも書いてたのか

それにしてもバッファリングを否定されるとつらいな。バッファリングなしで動画を描画している例って今あるのかね
150デフォルトの名無しさん:2010/04/23(金) 23:51:24
>>139
パーサー作ってみたら?
() や typename あたりのどたばたまで引っくるめて
C++ を愛せるかどうかも「強固」には必要だろ
151デフォルトの名無しさん:2010/04/24(土) 04:27:44
flashは基本的に
「三角形を左へ100ドット、100フレームかけて移動せよ」
みたいなデータの集合だから、
よほど複雑なアニメーションでもなけりゃ、10分でもオンメモリ余裕だと思う。
152デフォルトの名無しさん:2010/04/24(土) 06:29:10
コンストラクタに可変個のstring渡す方法無いですか。
もしくは、("aaa", "bbb", "ccc")が自動で
vector<string> へ変換させられる方法とか。
153デフォルトの名無しさん:2010/04/24(土) 06:38:01
自己解決。こんな関数を挟むことにしました。

#define tovecstring(...) tovecstring_sub(__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*);
char *ch;
std::vector<std::string> x;
while((ch=va_arg(L, char*))!=0) x.push_back(ch);
va_end(L);
return x; }
154デフォルトの名無しさん:2010/04/24(土) 07:19:59
こっちのほうがいいや

#define tov(...) tovecstring_sub( "",__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *tmp, ...){
std::vector<std::string> x;
char *p;
va_list L;
va_start(L, tmp);
while((p=va_arg(L, char*))!=0) x.push_back(p);
va_end(L);
return x; }
155デフォルトの名無しさん:2010/04/24(土) 07:44:44
stlのmultimapとmapの要素をvectorにしたのはどっちが挿入が早いですか?
156デフォルトの名無しさん:2010/04/24(土) 08:46:48
ここで訊くより自分で測った方がよほど早いんじゃ?
157デフォルトの名無しさん:2010/04/24(土) 12:28:25
「線形時間」とか言われても具体的な係数は決まってないしな
158デフォルトの名無しさん:2010/04/24(土) 12:35:07
>>157
あるよね。
O(n^2)のはずなのにO(n)より早えぇよとか。
たぶんnがでかけりゃ逆なんだろうが。
159デフォルトの名無しさん:2010/04/24(土) 14:20:39
良く多倍長整数がうんぬんって話になると
Fast Fourier Transformは実はそこまで早くないとかあるらしいね。
nがそこそこなうちはカラツバ法が良いとか。
160デフォルトの名無しさん:2010/04/24(土) 14:44:29
すみません。

string str[]={"aaa", "bbb"}; を
関数を使ってvector<string>にするにはどうすればいいですか。

string*を引数にするとサイズデータが無くなるんですが。
161デフォルトの名無しさん:2010/04/24(土) 14:58:14
template <unsigned N> vector<string> make_strvec(const string (&a)[N])
{
return vector<string>(a, a + N);
}
162デフォルトの名無しさん:2010/04/24(土) 15:01:26
サンクス
163デフォルトの名無しさん:2010/04/24(土) 15:01:48
Boostありなら、

#include <iterator>
#include <algorithm>
#include <boost/range.hpp>

string str[]={"aaa", "bbb"};
vector<string> v;
std::copy(std::back_inserter(v), boost::begin(str), boost::end(str));
164デフォルトの名無しさん:2010/04/24(土) 15:02:50
copyの引数まちがえた。

std::copy(boost::begin(str), boost::end(str), std::back_inserter(v));
165デフォルトの名無しさん:2010/04/24(土) 15:07:17
コンパイルできないんでこうしましたよ

template <unsigned N> vector<string> make_strvec( string (&a)[N] )
{
int n;
vector<string> x;
for(n=0; n<N; n++) x.push_back(a[n]);
return x;
}
166デフォルトの名無しさん:2010/04/24(土) 15:15:01
すまん自分で確認してなかった
コンパイル出来なかったか
何がダメなんだろう
167デフォルトの名無しさん:2010/04/24(土) 15:19:38
横だが、最初のコードでコンパイルできたよ。
@VC9
168デフォルトの名無しさん:2010/04/24(土) 15:37:35
>>164

BCC6.2.1だがコンパイルして走ったよ
169デフォルトの名無しさん:2010/04/24(土) 15:51:23
string str_table[] = { "aaa", "bbb" };
size_t num_str = sizeof(str_table) / sizeof(str_table[0]);

vector<string> v( str_table, str_table + num_str );

v.assign( str_table, str_table + num_str );
170デフォルトの名無しさん:2010/04/24(土) 17:03:55
stringのインスタンスのsizeofは何を返すんだろうな
例えば>>169で文字列の長さが違っていても動くかな
171デフォルトの名無しさん:2010/04/24(土) 17:08:31
おまえは何を言ってるんだ?
172デフォルトの名無しさん:2010/04/24(土) 17:09:38
stringのインスタンスのサイズに決まっているだろう
可変長構造体でもあるまいし
173デフォルトの名無しさん:2010/04/24(土) 17:47:11
なんでオーバーロード解決の候補にprivateなメンバ関数が入るんだコラァ!
174デフォルトの名無しさん:2010/04/24(土) 17:49:16
ディスパッチしたいときとか、いろいろあるだろJK
175デフォルトの名無しさん:2010/04/24(土) 20:28:52
友達がいるかもしれないからな。
176デフォルトの名無しさん:2010/04/24(土) 20:39:08
え・・・・・
177デフォルトの名無しさん:2010/04/24(土) 23:15:35
C言語を呼び出す時の、extern "C"の"C"って何?
178デフォルトの名無しさん:2010/04/24(土) 23:20:05
Bの次だからC
179デフォルトの名無しさん:2010/04/24(土) 23:21:46
C言語の"C"だろJK
180177:2010/04/24(土) 23:30:41
あっそうなの
181デフォルトの名無しさん:2010/04/24(土) 23:32:32
規格で定められているもうひとつは extern "C++" で、これがデフォルト。
182デフォルトの名無しさん:2010/04/24(土) 23:34:36
へぇ"C++"もあるんだ
どんなふうに使うんだろうね
183デフォルトの名無しさん:2010/04/24(土) 23:39:06
マクロで切り替えるとか・・・?

使わないな
184デフォルトの名無しさん:2010/04/25(日) 00:01:02
というか、extern "Pascal"だったり extern "Ruby" だったりができてないだけ
185デフォルトの名無しさん:2010/04/25(日) 00:09:48
多くの現実のコンパイラが、その目的のために採用したのは、
extern "hogehoge"じゃなくて、独自の指定子だったからな。
VCの__stdcallとか
186デフォルトの名無しさん:2010/04/25(日) 00:11:16
extern な場合だけじゃないしなあ
187デフォルトの名無しさん:2010/04/25(日) 00:44:42
基本的なことですみません
配列の演算子をオーバーロードしたいのですが、
T & foo::operator[](int idx)
とかやってるとします。
ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
例外を投げる?

カラッポのTをつくって返す?っていっても無理矢理なんか帰しても無意味だから
やっぱり例外かな。。
188デフォルトの名無しさん:2010/04/25(日) 00:46:23
非constの参照を返すなら、空っぽのTを作って返すのはマズいんじゃ?
189デフォルトの名無しさん:2010/04/25(日) 00:47:18
>>187
俺は基本的にはstd::out_of_rangeすろーかな。
190デフォルトの名無しさん:2010/04/25(日) 00:48:55
ありがとうございます
例外投げます!
191デフォルトの名無しさん:2010/04/25(日) 00:50:20
>>187
かのScott Meyersの名言
「intの様に振る舞え」
って知らない?


> ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
intの配列でそれをやったら未定義の動作だから、
基本的にはその状況は考えないで何をやっても責められないとは思うが、

> 例外を投げる?
現実的にはそれが親切だと思う。
投げるクラスはstd::out_of_rangeまたはそれを継承したクラスを投げましょう。

> カラッポのTをつくって返す?
それは最悪の選択。
返却値の型は T & なんだろ?
テンポラリオブジェクトへの参照を返すつもりなの?
192デフォルトの名無しさん:2010/04/25(日) 00:56:20
俺ならassertするかも
std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
193デフォルトの名無しさん:2010/04/25(日) 01:15:22
これ超分かりやすいんだけど
http://shota356.blog91.fc2.com/blog-entry-707.html
194191:2010/04/25(日) 01:24:49
>>192
> 俺ならassertするかも
俺もそれ言おうとしたが、
assertはデバッグビルドで削除されるってことを
思い出して止めた。

> std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
うむ。
たぶんSTLに準拠すると喜ばれると思う。
195デフォルトの名無しさん:2010/04/25(日) 01:28:52
>>193
そう・・・かな・・・ぁ。
まあ説明は人によってウケが違うしな。
196デフォルトの名無しさん:2010/04/25(日) 02:17:24
宣伝だろ
197デフォルトの名無しさん:2010/04/25(日) 10:00:53
>>194
逆!逆!
リリースビルドで削除だ
198191:2010/04/25(日) 10:47:18
>>197
ああごめん逆ったw
199デフォルトの名無しさん:2010/04/25(日) 11:26:26
ポリシーで例外を投げるかアサートするか無効なオブジェクトを返すかその他にするか選択できるようにすればいい
200デフォルトの名無しさん:2010/04/25(日) 11:27:37
operator[] にポリシーねえ
かといって、クラスレベルでポリシー設定したんじゃ粗すぎるし
201デフォルトの名無しさん:2010/04/25(日) 12:13:48
無効値オブジェクトとか*NULLの参照とかって大抵ろくなことにならないけど使いたがる奴多いよな
なんで?
202デフォルトの名無しさん:2010/04/25(日) 12:31:43
Null Objectパターンに近いようなそうでもないような
203デフォルトの名無しさん:2010/04/25(日) 12:33:11
やっぱ近くないな
204デフォルトの名無しさん:2010/04/25(日) 14:30:31
>>201
クソ設計だけど、もうそうするしかないほど追い詰められている時に
「とりあえず動けばいいんだよ!早く作り終えないとけないし!」
ってなった結果じゃないかな?
205デフォルトの名無しさん:2010/04/25(日) 14:44:08
誰もがいつでも例外を投げれていい環境で働いてるワケじゃないんだぜ
206デフォルトの名無しさん:2010/04/25(日) 15:10:07
>>205
あー、なるほどね。
・・・その場合、Boostとか使えないの?
例えばboost::lexical_cast<std::string>()とかどうするの?
例外を投げないオプションとかあるのかな?
207デフォルトの名無しさん:2010/04/25(日) 15:15:53
あれだ
goっぽくtupleでも返すとか
208デフォルトの名無しさん:2010/04/25(日) 15:16:02
GoogleだとboostどころかSTLも禁止じゃなかったっけ
bad_allocとかout_of_rangeとか投げるから
そういうとこだと完全に独自ライブラリ
209デフォルトの名無しさん:2010/04/25(日) 15:19:21
例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ?
よく聞く話だけど、そこら辺まで考えての判断なのか疑問だね。
210デフォルトの名無しさん:2010/04/25(日) 15:22:04
例外を使わない過去の資産との相性が悪いからと聞いている
211デフォルトの名無しさん:2010/04/25(日) 15:30:48
>>208
まじかよ
boostやSTLを廃止したら生産性が下がるだろ。

Googleの躍進を見ていると、それを感じさせないほどの
Google独自ライブラリがあるのだろうかね。
212デフォルトの名無しさん:2010/04/25(日) 15:32:01
全部例外じゃなくエラー返すようにした
完成度の高いライブラリでも持ってんじゃない
213211:2010/04/25(日) 15:46:11
>>212
でも結構オープンソース開発をしているよな。
そのライブラリの一部も公開しているのだろうか。
214デフォルトの名無しさん:2010/04/25(日) 15:52:57
>>209
> 例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ?
なるほど。
newは当然のごとく禁止ってのはわかる。
さらにConstructorで失敗した時に例外禁止だとどうしようもないから
init()
メンバを用意する訳か。

ほー。
215デフォルトの名無しさん:2010/04/25(日) 15:59:18
デストラクタはあるからCの時ほどはつらい制限ではないけどね
216デフォルトの名無しさん:2010/04/25(日) 16:02:05
initメンバなくてもis_valid的なメソッド有ればええんちゃうの?
217デフォルトの名無しさん:2010/04/25(日) 16:10:44
valid であると判定できないといけないのは面倒くさい気がする
初期化済みフラグをいちいち導入する必要があったりとか
218デフォルトの名無しさん:2010/04/25(日) 16:13:27
>>216
まぁね。

new(nothrow) した後 valid じゃない場合は即座に delete するファクトリメソッドを
用意すれば使う側の負担にもならない。これが害の最も少ない対処法だと思う。

例外使ったほうがずっと良いんだけどね。
219デフォルトの名無しさん:2010/04/25(日) 16:23:18
可変個引数テンプレートがないと根本的な解決には
220デフォルトの名無しさん:2010/04/25(日) 16:31:19
>>219
なんのこっちゃ?
221デフォルトの名無しさん:2010/04/25(日) 16:32:59
>>217
逆に言えばbool メンバが一つ必要になる反面、
いかなる状況でもis_validを呼び出せば初期化済みかどうか
確認できるってメリットにもなるよな。

init()で初期化する方式だとそれはできない。

でも例外を使うべきだと俺は思うけどね。
222デフォルトの名無しさん:2010/04/25(日) 16:36:52
まあ、初期化済みフラグがちゃんと管理されてればな
223デフォルトの名無しさん:2010/04/25(日) 16:46:54
>>222
>ちゃんと管理されてればな
そんな手間じゃないでしょ。

メンバの
 bool 初期化済みflag;
をConstructorでfalseに設定して、initでtrueにするように設定して、
他のメンバからはいじれないようにすれば大丈夫さ。
224デフォルトの名無しさん:2010/04/25(日) 16:54:59
復旧不能なエラーが起きた場合どうするかとか
225223:2010/04/25(日) 16:57:39
> 他のメンバからはいじれないようにすれば大丈夫さ。
自分で言っててそれはつまりどうする気だと思ってきた。

初期化済み flag をメンバに持つそのためだけの基底クラス class InitFlagImpl を用意して
InitFlagImpl 中で派生クラスの init() を一個一個全て friend 指定する。
また InitFlagImpl の Default Constructor は初期化済み flag を false にセットするようにしておく。

そして派生クラスは InitFlagImpl を private 継承してやれば
派生クラスの Constructor では自動的に InitFlagImpl の Default Constructor が呼ばれるので
自動的に初期化済み flag が false にセットされ、
派生クラスの init() だけに気を配れば良い事になる。


>>224
それは初期化済みフラグには関係ない話だ。
226デフォルトの名無しさん:2010/04/25(日) 16:59:26
オブジェクトが正常でない状態になったら
is_valid は false を返すべきだと思う
227223:2010/04/25(日) 17:01:59
>>226
うむ。おっしゃるとおり。
だがそれは本質的な問題じゃないから解決は簡単だ。
上述の is_valid を is_初期化済み として読み替えてくれ。

228デフォルトの名無しさん:2010/04/25(日) 17:07:23
復旧不能な状態って初期化済みと自信を持って言えるかね
まあコンストラクタのエラーに対してのみ使う、という規約を周知するのなら
229デフォルトの名無しさん:2010/04/25(日) 17:13:15
flagの中身が破壊されるようなエラーが出たらダメだから
ちゃんとチェックメソッド書いた方がいいよね
230デフォルトの名無しさん:2010/04/25(日) 17:17:37
メモリ破壊気にするなら
flagの前後にメモリとって
そこが破壊されてるかチェックしたのでいいと思うの
231デフォルトの名無しさん:2010/04/25(日) 17:17:49
>>228
bool is_初期化済み()

bool is_valid()
があれば自信を持って言っていいと思うぜ。

>>229
>>225方式ならflagは破壊されないんじゃね?
232デフォルトの名無しさん:2010/04/25(日) 17:18:08
めんどくせー。例外投げりゃいいじゃねーか。
Google みたいな事情がおまいらのところでもあるのか?
233デフォルトの名無しさん:2010/04/25(日) 17:19:46
おい議論がおかしくなって居るぞ。

今は
1.「例外を禁止したが故に生じる問題点とその解決策」
について論じているんじゃないのか?
なのに不法なメモリー破壊の話とか、
2.「例外を禁止していようがいまいが生じる問題点」
じゃないか。

1.と2.を混同してないかい?みんな。

234デフォルトの名無しさん:2010/04/25(日) 22:52:23
かわいい映画を見に行こうと思って「テディ」を選んでしまったときの気持ち
235デフォルトの名無しさん:2010/04/25(日) 23:19:53
AMD製 CPUを搭載しているPCでコンパイルしたEXEが
Intel製 CPUを搭載しているPCでなぜ動作するのですか?

コンパイラはネイティブコードを出力するとすると、動作しないのでは?
236デフォルトの名無しさん:2010/04/25(日) 23:23:45
>>235
動作するように互換性を持たせてるからです。
http://ja.wikipedia.org/wiki/X86
http://ja.wikipedia.org/wiki/AMD64
237デフォルトの名無しさん:2010/04/25(日) 23:25:00
もちろん、IntelやAMDの独自拡張命令を使ってると
ほかのCPUでは動かなくなる
238デフォルトの名無しさん:2010/04/26(月) 01:06:47
ファンクタって何が便利なんですか?
239デフォルトの名無しさん:2010/04/26(月) 01:14:59
関数ポインタと比べると最適化されやすいあたり
240デフォルトの名無しさん:2010/04/26(月) 01:19:55
単に一時オブジェクトの関数呼んでるだけじゃなかったんですね
241デフォルトの名無しさん:2010/04/26(月) 02:10:12
何も便利とは思わんが・・・
242デフォルトの名無しさん:2010/04/26(月) 02:13:02
boost::function使い倒してからもう一度出直してこい
243デフォルトの名無しさん:2010/04/26(月) 02:43:51
>>242
今使い倒してみました
高が知れてますね
244デフォルトの名無しさん:2010/04/26(月) 02:50:19
私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです
245デフォルトの名無しさん:2010/04/26(月) 02:57:44
C++に慣れてくれば自然と使いたくなるので、無理に使う必要は無いです。
246デフォルトの名無しさん:2010/04/26(月) 06:25:02
>>235
下手にある側が、上手にある側にいやいやでも合わせて互換性を持たせる
なんてことは良くある話だ。
247デフォルトの名無しさん:2010/04/26(月) 06:26:30
>>244
> 私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです
無理に使う必要は無い。
だが使わない方が無理とは言わないまでも、不便だし
デザパタ上もまずいと思いませんか

248デフォルトの名無しさん:2010/04/26(月) 06:49:06
249デフォルトの名無しさん:2010/04/26(月) 08:23:04
レベルの高い方々はその程度のことでもカリカリして大変そうだな
250デフォルトの名無しさん:2010/04/26(月) 08:34:55
レベルが高いとかの問題じゃないでしょ。
見本となる人がこの程度の事で手を抜いてどうするの?
251デフォルトの名無しさん:2010/04/26(月) 08:39:38
いやこれは手を抜いていいだろ
252デフォルトの名無しさん:2010/04/26(月) 08:41:30
日付見てスルーしろよ
253デフォルトの名無しさん:2010/04/26(月) 08:54:16
プログラマって知的でいつも冷静沈着な人種と思ってたけど、案外沸点低いよね
254デフォルトの名無しさん:2010/04/26(月) 11:54:35
下記のように配列をまとめて代入したいのですが、良いアイディアはないですか?
char value[] = {1,2,3,4};
vallue = {5,6,7,8};
255デフォルトの名無しさん:2010/04/26(月) 12:02:20
>>254
static char const next_value[] = {5,6,7,8};
std::copy(next_value, next_value + 4, value);

さぁ不満なところを列挙してもらおうか?
256デフォルトの名無しさん:2010/04/26(月) 12:14:44
freadって
257デフォルトの名無しさん:2010/04/26(月) 12:44:56
>>256
std::fread()のことならC標準関数のそれと同じものです。
つまり、ストリームから指定バイト数の要素を指定個数読み取る関数ですね。
258デフォルトの名無しさん:2010/04/26(月) 12:55:02
enumしてもらおうか
259デフォルトの名無しさん:2010/04/26(月) 13:42:35
>>225の方式って読んでみたらかなり綺麗に見えるけど、
コンパイル通るんかいな。
260デフォルトの名無しさん:2010/04/26(月) 15:04:06
デストラクタの挙動で質問です。

すべて純粋仮想関数のメソッドを持つクラスを基底として、
継承したクラスをdeleteした際、デストラクタが呼ばれないようです。

テストは下記のように作りました。

class ITest {
public : virtual ~ITest(){};
public : virtual void Print() = 0;
};

class TestOne : public ITest {
private : char* str;

public : TestOne( char* str_ ){
str = str_;
};

public : virtual ~TestOne(){
printf( str );
str = NULL;
};

public : virtual void Print() {
printf( "ONE " );
printf( str );
};
};
261デフォルトの名無しさん:2010/04/26(月) 15:04:53
class TestTwo : public TestOne {
private : char* str;

public : TestTwo( char* str1_, char* str2_ ) : TestOne( str1_ ){
str = str2_;
}

public : virtual ~TestTwo(){
printf( str );
str = NULL;
}

public : virtual void Print() {
printf( "TWO " );
printf( str );
}
};

int _tmain( int argc, _TCHAR* argv[] ){
TestTwo* _two = new TestTwo( "1111","2222" );
TestOne* _one = _two;
ITest* _ites = _two;

_two->Print();
_one->Print();
_ites->Print();

delete _ites;

return 0;
}
262デフォルトの名無しさん:2010/04/26(月) 15:06:56
_itesをdeleteした際に、PrintTwo、PrintOneの順でデストラクタが
呼ばれることを期待しましたが、呼ばれないようです。

コンパイラはVC++2008でPSはXPのSP3です。

_oneや_twoをdeleteした場合は、
期待したとおりにデストラクタが呼ばれております。

この挙動はC++の仕様なのでしょうか?
263デフォルトの名無しさん:2010/04/26(月) 15:08:07
申し訳ありません。

class ITest は下記の物と差し替えてください。

class ITest {
public : virtual void Print() = 0;
};
264254:2010/04/26(月) 19:01:26

>>255
代入するのに2行必要なのが不満です。
その後必要ない変数next_valueが残るのが不満です。
そうではなく下のように1行で書きたいです。

value = {5,6,7,8}

どうにかして書けませんか?
265デフォルトの名無しさん:2010/04/26(月) 19:05:23
0xに移行してvector使う
266デフォルトの名無しさん:2010/04/26(月) 19:27:53
>>264
あと1年くらいでそれがコンパイル通るようになるから
しばらく待てない?
267デフォルトの名無しさん:2010/04/26(月) 19:50:30
Boost.Assign
268デフォルトの名無しさん:2010/04/26(月) 19:52:06
クラス、テンプレート駆使したらできるだろ
269デフォルトの名無しさん:2010/04/26(月) 19:52:13
>>254
strcpy(vallue,"1234")
270デフォルトの名無しさん:2010/04/26(月) 19:53:00
どうやればいいかはしらんが

value = {5,6,7,8}

はできるはずだ。
271デフォルトの名無しさん:2010/04/26(月) 20:07:00
>>269
それを書くなら、memcpy(value, "\x5\x6\x7\x8", 4)だろ。
272デフォルトの名無しさん:2010/04/26(月) 20:11:22
>>269 にプログラムを書かせると
平気でメモリ破壊するということが分かったな
273デフォルトの名無しさん:2010/04/26(月) 20:12:19
こまけーことはいいんだよ
274デフォルトの名無しさん:2010/04/26(月) 20:12:49
こまかくねーよw
275デフォルトの名無しさん:2010/04/26(月) 20:13:59
メモリ破壊どころか、値も滅茶苦茶。
276254:2010/04/26(月) 20:49:59
>>265-266
C++0xって奴ですか(本当に出るの?)
今すぐにできないならあきらめます。
全く使えない言語だ
277260 :2010/04/26(月) 20:55:46
タスケテー・・・
278デフォルトの名無しさん:2010/04/26(月) 21:06:38
>>263 の通りなら、>>260 のように基底クラス(ITest)のデストラクタを仮想にしてやらないと
基底クラスのデストラクタしか呼ばれない。
279デフォルトの名無しさん:2010/04/26(月) 21:10:13
>>276
> 全く使えない言語だ
あきらめろ。お前には無理だから。
280デフォルトの名無しさん:2010/04/26(月) 21:22:58
>>278
レスありがとうございます。
そのような挙動でしたか。

インターフェースにもvirtualのデストラクタをつけなければ、
継承した子のデストラクタもよばれないのですね・・・。

お手数おかけいたしました。
281デフォルトの名無しさん:2010/04/26(月) 21:51:31
>>280
deleteを独自に定義とかしていない限り、

struct Derived : Base
{};

Base * p = new Derived;
delete p;

としたとき、BaseがvirtualなDestructorを持っていない場合の
動作は、標準C++では未定義の動作である。

//////////////////////////////////////////////////


 struct MyContainer : std::vector<int>
 {};
でも
 std::vector<int> * p = new MyContainer;
で未定義の動作になるのは
 delete p;
とした時だけで、例えば
 delete (MyContainer*)p;
だったら未定義の動作にはならない。

あるいは
 boost::shared_ptr< std::vector<int> > * p(new MyContainer);
としても未定義の動作にはならない。


そもそもMyContainerを基底クラスのポインタに入れるということをしなければ
全然問題ないし。
282デフォルトの名無しさん:2010/04/26(月) 21:54:18
>>276
つ GCC4.4以上
283254:2010/04/26(月) 22:48:03

>>282 まじっすか。
なら4/29発売のUbuntu10.04がgcc4.4.3らしいので使えそうですね。
これは楽しみだ。gcc最高
284デフォルトの名無しさん:2010/04/26(月) 22:49:12
>>283
Ubuntuが売ってたらびっくりだわ。
・・・じゃねぇや、gccのバージョンなら今でも自分で上げられるんでは?
285デフォルトの名無しさん:2010/04/26(月) 22:52:43
その代入そんなすげえか?
286デフォルトの名無しさん:2010/04/26(月) 22:55:44
>>276みたいな低脳にいちいち教えてやるなんて
お前ら優しいな。
287デフォルトの名無しさん:2010/04/26(月) 23:05:38
>>281
そのソースを使う人のことを考えないなら確かに「全然問題ない」ね
288260:2010/04/26(月) 23:42:39
>>281
詳しい説明ありがとうございます。

動作未定義でしたか・・・。

Webの入門系しか見てなかったもので、
こういう所の動作は知りませんでした。

確かに基底クラスのポインタに入れなければ問題ないですね。

外部に提供する時にすべてvirtualのインターフェースを
返していたため、その型で保存しておりました。

考えてみれば、元の型で保存しておいて、getXXで返す型を
すべてvirtualの基底クラスにしておけばよかった事にいまさら気づきました。
289デフォルトの名無しさん:2010/04/27(火) 00:14:10
>>287
問題ないと思うけどな。
仮想デストラクタを持たないクラスを継承するなんて、
stlでもboostでも普通に使われてるじゃない。
290デフォルトの名無しさん:2010/04/27(火) 00:27:56
>>287
> そのソースを使う人のことを考えないなら確かに「全然問題ない」ね
いや、普通におかしくないだろ。
もしかして
「多態的にデザインされていないクラスのデストラクタは仮想にしない」
ってのを知らない?
デストラクタが仮想になっていたら多態的に使ってください!って言ってるようなもんじゃん。
291290:2010/04/27(火) 00:29:20
>>290
正確な日本語で言えば
×「多態的にデザインされていないクラスのデストラクタは仮想にしない」
○「継承されて基底クラスとして多態的に使用することを想定して作られていないクラスのデストラクタは仮想にしない」
だな。長いけど。
292デフォルトの名無しさん:2010/04/27(火) 00:49:32
>>289
stlは見た事無い気がするけどboostでなら当然のようにあるよ。
polymorphicに使わない基底クラスでDestructorをvirtualにするのは間違いで、
無駄にオーバーヘッドが出るだけ。
293デフォルトの名無しさん:2010/04/27(火) 01:05:32
>>292
std::unary_functionとかste::iteratorとか。

でもまあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。
>>281は単なる例だと思うから気にしなかったが、
そういう意味では>>287の言うこともわかる。
294293:2010/04/27(火) 01:07:06
ste→std
295290:2010/04/27(火) 01:12:37
>>294
あー、そっか。それがあったね。

> まあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。
うむ。おっしゃる通りで、大抵は包含すれば, だめでもprivate継承すれば十分だ。

俺は確かに例としてのためだけにstd::vectorを継承したんだけど、
>>287はそうは取らなかったってわけか。

なるほど。
296デフォルトの名無しさん:2010/04/27(火) 01:20:47
継承を前提とするクラスで非仮想デストラクタにするなら、
そのデストラクタはprotectedにすべしと、C++ Coding Standardsに書いてあったはず。
それを守ればいい。
297デフォルトの名無しさん:2010/04/27(火) 14:05:55
>>296
それだと継承してない場合にその基底クラスを使えないんじゃないか?
298デフォルトの名無しさん:2010/04/27(火) 14:10:54
>>297
「継承を前提とするクラス」
むしろ使えないようにしといた方がいいという場合のこと
299デフォルトの名無しさん:2010/04/27(火) 15:01:51
C++使って趣味でゲームプログラミングしてる人って結構いるもんなの?
300デフォルトの名無しさん:2010/04/27(火) 15:19:28
>>299
結構いるかはしらないけど俺の周囲には俺も含め3人いる
皆別々の作品を作っているよ
301デフォルトの名無しさん:2010/04/27(火) 15:25:01
>>300
俺の周囲・・・っていうとサークル所属か何かかな?
もし良かったら、各々が作ってるジャンルと深さ(エンジンまで作ってるとか、そこまでじゃないけど制作用ツールは作ってるとか色々)を教えて欲しいな
302デフォルトの名無しさん:2010/04/27(火) 15:30:42
制作用ツールってなんだろ。
303デフォルトの名無しさん:2010/04/27(火) 15:33:02
C++でゲームプログラミングか。Mですなぁ。

なんかもっと、こう 簡単に作れそうなframeworkとかないのかね。
304301:2010/04/27(火) 15:35:47
>>302
開発が楽になるような自分用ツール。
305デフォルトの名無しさん:2010/04/27(火) 15:36:50
サークルとかじゃないよ
俺->日曜プログラマー MMORPGのサーバサイドの処理をC++で作成中
友人->趣味としてWindowsのシューティングを作っている 本職もゲーム屋さん
友人の友人(俺の知人)->大学生 今は3D関連のライブラリーだかエンジンだか作っている。俺3D弱いから彼が何言っているかよく理解出来ないw

306301:2010/04/27(火) 15:44:00
>>305
THX
っていうか凄い人達だな。何だその繋がりwwどこで知り合ったんだ?
俺も大学生だけど経済学科だし、3Dのライブラリとかエンジン作るとか夢のまた夢って感じだ・・・・
307デフォルトの名無しさん:2010/04/27(火) 17:11:33
横槍レスだけど

>>306
まあもしゲームをC++で作りたい場合でも別に3Dライブラリを作る必要まではないんじゃないの?
3Dライブラリは日進月歩だし、自分でライブラリレベルから作ってたらたぶんゲームが完成しないw
既にある優秀なライブラリを借りればいいじゃないの。
308デフォルトの名無しさん:2010/04/27(火) 18:58:41
関数テンプレートのプロトタイプ宣言ってどうすんの?
必要ないの?
309デフォルトの名無しさん:2010/04/27(火) 18:59:16
必要は無いけど、書ける
普通に定義したものの { } をなくせばいいだけ
310デフォルトの名無しさん:2010/04/27(火) 19:16:27
>>309
サンクス
311デフォルトの名無しさん:2010/04/27(火) 19:26:20
>>307
DXやGLレベルのことじゃなくて、それらを使った便利オレオレラッパーとかのことじゃねえかな。
312307:2010/04/27(火) 19:57:53
>>311
あーびっくりした。
そうだよな、OpenGLレベルを自力で書ける大学生とか
もう卒業待たずにGoogleに入れるレベル。
313デフォルトの名無しさん:2010/04/27(火) 20:19:25
>>312
膨大なだけで根性さえあればかけると思われ・・・
314デフォルトの名無しさん:2010/04/27(火) 20:21:16
そんな根性ある学生が居るならうちで雇いたい
315デフォルトの名無しさん:2010/04/27(火) 20:21:47
ハードウェアサポートなしなら作れるんじゃない?
時間さえあれば
316デフォルトの名無しさん:2010/04/27(火) 20:27:43
>>315
やるならもちろんソフトウェアレンダでしょうね。

15年昔ならアセンブラで手書きとかがあったよね。
グラボ会社も資料出してくれてたこともあったし。
317デフォルトの名無しさん:2010/04/27(火) 20:32:45
Mesaと同レベルの物をスクラッチから書くなら応援するわ。
どれくらい意味があるかは分からんが。
318デフォルトの名無しさん:2010/04/27(火) 20:56:35
まて、例え出たとしても超えなきゃ意味ないしバグが取れるまで…(ry
とか考えると、やっぱり便利なラッパを書いてくれる方がうれしいな。
319デフォルトの名無しさん:2010/04/27(火) 23:07:14
iostreamとSTLについての質問です。

標準入力から読み込んだ英文を単語毎に分解する目的で、
よく以下のようなコードを見かけるし使うのですが、

cout << "Please input strings : ";
istream_iterator<string> start(cin);
istream_iterator end;
vector<string> v(start, end);

これを複数回繰り返す方法がよくわかりません。
#正確に書くとこのコードの後に普通にcinから読み込ませる方法を知りたい
上記コードに続けて、

cout << "Please input strings again : ";
cin.clear();
vector<string> v2(++start, end);

とするとWindowsXP(MinGW)の環境では意図した通りに再度入力できるのですが、
FreeBSD上のgcc環境で試したところcinから何も読み込まずにv2に空vectorが出来ます。
#cin.clear()が無いときと同じ動作
何とか移植性のある方法は無いものでしょうか。
320デフォルトの名無しさん:2010/04/27(火) 23:37:00
cin.seekg(0); したらいけた
321 ◆QZaw55cn4c :2010/04/27(火) 23:43:04
すみません STL を勉強しているところですが、
gcc-4 では、教科書の次のコードがコンパイルできません。
(bcc32 ではコンパイル・実行とも問題がありません。)
コード上で問題はありますでしょうか?

http://codepad.org/SyLoUb14

よろしくお願いいたします。
322デフォルトの名無しさん:2010/04/27(火) 23:47:34
sinは現在オーバーロードされてるので、
どれを使っていいのか分からないというエラーになる
目的の関数ポインタ型でキャストするか、
テンプレート引数を明示的に与えるといいのだが、
transformでテンプレート引数を明示的に与えるのは面倒臭いので、キャストがベスト
323デフォルトの名無しさん:2010/04/27(火) 23:50:17
>>321
ご丁寧に unresolved overloaded function type って書かれてます
つまり、sinがオーバーロードされてるのでどれを使ったらいいか分からないということ
324デフォルトの名無しさん:2010/04/27(火) 23:58:55
Line 19: error: no matching function for call to
'transform(
  __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
    __gnu_debug_def::deque<double, std::allocator<double> > >,
  __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
    __gnu_debug_def::deque<double, std::allocator<double> > >,
  __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
    __gnu_debug_def::deque<double, std::allocator<double> > >,
  <unresolved overloaded function type>
)'
compilation terminated due to -Wfatal-errors.

まだ悪夢には程遠いけど、やっぱ見づらいな
325デフォルトの名無しさん:2010/04/28(水) 00:00:16
>>321
>>322
ありがとうございます。これでコンパイル・実行ともできました。
transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin);
326325:2010/04/28(水) 00:01:58
すみません
>>322 >>323 でした。
的確な回答ありがとうございました。
327デフォルトの名無しさん:2010/04/28(水) 00:02:42
横槍だけど
>>322-323
sin(0.3)とかはstd::sin(double)が他より優先的にマッチするから
オーバーロード解決が問題じゃないのでは?

VC2008ではコンパイル&リンクできて
C:\>aaaaa.exe
0.1:0.0998334
0.2:0.198669
0.3:0.29552
0.4:0.389418
0.5:0.479426
ってなったよ?
328デフォルトの名無しさん:2010/04/28(水) 00:06:22
Comeau C++では


Comeau C++では

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 19: error: no instance of overloaded function "transform"
matches the argument list
The argument types that you used are: (std::_Deque_iterator<double, double &, double
*>, std::_Deque_iterator<double, double &, double *>,
std::_Deque_iterator<double, double &, double *>,
<unknown-type>)
transform(radians.begin(), radians.end(), sines.begin(), sin);
^

"ComeauTest.c", line 9: warning: variable "n" was declared but never referenced
double n;
^

1 error detected in the compilation of "ComeauTest.c".

ってなったわ。
つまりなんなんだ????
329デフォルトの名無しさん:2010/04/28(水) 00:10:10
>>327
テンプレート引数は
関数テンプレートの引数のみの情報から推論できないといけない
関数テンプレートの中の処理なんて一切見ない
transformのテンプレート引数を見れば、推論不可能なことが分かる
330デフォルトの名無しさん:2010/04/28(水) 00:12:53
わかり易い例
http://codepad.org/XutU6qLk
331327:2010/04/28(水) 00:17:48
>>329-330
ほー、ありがとう。
今 gcc と VCの<algorithm>を漁って定義を確認してきたところ。
おっしゃる通りでございました。

ありがとうございました。
332デフォルトの名無しさん:2010/04/28(水) 00:31:29
イテレータじゃなくてポインタ使ってるなら推論効くけどね
イテレータ使ってるってのがポイントなのよね
333デフォルトの名無しさん:2010/04/28(水) 00:33:38
transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin);
って関数ポインタにキャストしているように見えるんだけど、
最適化の障害になったりはしないの?
334デフォルトの名無しさん:2010/04/28(水) 00:35:02
つまり今回は
テンプレート引数の推論の問題であって
Overload Resolutionの問題ではないということか。
ややこしや
335デフォルトの名無しさん:2010/04/28(水) 00:37:41
336デフォルトの名無しさん:2010/04/28(水) 00:41:43
もしtransformの定義がtransform(T*, T*, T(*)(T))ならって話
337デフォルトの名無しさん:2010/04/28(水) 00:43:38
>>333
double(*p)(double) = sin;
のpと同じ一時オブジェクトを作る意味になるから
やってることはオーバーロードの選択
338デフォルトの名無しさん:2010/04/28(水) 00:49:25
オーバーロードの選択でキャストするのって面倒臭いよね
長くなるし、いちいち typedef するのもめどい
339デフォルトの名無しさん:2010/04/28(水) 00:53:04

while(1) {
Hoge h;

func(&h);
}

funcに渡されるアドレスって毎回同じインスタンスですよね?
340デフォルトの名無しさん:2010/04/28(水) 00:54:07
いいえ毎回新品です
341デフォルトの名無しさん:2010/04/28(水) 00:54:53
毎回新しく作られる
普通は同じアドレスだろうけど、そう保証されているわけではない
とりあえずコンストラクタとデストラクタはループごとに毎回呼ばれる
342デフォルトの名無しさん:2010/04/28(水) 01:00:44
>>339
なぜそう思う。
むしろ違うと思うのが自然では?

例えば
while(1) {
Hoge h;
hをいじる。
func(&h);
}
だったとして、次のループのhが前回hをいじった結果を継承していたらおかしいでしょ?
なぜおかしいかというと、}のところで一回スコープから外れているんだから
hはデストラクトされているわけだ。
343デフォルトの名無しさん:2010/04/28(水) 01:02:32
>>342
C言語だと同じなのですが....
344デフォルトの名無しさん:2010/04/28(水) 01:06:10
割り当てされるメモリ上のアドレスは同じでも「インスタンス」は別。
345デフォルトの名無しさん:2010/04/28(水) 01:06:46
>>343
C言語で同じ事が規格で保証されているってこと?
そんなこと無いでしょ。

C++だって同じになるかもしれないけど、同じにならないかもしれない。
規格ではどっちでも良い事になっている。
346デフォルトの名無しさん:2010/04/28(水) 01:08:21
>>345
規格ではどっちでもいいけど
実装は同じになるのですが

347デフォルトの名無しさん:2010/04/28(水) 01:13:37
>>346
結局何を聞きたいの?

> 規格ではどっちでもいいけど
> 実装は同じになるのですが
そういう実装なんだろ?
コンパイラのマニュアルでそう保証されているの?
それとも今のところ一緒ってだけ?
348デフォルトの名無しさん:2010/04/28(水) 01:17:39
>>347
こうゆう書き方ってまずいのか
よくわからなくて

こまってます
349デフォルトの名無しさん:2010/04/28(水) 01:19:21
同じhをいじり続けたいなら
Hoge h;
while(1) {
func(&h);
}
でいいじゃないか
350347:2010/04/28(水) 01:23:41
>>348
まずいかどうかはfuncを君がどう定義しているかによる。
funcはhが次の4パターンのどれを期待しているの?

1.常に同じオブジェクトかつ同じアドレスが必要 -> >>349が言っている通り。
2.常に同じオブジェクトかつ違うアドレスが必要 -> 言ってる事が矛盾している。
3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。 -> 君のコードのままでおk。
4.毎回新しいオブジェクトが必要かつアドレスは同じでないとやだ。 -> 配置構文newを使うしかないと思う。

351347:2010/04/28(水) 01:24:57
ねるわ。
もしパターン4を期待しているなら誰かが 配置構文newを教えてくれるよ。
352デフォルトの名無しさん:2010/04/28(水) 01:28:38
ちょっと待って、そもそもCで変数の途中宣言って出来たっけ
353デフォルトの名無しさん:2010/04/28(水) 01:28:51
>>350
3が保証できればそれでいいのですが

例えば、funcの中でスレッドを生成し
hを渡す場合も保証できるのかなぁって
心配です。



354デフォルトの名無しさん:2010/04/28(水) 01:29:27
4はオブジェクトを初期化するメンバ関数でもいいんじゃないか?
355デフォルトの名無しさん:2010/04/28(水) 01:33:27
C99
356347:2010/04/28(水) 01:35:08
>>352
最近のCはできる。

>>353


>>354
Hogeの作者が作ってくれていればそれでOKだね。
あるいはHoge h = Hoge()で初期化同然に動作する仕様になっていればそれでもOKか。
357347:2010/04/28(水) 01:37:21
>>353
> 3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。
は保証できるだろ。

だが君が言っている
> funcの中でスレッドを生成しhを渡す場合
ってのが謎だが、

while(1) {
Hoge h;
func(&h);
}<-制御がココに達した瞬間にhは破棄されるため別スレッドがこの&hにアクセスしないこと

っていう条件が必要。

358デフォルトの名無しさん:2010/04/28(水) 01:38:36
もうバカは放っておいていいんじゃないか?

規格と実装の区別も付かないどころかスコープも理解していないのに
スレッドとか言っちゃうやつにC/C++プログラミングは不可能!

これ、結論でOK。↑↑
359デフォルトの名無しさん:2010/04/28(水) 01:46:18
C言語を知っているようなことを言っているが、
良く良く突っ込んでみると確かにC言語すらあやしいようだしな。

360デフォルトの名無しさん:2010/04/28(水) 01:47:28
配置構文newとかwww
知識では某書で見た事ある程度だが使った事ねぇw

361デフォルトの名無しさん:2010/04/28(水) 01:48:19
>>353
ローカル変数のアドレスをスレッドに渡すのはやめとけ。
グローバル変数か、newで確保したオブジェクトか、どっちかのアドレスを渡すほうがいい。
newで確保することにした場合はdeleteを忘れないように。
362デフォルトの名無しさん:2010/04/28(水) 02:02:13
最適化して外に出されてない限り、たまたま同じアドレスに配置されただけなんじゃないの?
363デフォルトの名無しさん:2010/04/28(水) 02:03:55
>>356
今回の記述が許されないCってどのC?
364デフォルトの名無しさん:2010/04/28(水) 02:19:06
> そもそもCで変数の途中宣言って出来たっけ

> 最近のCはできる。

↑のC99?の話と
>>339のブロックの先頭で変数を宣言するってのは別件でしょ
>>352がC言語の事あまり詳しく知らないだけなんだと思うけど
365デフォルトの名無しさん:2010/04/28(水) 14:05:59
配置構文newってこれか!

C++編(言語解説) 第36章 placement new
ttp://www.geocities.jp/ky_webid/cpp/language/036.html

うへぁ
366デフォルトの名無しさん:2010/04/28(水) 15:29:50
流し読みしただけだけど、newのオーバーロードってことかいな?
367デフォルトの名無しさん:2010/04/28(水) 15:36:50
>>366
それは分かった事にならんだろ。
自前で定義したnewとは違う意味ですよ?
368デフォルトの名無しさん:2010/04/28(水) 17:34:55
>>366
普通のnewはメモリ確保も込みだけど、既に確保されている領域に
インスタンスを構築するのがplacement newってだけだよ。
369デフォルトの名無しさん:2010/04/28(水) 17:45:22
placement newってイマイチよく分からんないから
newのオーバーロードで配列プールを返すようにしてるんだけど
やっぱりplacement newを使った方がいいんだろうか
370デフォルトの名無しさん:2010/04/28(水) 18:07:24
どうやってコンストラクタ走らせてるんだろう?
371デフォルトの名無しさん:2010/04/28(水) 20:06:24
>>367
まあ、規格的には 引数付きのnew=配置new なんだけどな
コンストラクタを呼ぶだけのものを指す事が多いし、それが語源なんだろうけど
372デフォルトの名無しさん:2010/04/29(木) 01:40:31
>>370
いや走るだろ。
配列プール作成したときと、newされたときで、2回走ることになるが。
373デフォルトの名無しさん:2010/04/29(木) 02:06:05
え、二回も走らんでしょ
374デフォルトの名無しさん:2010/04/29(木) 02:31:31
クラスの配列作ってんじゃないだろうね
普通型無しのメモリ領域に対して使うんだが

void* p = operator new(n * sizeof(A));
A* pa = (A*)p;
for (int i = 0; i < n; ++i) {
 new(&pa[i]) A; // ここでのみコンストラクタが呼ばれる
}

...使う...

for (int i = 0; i < n; ++i) {
 pa[i].~A(); // ここでのみデストラクタが呼ばれる
}
operator delete(p);
375デフォルトの名無しさん:2010/04/29(木) 18:19:00
>>374
>new(&pa[i]) A;
これってplacement newじゃないの?
376デフォルトの名無しさん:2010/04/29(木) 22:24:07
配置構文newが大人気だな。
このスレで過去に出て来たのはいつだろうと思うくらい前だろうに。
377デフォルトの名無しさん:2010/04/30(金) 03:27:35
配置構文newなんてメモリ節約の基本だろ。人気も何もない。必須。
378デフォルトの名無しさん:2010/04/30(金) 03:31:02
(゚Д゚)ハァ?
メモリ節約したいならC言語使えばいいじゃん
オブジェクト指向の恩恵を受けるんだから多少のオーバーヘッドとか無駄とか我慢しろよ!

と無駄に煽ってみるテスト
379デフォルトの名無しさん:2010/04/30(金) 03:33:23
現実問題C言語は低機能過ぎて使いにくい。
というか配置構文newのどこがだめなの?これ使ってもオブジェクト指向の恩恵を十分受けられるだろ。
380デフォルトの名無しさん:2010/04/30(金) 03:46:53
配置newのメリットって速度だと思ってたんだけど・・・。
381デフォルトの名無しさん:2010/04/30(金) 11:14:28
配置newって、渡すメモリ領域の大きさを考慮してもらえるのだろうか・・・
382デフォルトの名無しさん:2010/04/30(金) 11:24:25
>>380
newって速いの?
383デフォルトの名無しさん:2010/04/30(金) 11:40:04
メンバ変数をpublicにすると、いけないらしいのですが、
わざわざ{ return メンバ変数;}なんてメソッド呼んでたら
遅くなりませんか?
384デフォルトの名無しさん:2010/04/30(金) 11:42:26
>>383 気にすんな。 心配するほど遅くならない。
385デフォルトの名無しさん:2010/04/30(金) 11:52:35
>>383 速度は実測が基本
386デフォルトの名無しさん:2010/04/30(金) 12:34:12
配置newはコンテナを作るときに必要になるんだよ。
速度のために使うこともあるだろうけど。
>>381
考慮されないよ。メモリを正しく確保するのは呼び出し側の義務。
387デフォルトの名無しさん:2010/04/30(金) 12:45:34
>>383
そのメンバ関数を別の翻訳単位にしていなければ、
コンパイラの最適化でインライン展開されて事実上、
全く同じコードになる。
おまけに、デバッグ時にはメンバ関数でトラップを張ったり
ログ出力したりと、効率よく対処できる。
それなりに大きなクラスならpublicメンバをデバッグするより
トータルコストが抑えられる場合が多いと思われる。
もし仮に、ほんの僅かなパフォーマンスさえ気にするのであれば、
一旦完成させた後に実測した上で、必要に応じてpublicにすればいい。
388デフォルトの名無しさん:2010/04/30(金) 12:50:14
>>380
>>381
例えばMSVCのnewの実装を見てみるといい。あれは中でmallocをOSから応答があるまでwhile(true)で待ってるだけだから。(マルチスレッドでコンパイルしたプログラムは知らん)
そういう意味で確保済みのメモリ領域をOSの処理にまで委ねなくても再利用できる点では優秀だし、カスタムアロケータを使っている場合はプールで高速化を図る時に
統計的な裏づけを元にOSではなくプログラムがメモリを管理するのだから配置newがあって当然だと言える。
389デフォルトの名無しさん:2010/04/30(金) 13:37:41
ハイチ乳
390デフォルトの名無しさん:2010/04/30(金) 15:05:50
mallocはアロケートかわいい
391デフォルトの名無しさん:2010/04/30(金) 15:25:12
配置構文new でメモリって節約できるんですか?
基本らしいですが何故節約になるのかわかりません。

392デフォルトの名無しさん:2010/04/30(金) 15:26:44
趣味でC++を勉強してる人、C++を勉強する目的って何?
393デフォルトの名無しさん:2010/04/30(金) 15:29:34
new HogeHogeType; ← クラスのコンストラクタに加えOSのAPIを呼び出したりするからデバッグでスタックの余裕がないと大変
new(ptr) HogeHogeType; ← HogeHogeTypeのコンストラクタしか走らないので余裕がなくてもそれなりに使える。ただしHogeHogeTypeの中でスタック浪費してると論外
394デフォルトの名無しさん:2010/04/30(金) 15:33:21
shared_ptrってboostのとstd::tr1のとどっちが良いの?
395デフォルトの名無しさん:2010/04/30(金) 16:06:06
配置newすると普通のnewよりはやくなるの?っていうか、普通のnew遅いよね
396デフォルトの名無しさん:2010/04/30(金) 16:24:57
>>395
普通のnewが何をするか分かってる?
ネックになってるのはメモリ管理だからplacement newみたいに既存のメモリ空間にコンストラクタを走らせるだけなら速くも遅くもないけど。
397デフォルトの名無しさん:2010/04/30(金) 16:27:05
再配置newの方が早い。メモリアロケートしないから。
398デフォルトの名無しさん:2010/04/30(金) 16:41:41
”仕事が開始してから終了するまでの時間だけでいえば”
普通のnewの作業
=メモリアロケート作業+配置構文newの作業

である以上、そりゃもちろん配置構文newのが
普通のnewよりずっと早いさ。

だが仕事の内容が違う以上、どっちが早いとか論じるのはおかしい。
399デフォルトの名無しさん:2010/04/30(金) 16:43:18
>>391
> 基本らしいですが何故節約になるのかわかりません。
節約にはならないだろう。
普通にコンストラクタを起動するだけなのだから。
もしかしたら>>377を読んで思ったのかもしれないが、
誰も指摘していないだけで>>377は普通に間違っているから
鵜呑みにしてはならない。
400デフォルトの名無しさん:2010/04/30(金) 18:12:29
配置newした場所にまた配置newしたら、後にnewした内容で初期化される?
頻繁にnewする必要がある場合、どうしたら早くなるだろうか。
401デフォルトの名無しさん:2010/04/30(金) 18:18:27
g++ (GCC) 4.2.1
のコードに
#include <stdio.h>
こんなのがあったんですが、どういう意味デツカ
402デフォルトの名無しさん:2010/04/30(金) 18:19:16
>>401
その部分にstdio.hの内容をコピペするって意味。
403デフォルトの名無しさん:2010/04/30(金) 18:26:41
>>400
配置newしたら、対応したdelete呼ばないと悪い意味で破壊されるんじゃね。
new(GlobalPool)->delete(Pointer,GlobalPool)->new(GlobalPool)->dele...
の順じゃないとだめじゃね?

利点はメモリを確保するという動作を放棄できる。
404デフォルトの名無しさん:2010/04/30(金) 18:31:42
>>402
昔からある、仕様なのでしょうか?それとも最近のC++0x 9の仕様ですか。
405デフォルトの名無しさん:2010/04/30(金) 18:33:41
もうスルーでいいよ
406デフォルトの名無しさん:2010/04/30(金) 18:37:37
>>402
ごめんなさい、firefoxのバグなのでしょうか
IE で見ると
#include <stdio.h>なのですが、firefoxでは
#include <stdio.h&gt;
&gt;この部分は半角
こうなってた、ソースコードがあったんでびっくりして聞いてしまいました。

407デフォルトの名無しさん:2010/04/30(金) 18:45:19
そりゃHTMLの特殊文字だ。C++関係ない。
HTMLスレかFirefoxスレ逝け。
408デフォルトの名無しさん:2010/04/30(金) 18:48:16
HTMLのソースで>が&gt;になってたんじゃね
409デフォルトの名無しさん:2010/04/30(金) 18:49:54
―ッ!!?

> &gt;が&amp;gt;になってたんじゃね
のまちがい
410デフォルトの名無しさん:2010/04/30(金) 20:20:29
>>404
#include <cstdio>
じゃないのが納得いかないという雰囲気でもない?
411デフォルトの名無しさん:2010/04/30(金) 20:21:50
ってごめんよー続き見てなかったよー
具体的にどのファイルか教えてもらえると助かる、、、わけでもないけど興味がある
412デフォルトの名無しさん:2010/04/30(金) 20:29:37
>>411
それは知らん。
人によって違うから。
#includeのルールに則って考えて見て。

普通はコンパイラのパスの通っているディレクトリで、
stdio.hって名前のヘッダを探せば一つしか無いと思うけど。
413デフォルトの名無しさん:2010/04/30(金) 20:58:01
いや、GCCのコードに、だろ?
414デフォルトの名無しさん:2010/04/30(金) 21:29:49
>>413
?何??

まあいいや。
415デフォルトの名無しさん:2010/04/30(金) 21:59:43
そうですね。
416デフォルトの名無しさん:2010/05/01(土) 00:28:26
>>414
>>401を読めばGCCのソースコードであることは明らか
どのファイルか教えてもらえてもよかろ
417デフォルトの名無しさん:2010/05/01(土) 02:08:31
可変引数を使うとときって、引数の総数が必要になる場合、
最初の引数に総数を自分で渡すとか、"%d"とか、総数が分かるような情報を与えないとだめなんでしたっけ?

勝手にスタックから自動計算して、”あ、引数はこんだけだな”って分かってくれるマクロとか無いんでしたっけ??
418デフォルトの名無しさん:2010/05/01(土) 02:19:17
それが必要になるようなら考え直すべき
419デフォルトの名無しさん:2010/05/01(土) 02:25:26
>>417
可変引数は使わないほうが良いよ。
420デフォルトの名無しさん:2010/05/01(土) 03:50:04
「無いんでしたっけ?」って言い方は過去にそれに関する知識を得たことをあらわす言い回しに思えるんだが、
そのときはどうだったの
421デフォルトの名無しさん:2010/05/01(土) 04:10:07
boost::preprocessorでいっぱい関数定義すれば解決するよ! するよ!

なんかあったような錯覚を覚えなくもないが、少なくとも標準ではないはず。
422デフォルトの名無しさん:2010/05/01(土) 04:55:41
あ、417です。
可変引数ってもしかして人気ないんですか?

過去に使ったのは・・・va_list apをそのままvsprintf系に食わせていたので、
それ以外は使ったこと無いかも。。
423デフォルトの名無しさん:2010/05/01(土) 05:16:44
人気ないです。
選択肢が限られるCならともかく、C++では完全にいらない子です。
たぶんregisterさんと同じぐらいかわいそうな子です。
424デフォルトの名無しさん:2010/05/01(土) 05:21:03

まじですか。
C++だとどんな風にやるのがトレンドなんですか?
425デフォルトの名無しさん:2010/05/01(土) 05:38:20
そもそも可変引数てどんなときに使うんだ?
Cならオーバーロードもデフォルト引数ないから、そういう用途で使われることがあったようだが、
それも「シンボル名は8文字まで」とかの制限があった時代の話だし。
あとはprintf,scanf系列くらいしか思いつかないが、streamで代替できるし。
426デフォルトの名無しさん:2010/05/01(土) 05:51:06
C++でprintf相当の機能でいくと
std::ostreamだと、
std::cout << a << b << c;
書式ありのboost::formatだと、
std::cout << boost::format("%d %d %d") % a % b % c;
とか、演算子オーバーロードによる連結で
可変個引数的なことをやってる。
427デフォルトの名無しさん:2010/05/01(土) 05:57:31
自分で定義したmyclassのローカルインスタンスを関数から返すと、
myclassのコピーコンストラクタがへんな引数で呼ばれるのはなんで?

myclass fuck()
{
 myclass x("hello");
 return x;
}

class myclass
{
public:
 myclass(const char * p){ppp = new char[strlen(p) + 1]; strcpy(ppp, p);}
 ~myclass();
 myclass(const myclass & x)
 {
  ppp = new char[strlen(x.ppp) + 1];    //ここでx.pppが0xCDCDCDCDなんですけど。。
  memcpy(ppp, x.ppp, strlen(x.ppp) + 1);
 }
private:
 char * ppp;
};

デストラクタにブレーク張ってるけど呼ばれてないし。。
428デフォルトの名無しさん:2010/05/01(土) 06:58:43
>>427
・再現しない、ちゃんと "hello" が返る@VC6SP6
・0xCD は、VC の Debug ビルドで新しく malloc()・new した時にそう初期化される仕様で、未初期化領域を検出する目安になる
・というか strdup() 使え
・ブレーク張ってるデストラクタとやらは何処だ
429デフォルトの名無しさん:2010/05/01(土) 09:39:17
>>428
ありがとうございます。
breakは~myclass()ではっています。
なので解放はされてないと思ってるんですが。。
もう一度良く見てみます。
430デフォルトの名無しさん:2010/05/01(土) 09:46:05
>>428
すみません、超ド単純なミスでした

myclass(const char * p){ppp = new char[strlen(p) + 1]; strcpy(ppp, p);} じゃなくて

myclass(const char * p){char * ppp = new char[strlen(p) + 1]; strcpy(ppp, p);} ってやってました・・
431デフォルトの名無しさん:2010/05/01(土) 09:48:12
>>429
> breakは~myclass()ではっています。
> なので解放はされてないと思ってるんですが。。

え、意図的にメモリリークしてるの?
意図は分からんが、そうしたいなら ~myclass(); じゃなくて ~myclass() {} と書くべき
~myclass(); だけじゃただの宣言で、定義になってない
432デフォルトの名無しさん:2010/05/01(土) 09:49:20
試しに例外禁止してやってみたら思ったよりめんどくさかった
知識もないとバグだらけにもなりそうだし素人にはお薦め出来ないな
433デフォルトの名無しさん:2010/05/01(土) 09:58:46
>>431
はしょってるだけです。
あとホントの開発コードは貼れないんで意味的に同じになるようにサラっと書いたコード(myclass)なんで
あまり深く突っ込むのは勘弁してください。。
434デフォルトの名無しさん:2010/05/01(土) 10:12:27
>>388
そのループは new_handler を呼び出すループじゃないのか?
OSからの応答をループで待つとか間抜けなコードが使われてるとはにわかに信じがたいな。
435デフォルトの名無しさん:2010/05/01(土) 10:13:30
>>433
問題の発生する最低限のコードを書き出すくらいはできるだろ
っていうか、それが質問者のマナーであり常識
でないと本来1レス程度で解決できる問題が今回の様にだらだら長引く事になる
436デフォルトの名無しさん:2010/05/01(土) 10:27:53
偉そうにw
437デフォルトの名無しさん:2010/05/01(土) 10:36:01
マは総じてスルースキルが低いからこうなる
小言言ってないで無視すればいいのに
438デフォルトの名無しさん:2010/05/01(土) 10:42:11
偉そうじゃなくて偉いんだが
439デフォルトの名無しさん:2010/05/01(土) 10:49:23
pgr
440デフォルトの名無しさん:2010/05/01(土) 11:54:12
>>424
可変長引数は、引数の個数も型もコンパイル時にチェックできないから危険なのね。
>>426のほうほうなら型がコンパイル時にチェックされる。
441デフォルトの名無しさん:2010/05/01(土) 11:54:59
少なくとも
自分以外の読者がいるという事実は気に留めておけば良いと思う。
442デフォルトの名無しさん:2010/05/01(土) 12:47:34
>>440
静的型の言語だと、簡単に可変長引数を実装できる構文って作りにくいのかな
C++0xのinitializer_listでも単一型しか受けられないし
JavaもObject[]で型チェックなしだし
443デフォルトの名無しさん:2010/05/01(土) 12:49:56
そんなあなたにvoid*
444デフォルトの名無しさん:2010/05/01(土) 12:50:33
templateで可変長もどき美味しいです
445デフォルトの名無しさん:2010/05/01(土) 13:24:23
boost::fusionで可変長もどきとか
446デフォルトの名無しさん:2010/05/01(土) 13:39:42
>>417
そのとおりです。f(...) はできない。
447デフォルトの名無しさん:2010/05/01(土) 14:40:29
sizeof(bool) が1みたいですが、
true false
しかないのに、なぜに1バイトも占有するのでしょうか?
448デフォルトの名無しさん:2010/05/01(土) 14:42:10
1bitだけ確保したらalignmentがめちゃくちゃになるから
449デフォルトの名無しさん:2010/05/01(土) 14:58:24
sizeof(bool)が1っつー保証すらないが
450デフォルトの名無しさん:2010/05/01(土) 14:59:14
でもsizeof(bool)は1の倍数
451デフォルトの名無しさん:2010/05/01(土) 15:07:18
std::vector<bool> でも使ってればいいよ
C++03まで限定の命だがな
452デフォルトの名無しさん:2010/05/01(土) 15:11:41
C++0xでもvector<bool>はそのまんまだけど
453デフォルトの名無しさん:2010/05/01(土) 15:12:11
GWなのにスレが伸びるなあ
454デフォルトの名無しさん:2010/05/01(土) 15:13:28
プログラミングの勉強は、2chブラウザで常駐スレ一覧の更新をチェックしたのち、
勢いの速いスレを自動更新にしながらモニタの前に本を置いて読むに限る
455デフォルトの名無しさん:2010/05/01(土) 19:34:45
プログラミングの基礎学んだら
アルゴリズム?デザインパターン?に進めばいいの?
456デフォルトの名無しさん:2010/05/01(土) 19:42:46
>>455
とにかくコードを書け。アルゴリズムもデザパタも書かなきゃ理解できない。
457デフォルトの名無しさん:2010/05/01(土) 19:43:37
そうですね
458455:2010/05/01(土) 19:48:48
>>456
はい。入門書からコーディングは自分でやるようにしてます。
459デフォルトの名無しさん:2010/05/01(土) 20:03:57
Visual Studio2010 Expressが出たけど、これってつまり、
今Visual Studio 2008 Express版持ってる人は2010に乗り換えた方が良いってこと?
割と最近このスレで2008EX版勧められて導入したばかりなんですけど・・・・
460デフォルトの名無しさん:2010/05/01(土) 20:11:08
>>459
欲しい新機能がなければ急いで替える必要はないなって言うのが、俺の率直な印象。
時々IDEが黙るし、マウスのホイールの移動量がおかしいし、早くSP1が出ないかなと思う。
461459:2010/05/01(土) 20:13:11
>>460
分かりました。もう少し様子見てみることにします。
462デフォルトの名無しさん:2010/05/01(土) 20:16:21
>>456
逆だろ?
コーディングなんて猫でもできる

仕事できない奴の典型、アルゴリズムが頭に浮かんでないのに
行き当たりばったりでコーディングを開始する奴
463デフォルトの名無しさん:2010/05/01(土) 20:24:06
どっちなんだYO!w
464デフォルトの名無しさん:2010/05/01(土) 20:29:20
コーディングなんて工数を占める割合は2割以下
設計仕様   5
コーディング 2
デバック    3

位だろ。


465デフォルトの名無しさん:2010/05/01(土) 20:29:41
ずいぶん優秀な猫だな。
466デフォルトの名無しさん:2010/05/01(土) 20:39:45
我輩は猫でないし、名もある
467455:2010/05/01(土) 20:40:38
でもまあ確かに無から有はうみだせませんから、
そういう意味では知識と組み立て(段取り)が頭の中にあらかじめ入ってないと意味内ですよね。
468デフォルトの名無しさん:2010/05/01(土) 20:40:52
鴎外先生キタ━━━━━━(゚∀゚)━━━━━━ !!
469デフォルトの名無しさん:2010/05/01(土) 20:42:55
鴎外?
470デフォルトの名無しさん:2010/05/01(土) 21:18:56
山芋は眠らない (・` ,_ゝ・´)キリッ
471デフォルトの名無しさん:2010/05/01(土) 21:43:13
いまどきウォーターホールでやってるところってあるんかね?

仕様なんて最初の段階じゃ良くて7割しかきまらないような・・・
作っているうちにより良い手立てがあることに気づくことってざらだよね?

おれが設計素人なだけかもしれんが・・・。

そもそも顧客自体もほしい物がわかって人っていないよね?

C++以外のことですまねえ。
472デフォルトの名無しさん:2010/05/01(土) 21:54:25
実際に手を動かしてモノを作ってる人じゃないんだろう
473デフォルトの名無しさん:2010/05/01(土) 21:54:53
>>471
仕様なんて決まらないじゃない、決めるんだよ
確かに、顧客自体もほしい物がわかって担当がいるが
そういう時はラッキー、こっちの言いなりで決めれてしまう。

後で変更になったら、追加を請求できるし。

>作っているうちにより良い手立てがあることに気づくことってざらだよね?
まず、ない
それは設計自体に問題がある。深く考え込まれていない証拠。

まぁ、数十人程度でやってるなら、それでもいいが、100人以上で
開発しているプロジェクトだと、コーディング途中に設計変更なんて
考えられない

474デフォルトの名無しさん:2010/05/01(土) 21:56:59
素人だからよく解らんけどゲームとかって仕様変更しまくるんでしょ
こういう場合はスパイラルモデル?っていうのがいいのかな?
475デフォルトの名無しさん:2010/05/01(土) 22:02:37
水穴?ウォーターフォールだろ…ってのは置いといて
残り三割を決めるためのスケジュールを
「最初から」全体計画に盛り込めないことは多々あるな
下請けの辛い所だよ

俺のノートPC、1024x768なんだよね…
VS2010のバカタレ
476デフォルトの名無しさん:2010/05/01(土) 22:02:44
>>474
どかたの方にわかりやすく言うと、道路工事中に水道等をぶち破ったら、
あなたはどう思います?普通は
「設計!、調べんだろ普通!!」って感じで怒鳴りつけるでしょ

それと一緒、コーディングなんて、やってる最中に、これじゃ成り立たない
なんてわかったら、設計者として無能
477デフォルトの名無しさん:2010/05/01(土) 22:07:02
仕様変更に弱い糞プログラムしか書けないということはわかった
478デフォルトの名無しさん:2010/05/01(土) 22:11:02
ゲームの場合はスクリプトを読み込むエンジン作っておいてあとから柔軟に対応できるように作っていたら
いつの間にかエンジンの方ばかり変更してしまってスクリプトを全然弄らないという事が結構あるなー
479デフォルトの名無しさん:2010/05/01(土) 22:39:09
>>473
うむ、正しいな
数十人どころか数人でやっていても金と工数を貰わない限り設計変更なんてお断りだぜ
480デフォルトの名無しさん:2010/05/01(土) 22:39:59
どかたと違って瞬間復旧ができるかんな
481デフォルトの名無しさん:2010/05/01(土) 22:42:29
土方と違って徹夜が多いぞ
482デフォルトの名無しさん:2010/05/01(土) 22:46:37
所詮、趣味でやってるようなヲタには分からないだろうな
設計なんてなくて、いきなりVC++立ち上げるような連中だろうからなw
483デフォルトの名無しさん:2010/05/01(土) 22:50:21
仕事でしかコード書かないんじゃ1年に数千行くらいしか書かないじゃん。そりゃまともなプログラム書けるようにならないよ。
484デフォルトの名無しさん:2010/05/01(土) 22:56:52
>>483
だから、コードを書くか書かないの問題ではない、ソフトウェア工学を理解できるか否か
が重要であって、プログラムを書くなんてのは仕様さえ決まれば、なんてことないんだよ

まぁ、商用に耐えうるプログラムを書いたことがない君には分からないだろうけどねw
485デフォルトの名無しさん:2010/05/01(土) 22:58:11
>>474
仕様変更つったって、ほとんどはコードの極一部にしか影響しない変更ばかりだよ。
全体に波及するような変更は、たとえやりたくても予算と納期が許さない。

かくして、初期の的外れな仕様のままマスターアップを迎え、
世には箸にも棒にもかからない駄ゲーがあふれることになるのだが、それはまた別のおはなし。
486デフォルトの名無しさん:2010/05/01(土) 22:59:01
スレち乙
487デフォルトの名無しさん:2010/05/01(土) 22:59:13
C++相談室ですよ
488デフォルトの名無しさん:2010/05/01(土) 23:29:15
日本の技術者はコードなんてあんまり書かないよな。設計が主業務だからな
コード書くのはコーダーの仕事で技術者がなんで
そんなことするのって感じだからな。
489デフォルトの名無しさん:2010/05/01(土) 23:32:57
コードも碌に書かないやつが何でソフトウェアの設計ができるんだって話だよ。
結局下請けに丸投げで客と下請けの連絡係なんてしてるから仕事の効率が悪いんだ。
490デフォルトの名無しさん:2010/05/01(土) 23:35:02
お前らいつも偉そうなこと言って人を見下してるけどそんなに自信があるならなんで独立しないの?
491デフォルトの名無しさん:2010/05/01(土) 23:41:21
でも、効率悪かろうが下請けよりはるかに良い給料貰っているんじゃね
492デフォルトの名無しさん:2010/05/01(土) 23:41:46
たいしたプログラムかけないのにずいぶん偉そうだな
悔しかったら晒しみ

493デフォルトの名無しさん:2010/05/01(土) 23:52:27
こういう技術に興味のない奴らが技術がなくても食っていけるように人売り派遣の仕組みを作って日本のソフトウェアをダメにしたんだろう
494デフォルトの名無しさん:2010/05/02(日) 00:07:29
日本が駄目になろうが、自分らが金儲けできれば良いって考えは
日本人なら普通じゃないの? 
で、いまや人売り派遣がないと困る下請け多いんじゃないの?
495デフォルトの名無しさん:2010/05/02(日) 00:10:17
ストライキしよーぜ
496デフォルトの名無しさん:2010/05/02(日) 00:56:10
金儲け目的で生きてて楽しいの?何のために生きてるの?生きてる意味あるの?
497デフォルトの名無しさん:2010/05/02(日) 01:00:36
じゃぁ、おまえさんは何のために生きてるの?
498デフォルトの名無しさん:2010/05/02(日) 01:56:25
生きるのにいちいち意味だの目的だの考えるのは
そういう趣味ならいいけど、必要だと思ってるなら救いようのないヴァカ。
499デフォルトの名無しさん:2010/05/02(日) 05:36:47
おまえら何度スレチと言わす気だ
500デフォルトの名無しさん:2010/05/02(日) 08:28:16
C++相談室だぞ。
職場環境相談室じゃねーんだよ。
501デフォルトの名無しさん:2010/05/02(日) 09:56:20
まったくだ、なんの為にム板とマ板に分かれてると思ってるんだ

・・・という話を続けるのもスレチではあるのだが
502デフォルトの名無しさん:2010/05/02(日) 11:12:05
namespace hoge {
class Test;
}
class Test;とするとclass Test{}と同じ意味になるのですか?
503デフォルトの名無しさん:2010/05/02(日) 11:14:31
ならない
504デフォルトの名無しさん:2010/05/02(日) 11:16:13
宣言と定義は違う
505502:2010/05/02(日) 11:17:24
それじゃ、前方宣言なのかな?
class Test;
namespace hoge{}
って、普通なら書く気がすんだけど
506デフォルトの名無しさん:2010/05/02(日) 11:18:23
namespace内に閉じこめるかどうか
507デフォルトの名無しさん:2010/05/02(日) 11:34:25
::Test じゃなくて
hoge::Test を宣言したかったんでしょ
508502:2010/05/02(日) 11:38:57
>>506
thx
509デフォルトの名無しさん:2010/05/02(日) 14:35:56
namespace hoge { void __stdcal fuga(void); }

この関数をDLLにしてエクスポートするにはどうすればいいんですか?
510デフォルトの名無しさん:2010/05/02(日) 14:48:15
>>509

DLLって何ですか?
ここはC++相談室ですけど。
511デフォルトの名無しさん:2010/05/02(日) 14:59:36
えっとtemplate template....何とかって知っている?
使ったことある?
512デフォルトの名無しさん:2010/05/02(日) 15:27:51
とあるソフトの設定ファイル関係のクラスを読んでいます
メンバ変数をpublicにしているようですが、お前らだったらprivateにする?
513デフォルトの名無しさん:2010/05/02(日) 15:38:14
privateにする理由がわからん。
外から書き込まれるのを禁止したかったら、コメントを入れておけば十分

privateにして、わざわざアクセサ書くの面倒だし、無駄なオーバーヘッドあるし。
514デフォルトの名無しさん:2010/05/02(日) 15:43:42
privateにしたほうがいいんだろうなあ
と思いつつも面倒だからpublicにしてしまう
515デフォルトの名無しさん:2010/05/02(日) 15:47:56
複数でやってるようなプロジェクトならprivate/protectedにしてget/setメソッドを
実装するのが普通だろうが、一人でやってるようなものはすべてpublicでOK
516デフォルトの名無しさん:2010/05/02(日) 15:56:33
アクセサならまずinline化がきくから、実行時オーバーヘッドは無いだろ。
517デフォルトの名無しさん:2010/05/02(日) 15:59:38
一人でやっていようがメンバ変数はprivateだろ。
518デフォルトの名無しさん:2010/05/02(日) 16:10:26
>>516
中途な知識でinlineなんて言葉使うと突っ込まれるぞ
ちなみに、inlineとしてコンパイラからみえないこともあるんだぞZ
519512:2010/05/02(日) 16:10:38
以前、設定ファイルをprivateにしたときは、
get/setだらけのクラスが出来上がって気持ち悪いことになりました

でも、publicだらけにするのも気持ち悪い
520デフォルトの名無しさん:2010/05/02(日) 16:15:04
ただ読んで使うだけならいいかもしれないけど、
後でエラーチェックが必要になったときとかにその変数にアクセスしてる全ての箇所を
修正するのとget/setの中だけ修正するのとどっちが仕様変更に強い良いプログラムかってことだな。
521デフォルトの名無しさん:2010/05/02(日) 16:31:10
>inlineとしてコンパイラからみえないこともあるんだぞ
どういう意味か教えてほしい
522デフォルトの名無しさん:2010/05/02(日) 16:38:43
>>521
inlineとしても展開されないことがあるといいたいんだろう。
でも展開されないアクセサはまずないだろう。
523デフォルトの名無しさん:2010/05/02(日) 16:40:39
>>519
そのような値を持つだけで機能が無いものは構造体にしてもいいと思うよ。
機能を持ち、メンバー変数を隠蔽するのはclassでと使い分けるのもいいと思う。
524デフォルトの名無しさん:2010/05/02(日) 17:23:09
他人が書いたコードを読んでいたら
「GetER()->AddErrorMessage("エラー")」という箇所がありました。

エラーを処理しているメンバ関数みたいなのですが
なぜ関数にアロー演算子がついているのでしょうか?

GetER->AddErrorMessage("エラー");
ならオブジェクトポインタから関数にアクセスしていると分かるのですが・・・
525デフォルトの名無しさん:2010/05/02(日) 17:25:53
>>524
ヒント: 戻り値
526デフォルトの名無しさん:2010/05/02(日) 17:28:02
>>524
CFoo* GetER();

ってな、感じで宣言されていませんか?
527デフォルトの名無しさん:2010/05/02(日) 17:31:25
>>526
はい、されてます!
こんな感じになってます。
static CErrorReport* GetER(){return &m_ErrorReport;};

ちなみにm_ErrorReportは下記です
static CErrorReport m_ErrorReport;
528デフォルトの名無しさん:2010/05/02(日) 17:34:55
>>527
GetEDがCErrorReportへのポインタを返すんですよね
だから、その戻値をアロー演算子で参照して、AddErrorMessageメソッドを呼んでる

って感じですね
529デフォルトの名無しさん:2010/05/02(日) 17:43:49
>>528
ありがとうございます。
戻り値をアロー演算子で参照ですか・・・。

やっている事は何となく分かったのですが、どうしてそんな間接的な方法を取るのでしょか?
直接オブジェクトから呼び出してはダメなのでしょうか?
530デフォルトの名無しさん:2010/05/02(日) 17:57:37
>>529
簡単に書くと(クラスの中)

CErrorReport* errorReport = GetER();
errorReport->AddErrorMessage("エラー");

と2行で書いていもいいんですよ
GetER()->AddErrorMessage("エラー");

と書いたほうが1行でかけますよね?

ただ面倒でかつ、errorReportの使い道がそこしかないなら、
531デフォルトの名無しさん:2010/05/02(日) 17:57:59
間接段階があると、あとからなにかあったときとか、なにかと便利なのだ。
532デフォルトの名無しさん:2010/05/02(日) 17:59:25
>>530
あら、日本語がおかしくなっちゃったw

ただ面倒でかつ、errorReportの使い道がそこしかないなら、
GetER()->AddErrorMessage("エラー");
と書いたほうが1行でかけますよね?

533デフォルトの名無しさん:2010/05/02(日) 18:05:15
>どうしてそんな間接的な方法を取るのでしょか?
static CErrorReport* GetER(){
    return m_ErrorReport.isValid()
        ? &m_ErrorReport
        : m_ErrorReport2.isValid()
        ? &m_ErrorReport2
        : 0
        ;
};
みたいなことができるから。
534デフォルトの名無しさん:2010/05/02(日) 18:14:58
hoge()->hoge2()->hoge3()->hoge4()…とかね
535デフォルトの名無しさん:2010/05/02(日) 18:15:42
haskellたのひ
536デフォルトの名無しさん:2010/05/02(日) 18:24:26
なんか話がごっちゃになってるな。
>>531>>533 は関数の実装側にとってのメリットの話。
>>530>>532>>534 は関数を呼び出す側の記述スタイルの話。
537デフォルトの名無しさん:2010/05/02(日) 18:28:54
質問者さ〜ん、ついていけてますか?w
538デフォルトの名無しさん:2010/05/02(日) 18:31:10
ポインタ返すのにぬるぽチェックしないのとか
この値は開放しなくていいのかなとか
なんか気になるんですけど
みなさんはそうでもないんですか?
539デフォルトの名無しさん:2010/05/02(日) 18:35:24
自分だけのテストソースなら気にしない
540デフォルトの名無しさん:2010/05/02(日) 18:35:42
返却値のNULLチェックなんてやってたら、面倒でしかたないよ

普通、例外処理でしょ
541デフォルトの名無しさん:2010/05/02(日) 18:38:26
だったら参照返してくれって思うんだけど
わざわざポインタで返すってことは暗に無効値を返すぜって言ってるようなもんだろう
542デフォルトの名無しさん:2010/05/02(日) 18:52:11
参考になるのでこのスレ見てる初心者の疑問なんですが
参照を返した場合それの解放ってどうするんでしょうか?
ちなみにあまり一連の質問応答にはついていけてません
ただ、参照を返すという一言を見て生じた疑問です
543デフォルトの名無しさん:2010/05/02(日) 19:02:29
返値が参照の場合、ふつうそのオブジェクトの所有権は呼出先のクラスなり関数なりにある。
よほど変な設計になっていない限り、呼出元は解放処理を気にする必要はない。

Foo& foo = obj.GetFoo();
delete &foo; // obj < おいやめろ馬鹿!
544デフォルトの名無しさん:2010/05/02(日) 19:04:25
つくったとこが解放するのが常識

値を取得できたってことは,そのクラスでつくったってこと

あとはわかるよな?
545デフォルトの名無しさん:2010/05/02(日) 19:26:07
class base
{
int x;
};

class sub1 : public base
{
};

class sub2 : public sub1
{
};

・・・

class sub10 : public sub9
{
};

みたいな感じで継承を繰り返すときに
sub10から一発でxを初期化する方法はある?
仮想継承はコストがかかるので無し
引数でリレーするのは書くのがめんどくさいです
546デフォルトの名無しさん:2010/05/02(日) 19:33:20
>>538
そもそも、アプリの上位のレベルでdeleteを書かなくちゃ
いけない様な設計は危険すぎると思います。
547デフォルトの名無しさん:2010/05/02(日) 19:36:06
普通はスマポか内蔵参照カウンタ使うよな
548デフォルトの名無しさん:2010/05/02(日) 19:38:24
実装の途中段階から参加すると
そういうインターフェースがごろごろ転がってるから油断ならない
549デフォルトの名無しさん:2010/05/02(日) 19:40:14
>>543-544
ご回答ありがとうございます

そういうケースでは参照で返したらいいんじゃないかっていう話だったんですね
関数、参照で返すしか見てなかったためにあほな質問してすいませんでした
550デフォルトの名無しさん:2010/05/02(日) 20:15:27
>>545
sub10::sub10() { x = 1; }
551デフォルトの名無しさん:2010/05/02(日) 20:17:10
無理じゃね?
552デフォルトの名無しさん:2010/05/02(日) 20:21:52
コンストラクタで代入はできるけど初期化リストでは無理な気がする
553551:2010/05/02(日) 20:25:54
ごめんなさい
見なかったことにして下さい
554デフォルトの名無しさん:2010/05/02(日) 20:34:43
class base{ public: int *px; base() : px(static_cast<int*>(::operator new(sizeof(int)))){} };
class sub10 : public sub 9{ public: sub10(){ new(base::px) int; } }: //初期化リストは使えないけど関数内部でplacement new

そういえば仮想継承しないのはコストが嵩むからだったな。
pxに動的なメモリ空間を入れるのも気に食わないだろう。boostのalignment_storageでメンバに持つように書くといい。
555デフォルトの名無しさん:2010/05/02(日) 20:39:09
初期化リストは使えないの?
556デフォルトの名無しさん:2010/05/02(日) 20:43:52
xはbaseのprivateなんだからbaseで面倒見るべき
遙か彼方の派生クラスからいじくろうと思うこと自体が間違い
設計に問題がある
557デフォルトの名無しさん:2010/05/02(日) 20:57:02
メンバ関数testMethod
メンバ変数mTestobj、sTestobj
クラスClassTest
って感じの命名規則でおk?
558デフォルトの名無しさん:2010/05/02(日) 21:00:04
sTestobjの接頭子sてなにーーーーーーーーーーーーーーー??????????????????????????????????????^−^
559デフォルトの名無しさん:2010/05/02(日) 21:00:08
命名規則なんて上が決めるからどうでもいいよ
560557:2010/05/02(日) 21:16:22
>>558
staticのs
この命名規則はaroraってブラウザで使われていた

>>559
職場はVBとC#
561デフォルトの名無しさん:2010/05/02(日) 21:33:34
システムハンガリアンはキモい……
562デフォルトの名無しさん:2010/05/02(日) 21:37:44
C++で関数の引数で以下のような場合は各関数a,b,cが評価される順序は不定だそうですが、,演算子の場合や、コンストラクタの初期化子の場合も同様ですか?

int n=func(a(x),b(y),c(z)); //関数

int n=a(x),b(y),z(z); //,演算子

hoge(int x,int y,int z):m1(a(x)),m2(b(y)),m3(c(z)){} //初期化子
563デフォルトの名無しさん:2010/05/02(日) 21:39:58
>>562
カンマ演算子は左から順番に評価されると規格で決まっています
初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
564デフォルトの名無しさん:2010/05/02(日) 21:51:33
二つほど疑問点。
カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ?
あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
565デフォルトの名無しさん:2010/05/02(日) 21:54:10
>>563 早速の回答ありがとうございます。評価順がはっきりしたので安心しました。

初期化子の評価順に従えばメンバーを参照して初期かも可能なのでしょうか?
たとえばこんなかんじ。
class hoge
{
int m1;
int m2;
int m3;
public:
hoge(x)
:m1(a(x)
,m2(m1+b(x))
,m3(c(m2))
{
}
};
566デフォルトの名無しさん:2010/05/02(日) 21:55:42
>>564
> カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ?
オーバーロード?
> あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
関係無いって何?関係はあるだろうが、結果には影響が無いね。
不定なだけで、順番は処理系依存ではあるが、実行はされるから。
567デフォルトの名無しさん:2010/05/02(日) 21:56:52
>>561
その例はアプリケーションハンガリアンだと思うよ。
メンバーを示すためにプリフィックスmをつけるのは有益だと思う。
記憶クラスの間違いは型チェックだではコンパイルでチェックできないからね。
568デフォルトの名無しさん:2010/05/02(日) 22:29:33
C++は型情報を多相性で曖昧に判別できるからせっかくのその機能を命名規則で台無しにするなんてできないな。
staticとかならいっそのこと、変数名にそのままstatic_hogehoge_valueという風に組み込んでしまった方が分かりやすいし。
569デフォルトの名無しさん:2010/05/02(日) 22:30:19
>>565
いいけど注意して書けよ
570デフォルトの名無しさん:2010/05/02(日) 23:13:21
>>569 うんわかった。注意して使うことにするよ。ありがとう
571デフォルトの名無しさん:2010/05/02(日) 23:22:12
>>565
VC++2008でやってみたら 初期化の場合は宣言されてる変数順っぽいかもよ
初期化部分が
hoge:m1(1), m2(m1+1), m3(m2+1)
として
int m1,m2,m3

int m2,m1,m3
だと結果が異なった
572デフォルトの名無しさん:2010/05/02(日) 23:26:31
>初期化の場合は宣言されてる変数順っぽいかもよ
>>563の人が
>初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
とすでにいっているんだけど
573デフォルトの名無しさん:2010/05/02(日) 23:29:53
>>572
ごめんなさい。>>565に驚いちゃって見落としてました。
574デフォルトの名無しさん:2010/05/02(日) 23:43:39
先に初期化して欲しい変数は、それ専用の基底クラスに持たせるかな
宣言順でもいいけど意図が伝わらないと困るかもしれない
575デフォルトの名無しさん:2010/05/03(月) 00:29:59
enumの定義でtypedef使う場合と使わない場合の違いってなんでしょうか?
576デフォルトの名無しさん:2010/05/03(月) 00:47:14
>>575
エスパーしたんで要点がズレてたらすまんが、機能的には同じ。
もともと、C言語では
enum Hoge {
ABC,
};
と書いたら、使うときも
enum Hoge h = ABC;
~~~~~
みたく、明示的に enum を書かないといけなくて、長ったらしくて面倒なのでtypedefしてた。つまり、

typedef enum Hoge {
ABC
} Hoge;

と書いておくと、enum Hoge に Hoge という名前がつくので、
Hoge h = ABC;
と書けるようになって便利だった。

C++では明示的に enum と書かなくてもいいよ、という風に規約が変わったので、typedefは不要になった。(文法的には正しいので使えるけど)
typedef struct ... も同様の理由。

C++で書くなら typedef は不要、と考えていいとオモ。
577デフォルトの名無しさん:2010/05/03(月) 00:56:15
>>576
ありがとうございます。スタイルの問題なんですね
578デフォルトの名無しさん:2010/05/03(月) 02:31:54
>>434
信じがたいというかタダの嘘だよ
シングルスレッドでそんなの間抜けなコードじゃなく不可能なコードだし。
579デフォルトの名無しさん:2010/05/03(月) 13:21:05
雰囲気よくってなってんな

>>576
みたいな初心者に優しい方ばっかならいいのにな
580デフォルトの名無しさん:2010/05/03(月) 13:23:09
struct hoge
{
hoge(int x) : m_x(x), m_y(get_x())
{
}

int get_x(void) const
{
return m_x;
}

int m_x, m_y;
};

これって未定義?
get_xの時点で暗黙にthisを使ってるからアウツだよね?
581デフォルトの名無しさん:2010/05/03(月) 13:24:31
>>580
分かって使うならいいんじゃね?
582デフォルトの名無しさん:2010/05/03(月) 13:28:17
thisを使うのは別に問題ないだろ
583デフォルトの名無しさん:2010/05/03(月) 13:29:16
初期化の順番は保証されてるから問題は無いと思うが
初期化式でthisを使うのは警告出る場合もある
584デフォルトの名無しさん:2010/05/03(月) 13:31:22
>>583
VCは警告出るね。抑制してるけど。
585デフォルトの名無しさん:2010/05/03(月) 13:31:29
システム全体で使う設定ファイルを扱う関数に付いて

お前らなら「singleton」 or 「staticだけのクラス」 or 「クラスに属していない関数」 or その他
のどれを使いますか?
586デフォルトの名無しさん:2010/05/03(月) 13:33:05
singletonかsingletonですらない普通のクラスのどちらかだな
587デフォルトの名無しさん:2010/05/03(月) 13:33:39
singleton>=staticのあるクラス
singletonが使えるならsingleton。後は気分
588デフォルトの名無しさん:2010/05/03(月) 13:34:39
Singletonかなぁ。
読み込むタイミングと書き戻すタイミングを制御したい時は
どうせInitialize,Finalizeみたいな関数用意することになるからmonostateにしてまうかも。
589デフォルトの名無しさん:2010/05/03(月) 13:37:24
singletonは基本的に高度なグローバル変数だから
使わないでいいなら使わないに越したことは無い
590デフォルトの名無しさん:2010/05/03(月) 13:42:16
普通のクラス+それをラップしたシングルトン
591デフォルトの名無しさん:2010/05/03(月) 13:48:19
参照カウントで複数オブジェクトをディスる
592デフォルトの名無しさん:2010/05/03(月) 16:50:01
結論、>>585は自分の好きな方法を使え
593デフォルトの名無しさん:2010/05/03(月) 18:00:29
シングルトンは全部staticなクラス同士の初期化順問題を回避するためのものであって、
全部staticなクラスはシングルトンの代替にはならない
594デフォルトの名無しさん:2010/05/03(月) 18:02:35
逆に言えば初期化順がどうでも良ければmonostateの方がよろしい
595デフォルトの名無しさん:2010/05/03(月) 18:09:49
シングルトンには破棄側に問題がある事があるからなあ
596585:2010/05/03(月) 18:12:59
そんじゃ、monostateパターンを使うことにするよ

お前らやさしいな、ありがとうよ
597デフォルトの名無しさん:2010/05/03(月) 18:15:24
深い知識はないから、具体的に質問されると下向いて閉口だがなw
598デフォルトの名無しさん:2010/05/03(月) 18:21:42
あとはクラスとしてまとめる必要があるか、かなあ。
なかったら只の関数でも十分。
599デフォルトの名無しさん:2010/05/03(月) 20:38:57
>>585みたいなのはnamespaceに全部突っ込んでるけどこれはダメなのかな
どうせインスタンス作らないんだからclassじゃなくてもいいだろって考えなんだけど
600デフォルトの名無しさん:2010/05/03(月) 20:45:21
クラスにすればprivateメンバとかテンプレートが使えるよやったねたえちゃん
601デフォルトの名無しさん:2010/05/03(月) 20:48:19
privateだとヘッダ書き換えるのめんどくさくない?
実装側に無名namespaceで書けばヘッダ書き換えなくていいから楽だなーと

テンプレートは全然考えてなかった
というかまだ使いこなせない
602585:2010/05/03(月) 20:53:00
>>599
意味もなくインスタンスを生成するのはキモいですね

クラスはnamespaceに属させないで、>>599のやり方の時だけnamespaceを使うのは非常識ですかね?
テンプレートは全然わからない & わからないので、使うつもりは無いです
603デフォルトの名無しさん:2010/05/03(月) 20:53:08
どっちの実装も見たことあるな。
用途にあった方を使えばいいんでね?
604デフォルトの名無しさん:2010/05/03(月) 20:57:02
template入るとソースと分離出来ないから隠蔽するならprivateするしかない
そして隠蔽しなくてもクラスにした方ができることが多い
継承したりtemplate引数に渡したり
605デフォルトの名無しさん:2010/05/04(火) 02:21:34
自分でつくったクラスvarにoperator[]を作ったら多次元配列できますか?

実装は
var * operator[](int idx){return parray[idx];}

ここでparrayはメンバで、以下の様にします。
var * parray;

使う側が
var x[2][3]とかやります。
次に
var v = x[0][1];
とかやります。
するとまずoperator[]が引数idx=0で呼ばれて、var*を返し、次にvar*の一時オブジェクトに対して->operator[](1)が
コールされるとかそんな感じに動きますか?
606デフォルトの名無しさん:2010/05/04(火) 02:24:48
あ、まちがえた

>ここでparrayはメンバで、以下の様にします。
×var * parray;
○var ** parray;
607デフォルトの名無しさん:2010/05/04(火) 02:28:39
動くかどうかは知らないけど
分かりづらいから
やらないほうがいいと思う
608デフォルトの名無しさん:2010/05/04(火) 02:51:18
>使う側が
>var x[2][3]とかやります
この時点で多次元配列なわけだが…
609デフォルトの名無しさん:2010/05/04(火) 02:54:50
>>608
C/C++に多次元配列は無いわけだが…
610デフォルトの名無しさん:2010/05/04(火) 03:32:23
さすがにそれはねーよ
611デフォルトの名無しさん:2010/05/04(火) 04:46:08
>>607-608
配列の[]とoperator[]って別モンなんですかね??
612デフォルトの名無しさん:2010/05/04(火) 09:43:11
別モンです。
var x(2, 3); とかやって x[1][2] みたいなことはできる。
ちなみに返すのはポインタ(var *)じゃなくて参照(var &)な。
613デフォルトの名無しさん:2010/05/04(火) 10:21:38
>>605
これで2次元配列だ。
std::vector<std::vector<var>> array;
614デフォルトの名無しさん:2010/05/04(火) 10:28:14
俺、>>605じゃないけど
var x = A[i][j]; や var x = B[i][j][k]; を実現する 
operator[]ってどうするんですか?
615デフォルトの名無しさん:2010/05/04(火) 10:31:15
>>614
返り値にまたoperator[]する感じ
つまりすごいめんどくさい
616デフォルトの名無しさん:2010/05/04(火) 10:35:07
>>614
考え方としては>>613が基本。

var& var1::operator[](int ind);

var1& var2::operator[](int ind)

var2& var3::operator[](int ind)

好きな次元だけ繰り返す。
617デフォルトの名無しさん:2010/05/04(火) 10:41:00
>>615
えっ、次元の数だけ型に合わせたoperator[]を用意するんですか><
力任せじゃなく賢い方法無いですか
618デフォルトの名無しさん:2010/05/04(火) 10:43:17
こういう時のために神はテンプレートを創った
619デフォルトの名無しさん:2010/05/04(火) 10:44:16
>>617
っMoreEffectiveC++
620デフォルトの名無しさん:2010/05/04(火) 10:46:18
神はじゃなくて禿はだろ
621デフォルトの名無しさん:2010/05/04(火) 10:50:17
Boost.MultiArray
622デフォルトの名無しさん:2010/05/04(火) 10:53:30
>>617
そんなあなたにテンプレート。
>>613
つboost multi array
623デフォルトの名無しさん:2010/05/04(火) 10:54:03
template作ったの禿げ神じゃないでしょ。禿げ神はパクッタんじゃなかったっけ
624デフォルトの名無しさん:2010/05/04(火) 10:54:10
流れ読まずに何でもかんでもboost勧める奴って馬鹿なんじゃないかって思う
625デフォルトの名無しさん:2010/05/04(火) 10:57:28
原理が知りたけりゃ実装嫁って話だろ
626デフォルトの名無しさん:2010/05/04(火) 10:59:58
boostはデザインパターンの実例の宝庫だからな。使うだけでも勉強になる。
627デフォルトの名無しさん:2010/05/04(火) 11:08:12
お前らが今までC++(ひいてはC言語)の勉強にどんな本読んできた?
どんなフローチャートで勉強したら良いか、の参考にしたいから是非勉強した順に教えて欲しいな
628627:2010/05/04(火) 11:09:36
×お前らが
○お前ら
629デフォルトの名無しさん:2010/05/04(火) 11:10:56
猫でもわかるシリーズ一択だろjk
630デフォルトの名無しさん:2010/05/04(火) 11:12:32
この質問者のレベルでboostのソース読めるわけねーだろ
631デフォルトの名無しさん:2010/05/04(火) 11:13:50
読めなきゃステップ実行でも良いんじゃないか
632デフォルトの名無しさん:2010/05/04(火) 11:23:01
>>627
猫でもわかるC言語
Windowsゲームプログラミング
C++ 入門書の次に読む本
Boost C++ Libraries プログラミング
Modern C++ Design
Effective C++
More Effective C++
Exceptional C++
Exceptional C++ Style
633デフォルトの名無しさん:2010/05/04(火) 11:27:56
>>632
C++の入門書がねーじゃん
634632:2010/05/04(火) 11:33:36
言語仕様(非C部分)は次読のサンプルコード打ちながらSTLのソース追いつつ覚えた。
635デフォルトの名無しさん:2010/05/04(火) 11:44:09
exceptionalなぜか大学の図書館においてないから困る
636627:2010/05/04(火) 11:53:10
>>632
THX
やっぱ猫でもわかる〜で導入の後、WinAPI(?)か・・・、俺は今「基礎からのC」で勉強中なので先が長いなあ。

他の人達も>>632みたいな感じで書いてくれると助かる。
637デフォルトの名無しさん:2010/05/04(火) 11:54:19
ググれカス
638627:2010/05/04(火) 11:55:48
いや、ググっても他人の勉強歴ってあんまり出て来ないよ・・・・・
貴重な情報の一つだけどネットには中々転がってない情報でもある気がする
639デフォルトの名無しさん:2010/05/04(火) 11:57:11
昔の人間に聞いても古い本が出てくるだけじゃないかな
C++の昔の本は仕様が古い場合があるとか(iostream.hとか)
Cを長く使った上でC++を適当に覚えたとかあるから、
今の人には役に立たない事も多いと思う
640デフォルトの名無しさん:2010/05/04(火) 12:10:31
>>638
プログラミングの本って面白くないよな
例えば、例題が「女性の平均バストを求めよ」とか少しやる気出るのに

「結城浩」はわかりやすくていいよな
でも、俺は絶対に本でプログラミングの勉強をしたいと思わないな〜
オライリー本は高い&難しいからやめといた方がいいよ
641デフォルトの名無しさん:2010/05/04(火) 12:12:31
その程度でやる気が出るお前がおかしい。
642デフォルトの名無しさん:2010/05/04(火) 12:17:31
サンプルフォームの内容がことごとく「宇宙人」「異世界人」「これを衆目に晒すというのか」
だったりピクチャボックスが自作の萌え絵だったりする本でVC++(C++/CLI)勉強したけど糞も面白くなかったぞ。
643627:2010/05/04(火) 12:17:44
>>640
??
いや、プログラミングの本って自分は大好きですが・・・
644デフォルトの名無しさん:2010/05/04(火) 12:19:46
エロに絡めて勉強って言うのは斬新で効果あるかもしれないな
ぶっちゃけPC覚えた理由ってエロ目的じゃん俺らって
あれと同じノリで簡単なエロツールを作るのを目的に
プログラミングを勉強していくのっていいんじゃないだろうか
645デフォルトの名無しさん:2010/05/04(火) 12:21:42
>>642
おっと赤坂玲音さんの悪口はそこまでだ。
646デフォルトの名無しさん:2010/05/04(火) 12:26:22
>>644
エロが目的でコンピュータ&プログラミングを覚えたわけではないが、
エロのためにコンピュータ&プログラミングを使っている点では俺と同じ
647デフォルトの名無しさん:2010/05/04(火) 14:56:21
↓のようなコードを作ってみたんですけど、最初のwhileの所で、2周目以降のループでは
scanf関数が飛ばされて(?)、printf関数が2連続で並んじゃって意味不明になってしまう・・・・・
あと、2つめのwhileループでも、アルファベットで入力すると無限ループになってしまう・・・・・orz
何が原因なのでしょうか。どなたかご助力をお願いします。
※#include<stdio.h>、#define TSUUJOU 0、#define URUUDOSHI 1です。
※main(void)や配列の初期化や、最後の文字表示の部分は簡単なので飛ばしています。


while((which!='y')&&(which!='n')){
printf("通常の年ならyを、閏年ならnを入力してください。");
scanf("%c",&which);
if((which!='y')&&(which!='n')){
printf("入力ミスです!\n");
}
}
while((month<=0)||(12<month)){
printf("何月についての日数を見ますか?");
scanf("%d",&month);
if((month<=0)||(12<month)){
printf("入力ミスです!\n");
}
}
648デフォルトの名無しさん:2010/05/04(火) 14:57:14
※#include<stdio.h>、#define TSUUJOU 0、#define URUUDOSHI 1です。
↑これは余計でした。すみません。
649デフォルトの名無しさん:2010/05/04(火) 15:07:29
無駄な括弧が多いくせに空白が少ないから読みづれぇ

while (which != 'y' && which != 'n') {
 printf("通常の年ならyを、閏年ならnを入力してください。");
 scanf("%c", &which);
 if (which != 'y' && which != 'n') {
  printf("入力ミスです!\n");
 }
}
while (month <= 0 || 12 < month) {
 printf("何月についての日数を見ますか?");
 scanf("%d", &month);
 if (month <= 0 || 12 < month) {
  printf("入力ミスです!\n");
 }
}

>printf関数が2連続で並んじゃって意味不明になってしまう
2度目は which に改行が渡されるから

>アルファベットで入力すると無限ループになってしまう
%d に対してアルファベットを入力すると
scanf が失敗して永遠に %d が出てこないので無限ループになる
scanf の戻り値を確認して、失敗したら1文字飛ばしてもう一回 scanf するといった処理が必要になる
650648:2010/05/04(火) 15:17:37
ありがとうございます。読みづらくて申し訳ないです。さっきは間違ってTabスペースを消してしまいました。


>戻り値を確認して、失敗したら1文字飛ばしてもう一回scanf
すみませんこれがよく分かりません・・・・いや言ってることは分かるのですが方法が全く浮かばなくて・・・・
651デフォルトの名無しさん:2010/05/04(火) 15:22:00
scanfなんぞ使わずに fgets+sscanf にすれば万事解決なのだが
652デフォルトの名無しさん:2010/05/04(火) 15:23:06
scanf は入力が終わった場合かエラーになった場合にEOFが返ってくるので、
まず、EOFが返されたらループは終了しないといけない

入力があっても、%d に相当する入力(要するに数値)でないと失敗して 0 を返すので
この場合は1文字読み飛ばす(要するに getchar する)必要がある
653デフォルトの名無しさん:2010/05/04(火) 15:27:26
ああ、仕様によっては1文字じゃなくて1行丸ごと読み飛ばす必要もあるわな
その場合は
\n が出てくるまで fgets しても良いし、
\n が出てくるまで getchar しても良い
654648:2010/05/04(火) 15:31:31
>>651-653
ありがとうございます。
今読んでる本の索引で調べてみたんですけど、この本(基礎からのC)だとgetcharとかsscanfの使い方が載ってなかったですorz
で、fgetsについてはまだ読んでない関数・構造体・ポインタのページで解説されてるようですし、
皆さんのレスを読んでいると、恐らく1文字読み飛ばしたりするのは自分にとって未習の知識なのではないかと思いました。
なので、せめて読み通すまではオリジナルのコードを書くのはあまりしないようにしておきます。
すみませんでした。
655デフォルトの名無しさん:2010/05/04(火) 15:53:25
C/C++の入出力ライブラリは曲者揃いだから
勉強でやってるならあんまりそこで詰まらない方がいいよ
もっと大事なことがいっぱいある
656648:2010/05/04(火) 16:05:58
「詰まらないようにする」とは要するに、分からない部分があってもサッサと先に進んで、
その後で辿ってきた道のりを概観してみろ、ってことですよね
657デフォルトの名無しさん:2010/05/04(火) 16:14:56
そうね
後で分かる事もあるし
658デフォルトの名無しさん:2010/05/04(火) 16:23:06
getcとケットシー
659デフォルトの名無しさん:2010/05/04(火) 16:27:09
入出力なんてただの一機能に過ぎないし
はっきり言ってC/C++の入出力ライブラリって出来悪いしな

どうしても標準出力に吐く所から勉強が始まるもんで
それだけ見てプログラムとはこういうもんなのかと嫌いになる初心者が結構いるから
660デフォルトの名無しさん:2010/05/04(火) 16:29:49
stdioはまだ許せるけどiostream、オメーはだめだ
ios_stateなんてのが出てくる時点で欠陥品
661デフォルトの名無しさん:2010/05/04(火) 16:30:24
コンソールじゃなくてMassageBoxとかから教えた方が初心者はやる気でんのかね?標準じゃないけど
662デフォルトの名無しさん:2010/05/04(火) 16:31:06
ファイルを本格的に扱うにはiostreamよりWin32API直接が確かに楽だね
663デフォルトの名無しさん:2010/05/04(火) 18:00:20
#include <malloc.h>

class T1{
public:
   void* operator new(size_t size) { return malloc(size); }
   void* operator new(size_t size, size_t n) { return malloc(size); }
};

class T2 : public T1{
public:
   void* operator new(size_t size) { return malloc(size); }
};

int main(){
   T1 *t2 = new(1000) T2;
   return 0;
}


これを実行すると、
「error C2660: 'T2::operator new' : 関数に 2 個の引数を指定できません。」
というエラーが出るのですがなぜでしょうか?
T1の「 new(size_t size, size_t n) 」が継承されているはずなので、エラーにならないと思ったのですが…
664デフォルトの名無しさん:2010/05/04(火) 18:02:30
まずはstaticにしよう
665デフォルトの名無しさん:2010/05/04(火) 20:27:04
std::iostreamは高度な処理には向いていないが、
だからこそ意義があるんじゃない?
例えば広く使えるライブラリの文字列処理とか。
666デフォルトの名無しさん:2010/05/04(火) 21:09:10
operator==とoperator>をオーバーロードすれば
operator>=も自動でオーバーロードしてくれるんですか?
667デフォルトの名無しさん:2010/05/04(火) 21:11:09
してくれませんが、自動化するテクニックはあります
668デフォルトの名無しさん:2010/05/04(火) 21:11:51
そういうわけではありません。
669デフォルトの名無しさん:2010/05/04(火) 21:17:17
>>666
それをやられると困るシチュエーションが考えられるから
(思い浮かばないけど理論上はね。)
それはない。
自動化させるテクニックはあるよ。
boost operator
でggr
670デフォルトの名無しさん:2010/05/04(火) 22:08:50
666です。ありがとう!
671デフォルトの名無しさん:2010/05/04(火) 22:11:45
668です。どういたしまして!
672デフォルトの名無しさん:2010/05/04(火) 22:16:50
#include<stdio.h>
int main(void){

int a,b,c,max,mid,min;

printf("異なる3つの整数型データをお入力してください");
scanf_s("%d%d%d",&a,&b,&c);

if(a>b){
max=a; min=b;
}
else {max=b; min=a;}

if(c>max){
mid=max; max=c;
}
else if(c>min) mid=c;
else mid=min; min=c;

printf("大-->%d\n中-->%d\n小-->%d\n",max,mid,min);

return 0;
}

異なる3つの整数を入力して大中小を判定するプログラムです。
これでコンパイルにはエラーがないのですが、実行結果が大と小が同じ値になってしまいます。
どこが間違っているでしょうか?
673デフォルトの名無しさん:2010/05/04(火) 22:18:46
{}が足りない
674デフォルトの名無しさん:2010/05/04(火) 22:19:27
どこに足りませんか?
675デフォルトの名無しさん:2010/05/04(火) 22:19:59
else mid=min; min=c;

else { mid=min; min=c; }
676デフォルトの名無しさん:2010/05/04(火) 22:20:23
else mid=min; min=c;

else mid=min, min=c;

else{ mid=min; min=c; }
に書き換えよう!
中括弧で囲まずにステートメントを「;」で終了するとif分のelse分が最初のひとつで終わってしまうぞ!
677デフォルトの名無しさん:2010/05/04(火) 22:21:47
それはelse文の中が複文だからですか?
678デフォルトの名無しさん:2010/05/04(火) 22:23:03
>>675>>676
ありがとうございました
679デフォルトの名無しさん:2010/05/04(火) 22:23:49
676です。どういたしまして。
680デフォルトの名無しさん:2010/05/04(火) 22:32:22
なんか最近みんな言葉づかいが異常に丁寧だな。
>>672のメッセージも「お入力してください」になってるし。
流行ってるの?
681デフォルトの名無しさん:2010/05/04(火) 22:36:50
max=c;
mid=max;

これはmaxにcを格納して、maxをmidに格納するといういみですが、イメージとしては


|| c ||
||___|| 
|_____| 大きい箱がmid 小さい箱がmax

こんな感じでいいでしょうか?
682デフォルトの名無しさん:2010/05/04(火) 22:38:11
>>680
ただのミスですw
683デフォルトの名無しさん:2010/05/04(火) 22:38:34
何?
イメージとか言われても全然分からん。

どこの言語 出身の方?
少なくともC系列じゃないよね?
684デフォルトの名無しさん:2010/05/04(火) 22:40:02
681は図がずれましたが、c系列です・・・
685デフォルトの名無しさん:2010/05/04(火) 22:41:40
失礼しました
686デフォルトの名無しさん:2010/05/04(火) 22:41:54
>>681
宣言を書いてくれないと分からん
687デフォルトの名無しさん:2010/05/04(火) 22:50:39
「変数は箱だ」という説明から生じた誤解のような気がする。

a = b という代入は、
aという箱の中にbという箱を入れているのではなく
aという箱の中にbという箱の中身を入れている。
688デフォルトの名無しさん:2010/05/04(火) 22:52:14
>>680
日本語を誤って使ってしまっては元も子もありませんが、言葉遣いを丁寧にするというのに流行などは関係ありません。
普通です。
689デフォルトの名無しさん:2010/05/04(火) 23:02:03
>>687
細かいこと言うと、複製してるだね、
中身を入れるだと移動と取られかねない
690デフォルトの名無しさん:2010/05/04(火) 23:02:48
>>684
C系列なのにその誤解は・・・
と思ったら>>687「変数は箱だ」と教わったという事か。

そんなクソみたな例えは止めて、
C/C++でプログラミングしたければ
「メモリ」っていうものについてちゃんと真っ向から向かい合った方がいいよ。
691デフォルトの名無しさん:2010/05/04(火) 23:26:05
そうだな
「箱」の例えでいいのはBASICだな
C/C++は箱の概念だと間違いなくポインタでつまずく
692デフォルトの名無しさん:2010/05/04(火) 23:26:37
つまずいて理解を深めればいいじゃない
693デフォルトの名無しさん:2010/05/04(火) 23:28:32
>>689
メタトロンはそのまま移動だよ。
694デフォルトの名無しさん:2010/05/04(火) 23:57:09
まあ苦しむのは俺じゃないからな
苦しめ苦しめ
695デフォルトの名無しさん:2010/05/05(水) 00:04:38
苦しんだ人間がめちゃくちゃなコードを書いて保守する人も苦しめる
696デフォルトの名無しさん:2010/05/05(水) 00:19:51
最終的に>>694まで回ってくるんですね。
697デフォルトの名無しさん:2010/05/05(水) 01:12:52
>691
ポインタは箱にそれぞれ異なった内容のラベルが貼ってあってそれを書いた紙で考えればいいんじゃないの?
ポインタへのポインタは、「ラベルの内容が書いてある紙が入った箱」のラベルが書いてある紙、で。
698デフォルトの名無しさん:2010/05/05(水) 01:14:35
699デフォルトの名無しさん:2010/05/05(水) 04:19:38
newで確保した値を別の関数にアドレスで渡してdeleteするのって大丈夫でしょうか?

関数Aで「obj.table = new int[ 10 * 10 ];」ってやって、
それを関数Bに渡して「delete[] &obj->table;」とやるのはどうなのでしょうか?
700デフォルトの名無しさん:2010/05/05(水) 05:32:08
関数AがコンストラクタでBがデストラクタだとしたら普通だな
701デフォルトの名無しさん:2010/05/05(水) 06:51:09
>>699
大丈夫だけど、確実にdeleteされる保証がもてないならしないほうが良い。

それと、なんで delete[] obj.table; じゃないのだろうかと思う。
というかコンパイルエラーになると思うんだが。
どうしてもやるなら delete[] (&obj)->table; だと思うな。
702デフォルトの名無しさん:2010/05/05(水) 07:28:48
>>663
T2::operator new で T1::operator new が隠されている。
http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
703デフォルトの名無しさん:2010/05/05(水) 10:46:49
>>699
できるけど std::vector<int> を使っとけ
704デフォルトの名無しさん:2010/05/05(水) 11:08:18
class X
{
void *operator new (std::size_t size) { return ::operator new (size); }
};

class Y
{
static void *operator new (std::size_t size) { return ::operator new (size); }
};

動作を見た感じは同じなんですが、上下で違いはありますかね?
705デフォルトの名無しさん:2010/05/05(水) 11:16:45
>>704
static付けても付けなくても同じ。
706デフォルトの名無しさん:2010/05/05(水) 11:19:43
ありざす!
707デフォルトの名無しさん:2010/05/05(水) 12:39:33
>>704
リンク時に関数が外に見えるかどうか、だったかと。
708デフォルトの名無しさん:2010/05/05(水) 12:41:17
え?
709デフォルトの名無しさん:2010/05/05(水) 12:41:51
だったかと(キリッ
710デフォルトの名無しさん:2010/05/05(水) 12:50:58
>>707 ここはC++スレです。
711デフォルトの名無しさん:2010/05/05(水) 19:54:34
configureオプションに以下のようなものがありますが、
これはプログラマーが任意に作成することができるオプションなのでしょうか?
これをコンパイルすると、マクロが定義され機能のON/OFFが出来るってことでおk?

>--with-gthread
> pthreadの代わりにgthreadを使用する。
>--with-[native|core2duo|athlon64|atom|ppc7400|ppc7450]
> CPUに合わせた最適化
他にはalsa、pangoの設定等など
712デフォルトの名無しさん:2010/05/05(水) 19:55:40
どこの誤爆?
713デフォルトの名無しさん:2010/05/06(木) 06:20:48
WS_SIZEBOXだと境界線が出るんですが
クライアント領域がサイズ変更可能で境界線を持たないウインドウはどうすれば作成できますか?
714デフォルトの名無しさん:2010/05/06(木) 06:26:15
C++の話題じゃないな。Win32スレへ
715デフォルトの名無しさん:2010/05/06(木) 12:51:22
C++でboost::shared_ptrないしstd::tr1::shared_ptrを使用しています。
循環参照が生じていないように気をつけてしようしているつもりではありますが、
もし生じていた場合にそれを検出する方法はありませんでしょうか?
(デバッグビルドでだけ検出できれば十分です。リリースビルドで検出できなくても諦めます。)

よろしくお願いいたします。
716デフォルトの名無しさん:2010/05/06(木) 12:57:36
>>715
丁度話題になっているようだ。
Boost総合スレ part8
http://pc12.2ch.net/test/read.cgi/tech/1251446016/912
717715:2010/05/06(木) 13:06:09
>>716
その話題を投稿したのは私です・・・。
boost::shared_ptrの循環参照について調べていて例えが分かりやすい
と思ったのでBoostスレで例のURLを紹介しました。

一方、"循環参照が生じているかどうかを検出する方法"については
boost::shared_ptrに限らずstd::tr1のものも含むという事と、
Boostには"循環参照が生じているかどうかを検出する方法"がない事を私は知っているので、
一般のC++スレで聞くべきと思いこちらで聞きました。

718デフォルトの名無しさん:2010/05/06(木) 13:14:28
>>715
ここらへんから使えそうなの拾い出してもらえないかい?
http://stackoverflow.com/search?q=shared_ptr+detect+cycle
719デフォルトの名無しさん:2010/05/06(木) 13:17:19
720デフォルトの名無しさん:2010/05/06(木) 13:25:19
>>718-719
ありがとうございます。
There is an example in libs/smart_ptr/test/collector_test.cpp that shows how
to use libs/smart_ptr/src/sp_collector.cpp to detect (and optionally
reclaim) shared_ptr cycles. You have to #define BOOST_SP_ENABLE_DEBUG_HOOKS
for your project and add sp_collector.cpp to it.
実は既にBoostにあるんですね。
全然分かりませんでした。

ありがとうございました。
721デフォルトの名無しさん:2010/05/06(木) 15:34:33
同じ内容の非constメンバ関数とconstメンバ関数を定義してあるソースを見るんですが何のためなんですか
722デフォルトの名無しさん:2010/05/06(木) 15:39:25
>>721
非constメンバ関数からもconstメンバ関数からも呼べるように多重定義してある

本当はmutableを使うとconstメンバ関数一個で済むんだけど、mutableは
出来るだけ使わないようにって不文律があるんでな

そうしたければそうしてもいい
723デフォルトの名無しさん:2010/05/06(木) 15:41:44
>>721
両方あると便利だから。
--
Ex.:
class Foo {
int get() const {return x;}
int get() {return x;}
};
Foo a;
Foo const & b = a;
a.get(); // 非const版が呼ばれる
b.get(); // const版が呼ばれる(非const版は呼べない)
724デフォルトの名無しさん:2010/05/06(木) 15:44:40
なるほど
ありがとうございました
725デフォルトの名無しさん:2010/05/06(木) 15:47:10
>>724
おまえ、その説明で満足なんか?
726デフォルトの名無しさん:2010/05/06(木) 15:57:04
本質には関係無いけど細かい事いうと>>724はコンパイルエラーだ。

class Foo {
MyClass mem;
public :
const MyClass& get_raw_data() const {return mem;}
MyClass& get_raw_data() {return mem;}
};

これで意義が分かるのでは。
727デフォルトの名無しさん:2010/05/06(木) 16:06:30
>>723
あほかwwww
728デフォルトの名無しさん:2010/05/06(木) 16:09:17
>723滅多打ちw
729デフォルトの名無しさん:2010/05/06(木) 20:26:17
void f(std::istream &s)
{
    // ストリームを使って何か処理
}

これって引数がテキストモードなのかバイナリモードなのか判断する方法はありますか?
730デフォルトの名無しさん:2010/05/07(金) 16:15:51
class BBB : public AAA {} ←この中括弧の意味を教えてください
731デフォルトの名無しさん:2010/05/07(金) 16:32:59
継承元のクラスを空実装してんじゃね?
732デフォルトの名無しさん:2010/05/07(金) 16:33:53
>>730

>class BBB : public AAA {
>}

こういう形だと見覚えないかな?
733デフォルトの名無しさん:2010/05/07(金) 18:04:27
【レポート】GCCに匹敵するコンパイラ?! LLVM - BSDCan2008 | エンタープライズ | マイコミジャーナル
ttp://journal.mycom.co.jp/articles/2008/06/03/bsdcan6/index.html
734デフォルトの名無しさん:2010/05/07(金) 18:57:09

1/pow(n, x)を高速で計算するにはどうすればいいですか? 
誤差はあってもいいです。実値より大きくずれなければ。

1 < n < 3000000 、 0 < x < 1
735デフォルトの名無しさん:2010/05/07(金) 18:59:56
>>734
>誤差はあってもいいです。実値より大きくずれなければ。

これが難しいんだよ

nの値によってズレ方が変わるからな

条件分けが必要
736デフォルトの名無しさん:2010/05/07(金) 19:23:49
>>734
例えば2重のループでnとxを繰り返すなら、ln(n)を配列に保存してexp(ln(n)*x)の式で再利用する。
737デフォルトの名無しさん:2010/05/07(金) 19:27:21
expとpowは圧倒的に速度差出るんでしょうか?
pow関数はexpに展開するのが標準って事ですか。
738デフォルトの名無しさん:2010/05/07(金) 19:36:20
>>737
それくらい試せば良いじゃん。
739デフォルトの名無しさん:2010/05/07(金) 19:38:09
サンクス。最善は>>736ってことでしょうか。
expをマクローリン展開して上位のこうだけ使うのもありげてすが。
実測がいいですね。
740デフォルトの名無しさん:2010/05/07(金) 19:45:04
>>739
> expをマクローリン展開して上位のこうだけ使うのもありげてすが。
それはexpの実装で既に行なわれていそうな気がしてならないけど。
まあ誤差がどのくらいまで許せるのかってことに大いに依存するよね。
741740:2010/05/07(金) 19:47:03
>>739
あとxの絶対値が1未満ってのはマクローリン展開において
すごい収束がよくなりそうだけど、それでもn=3000000は
巨大すぎて誤差がデカめになりそうだ。

まあ実際にやってみてよ!
742デフォルトの名無しさん:2010/05/07(金) 19:49:40
logやlnを求める漸化式ってあったっけ?あったら前回の計算結果が使えるな。
743740:2010/05/07(金) 19:58:13
>>742
どういう数列を想定しているのかしらないけど、普通はないよ。
例えば数列{log(n)|n=1, 2, 3, 4, ・・・}であれば漸化式はない。

しかしながら
 log(2), log(4), log(8), log(16), ・・・
すなわち
 {log(2^n)|n=1, 2, 3, 4, ・・・}
のような数列だったりすれば
log(2^n) = n * log(2)
と変形する事で容易に計算できる。
744デフォルトの名無しさん:2010/05/07(金) 21:56:00
>>738
こういう奴って馬鹿でしょ?
試さないとわからないのか?

しかも、
FuncA FuncBを比較したとき
FuncAの実行時間が短かったとしたとしても、今後永続的に
FuncAの実行時間がFuncBの実行時間よりも短いなんてどうしたらいえる?
745デフォルトの名無しさん:2010/05/07(金) 22:05:21
普通、試してから聞かね?
746デフォルトの名無しさん:2010/05/07(金) 22:20:38
>>744
同感

具体的にどこでどんなアルゴリズムが使われていて、
それがどのくらい一般的かを示したうえで
定量的な考察を述べるならともかく、
そのへん全然わかんねークルクルパーが態度だけでかいのは許し難いね

直列を前提とした場合に遅いと言われていたアルゴリズムが、
並列もありになったら話が違ってきたとかなら読み応えがあるのに
そういう内容がないよう
747デフォルトの名無しさん:2010/05/07(金) 22:30:37
オーダーの計算は係数が無視されてるから状況次第でいくらでも優劣が逆転する
結局のところ測るしかないんだよ
748デフォルトの名無しさん:2010/05/07(金) 22:43:14
実際に使うNの範囲で
無視可能な係数の範囲は分かるけどね
749デフォルトの名無しさん:2010/05/08(土) 08:58:00
おまえら優しいなスレ違いなのに
750デフォルトの名無しさん:2010/05/08(土) 10:28:58
splitのデミリタが1文字ではなく文字列の場合はどのようにすればいいでしょうか?
ぐぐっても1文字のデミリタ用のしかでてきませんでした。
boostも試してみましたが1文字分割しかできません。
751デフォルトの名無しさん:2010/05/08(土) 12:41:10
1時間探してアホらしくなったので自分で作ったら5分でできました。
割と使われそうな内容なのになんでグーグルででてこないんだろう・・・検索の仕方悪いのかな・・・
グーグルで出てくるのは全部find_fist_ofでデミリタ検索してるから"abc"って渡すとaとbとcで区切るんですね。
単にそれをfindにするだけでした。
752デフォルトの名無しさん:2010/05/08(土) 12:59:19
delimiter
デリミタです><
753デフォルトの名無しさん:2010/05/08(土) 13:02:00
すいません><
754デフォルトの名無しさん:2010/05/08(土) 17:40:32
>>735
謝罪の心が感じられるので特別に許してあげる。
755デフォルトの名無しさん:2010/05/08(土) 17:52:28
>>750
regex_token_iteratorってのがあるみたいだけど、わざわざ正規表現使うのもアレだな
756デフォルトの名無しさん:2010/05/08(土) 18:02:26
delete instance;と書くと~instance()が呼び出されますが、
~instance()を呼び出すだけじゃダメなの?
757デフォルトの名無しさん:2010/05/08(土) 18:12:14
だめです
758デフォルトの名無しさん:2010/05/08(土) 19:12:09
みんなC++やってて具体的な成果残せた?
759デフォルトの名無しさん:2010/05/08(土) 19:16:25
>>758
ライブラリ自作して満足してるな。
具体的に作りたいものあるけど、毎日気が乗らない。
760デフォルトの名無しさん:2010/05/08(土) 19:28:06
具体的に作りたいものkwsk
761デフォルトの名無しさん:2010/05/08(土) 19:43:09
>>756
deleteから~instance()が呼び出されるわけであって
~instance()がメモリを開放するわけでもない
762756:2010/05/08(土) 19:44:28
>>761,>>757
thx
763デフォルトの名無しさん:2010/05/08(土) 20:09:10
>>755
boostは遅いからやめておけ
自作したほうがいい
764デフォルトの名無しさん:2010/05/08(土) 21:34:49
>>758
俺的には HDL のウイザードとジェネレータが最高傑作かな
俺自身がそのコードを触れなくなってしまったのが悲しい
765デフォルトの名無しさん:2010/05/08(土) 21:53:11
>>764
噴いたw

大風呂敷にもほどがあんだろ?w
766デフォルトの名無しさん:2010/05/08(土) 22:16:36
>>763
十分な速度が出ていると思うが。
自作とか不可能です。
767デフォルトの名無しさん:2010/05/08(土) 22:19:44
>>766
あの程度の速度で十分なら使えば?
768デフォルトの名無しさん:2010/05/08(土) 22:27:46
>>767
ああ、いや俺は別人だ。
まあ十分だろ。
boost::xpressiveね。
769デフォルトの名無しさん:2010/05/08(土) 22:29:05
自作でboostを超えられるヤツは
そう居ないと思うが。
770デフォルトの名無しさん:2010/05/08(土) 22:31:52
>>769
boostの凄さは速度じゃないぞ
あの、汎用性だぞ

確かに、あそこまで汎用的なクラスライブラリを自作できる奴
少ないだろが、特定の処理だけの速度なら超えれるぞ
771デフォルトの名無しさん:2010/05/08(土) 22:34:15
超えられるんならboostの開発メンバーのフォーラムに
にここをこうすれば良いッスよってレクチャーしてくださいよ
772デフォルトの名無しさん:2010/05/08(土) 22:38:44
boost::shared_ptrとかも遅い遅いと言われるけど
実際にそれより速くて色々と安全なスマポを
自作できるやつって少ないんだよね。

Loki Libraryのスマポにすら遅いとか
言うやついるしなぁ。
773デフォルトの名無しさん:2010/05/08(土) 22:41:55
汎用性犠牲にすれば速く出来るってだけだろ
それぐらいできてもらわないと困るわ
774デフォルトの名無しさん:2010/05/08(土) 22:43:12
自作できないと、遅いと言っちゃいけないのか?

VISTAが遅いと評判だったが、VISTAを自作できる奴が多いとは
とても思えんが?
775デフォルトの名無しさん:2010/05/08(土) 22:44:19
Vistaが遅い?
776デフォルトの名無しさん:2010/05/08(土) 22:45:38
正規表現を利用するのに特化したライブラリ取ってきて使えばいいだけじゃん
俺って頭いいなぁ
777デフォルトの名無しさん:2010/05/08(土) 22:47:32
>>774
遅いというなら自作ができるのがC++のメリット。自由ね作ればいい。
だけどshared_ptrより速い同等な機能のスマポはまず作れないということ。
機能制限版を作ったとしてもshared_ptrよりわずかに速いだけ。
778デフォルトの名無しさん:2010/05/08(土) 22:52:09
shared_ptrなんて、使うか?
C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず

そうでないなら、JAVAやC#なんてオコチャマ言語でも使ってればw
779デフォルトの名無しさん:2010/05/08(土) 22:55:34
GCは気持ち悪いけどスマポは気持ち悪くない
780デフォルトの名無しさん:2010/05/08(土) 22:55:37
ただの道具にお子様も糞もねえよ
781デフォルトの名無しさん:2010/05/08(土) 22:58:50
shared_ptrがどこで破棄されるか分からないとか・・・
shared_ptrを何だと思ってるんだろう
782デフォルトの名無しさん:2010/05/08(土) 22:59:14
>>778
コンテナにポインタ入れてポリモーフィズムやらせたくないの?
783デフォルトの名無しさん:2010/05/08(土) 23:02:20
>>782
コンテナにポインタ入れるのになぜshared_ptr?
お前はまずC++を勉強してからレスしろ
784デフォルトの名無しさん:2010/05/08(土) 23:04:32
>>783
楽で安全だからだろ?
785デフォルトの名無しさん:2010/05/08(土) 23:05:54
>>778
shared_ptr 使ったらどこで破棄されるか分からなくなる、などということはない。
実行時に決まるようになるだけ。
786デフォルトの名無しさん:2010/05/08(土) 23:14:01
うわぁwww

>>778
> C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず
うむ。だからshared_ptrを使うんだけど。
787デフォルトの名無しさん:2010/05/08(土) 23:28:19
shared_ptrをどんな使い方をしたらどこで破棄されるか分らなくなるの?
788デフォルトの名無しさん:2010/05/08(土) 23:31:49
>>783が酷い件について
右辺値参照があれば話は変わるが
789デフォルトの名無しさん:2010/05/08(土) 23:32:42
C++屋ってw

ヘンテコな名前の方じゃないですよねw
790デフォルトの名無しさん:2010/05/08(土) 23:36:03
>>783
え?
コンテナに生はいかんでしょ
791デフォルトの名無しさん:2010/05/08(土) 23:36:20
C++屋ってチャオプラヤみたいだな
792デフォルトの名無しさん:2010/05/08(土) 23:37:09
>>790
なぜ?
793デフォルトの名無しさん:2010/05/08(土) 23:39:58
ちょっとテスト書き込みさせてくれ。
794デフォルトの名無しさん:2010/05/08(土) 23:40:42
あれれー?
795デフォルトの名無しさん:2010/05/08(土) 23:40:45
だが断る
796デフォルトの名無しさん:2010/05/08(土) 23:43:34
>>787
循環参照以外の問題ってあるっけ?あれも対策あるし。
797デフォルトの名無しさん:2010/05/08(土) 23:44:37
それこそいつ破棄するべきかわかわからないでしょ。いちいちこんなこと書くの?
std::vector<int*> v(10);
v[3]=new int(4);
delete v[3]; //更新前に削除しないとね。あーめんどくせ
v[3]=new int(3);
v.clear(); //盛大にリーク
スマポなら
std::vector<shared_ptr<int>> V(10);
v[3]=make_shared<int>(4);
v[3]=make_shared<int>(3);//スマポは更新前の値なんて気にしません。
v.claser();//きれいに削除
798デフォルトの名無しさん:2010/05/08(土) 23:48:00
>>797
× v.claser();//きれいに削除
○ v.clear();//きれいに削除
799デフォルトの名無しさん:2010/05/08(土) 23:49:46
我々は釣られたのだ
800デフォルトの名無しさん:2010/05/08(土) 23:49:52
>>797
JAVAでもやれば
801デフォルトの名無しさん:2010/05/08(土) 23:51:49
shared_ptrを使えといってるのでは?
802デフォルトの名無しさん:2010/05/08(土) 23:52:03
boost::ptr_vectorっていうのもあるんだが・・・・
選択肢が広いという利点がある
803デフォルトの名無しさん:2010/05/08(土) 23:52:48
shared_ptrのコストがどうしても気になるならptr_vectorという選択肢もある。
804デフォルトの名無しさん:2010/05/08(土) 23:55:18
ptr_vectorはvector<unique_ptr<T>>に集約されそうだね。
805デフォルトの名無しさん:2010/05/09(日) 00:00:25
vector<unique_ptr<T>>ってソートとか普通にできんの?
806デフォルトの名無しさん:2010/05/09(日) 00:25:39
>>805
ムーブかスワップでソートを実装すればできるんじゃね?
807デフォルトの名無しさん:2010/05/09(日) 00:45:59
shared_ptrがいまいちわかってない俺ガイル
自分のコードだけで使うなら勝手に削除してくれるのはわかるんだけど
ライブラリに生ポインタ渡さないといけない場合、まだライブラリが使ってるのに削除しちゃったりしないか考えてると
よくわからなくなってくる
808デフォルトの名無しさん:2010/05/09(日) 00:46:12
要素の追加すらめんどくさそうだな
809デフォルトの名無しさん:2010/05/09(日) 00:48:32
ValueSwappable かつ *first が MoveConstructible かつ MoveAssignable でさえあればソートは可能だし、
事実 std::sort などはそう要求している(C++0xで)
810デフォルトの名無しさん:2010/05/09(日) 00:49:54
>>807
ライブラリを使う時に shared_ptr を複製して、
ライブラリの後始末をする時に破棄すればいい
811デフォルトの名無しさん:2010/05/09(日) 00:51:05
>>807
ライブラリのドキュメントを読めばすむ問題。
812デフォルトの名無しさん:2010/05/09(日) 00:54:35
>>810
なるほど
そういうことをするラッパークラスを作るのがいいのかなぁ
813デフォルトの名無しさん:2010/05/09(日) 02:42:53
用途によると思うが、
std::vector<MyClass> vecと
std::vector<MyClass*> vec
ってどっちがいいの?
814デフォルトの名無しさん:2010/05/09(日) 02:45:41
そんなのお前にしか分からんだろ
815デフォルトの名無しさん:2010/05/09(日) 02:53:16
>>813
後者はboost::ptr_vectorに入れた方が何かと都合がいい
816デフォルトの名無しさん:2010/05/09(日) 02:54:10
>>813
あと前者はそもそもポリモーフィズムできんぞ
コンテナに入れるオブジェクトのサイズは一定でないと
817デフォルトの名無しさん:2010/05/09(日) 02:56:38
>>816
この手の質問する馬鹿がポリモーフィズムなんて分かるかよ、ボケ
818デフォルトの名無しさん:2010/05/09(日) 03:47:34
所有権の認識が曖昧なまま生ポインタ使うとか恐ろしすぎる
819デフォルトの名無しさん:2010/05/09(日) 05:09:02
ばか
ポインタとセックスは生が最高なんだよ
820デフォルトの名無しさん:2010/05/09(日) 05:11:12
と、童貞が申しております
821デフォルトの名無しさん:2010/05/09(日) 08:55:30
>>819
> セックスは生が最高
そんなでもないんだぜ、案外
822デフォルトの名無しさん:2010/05/09(日) 09:11:04
constメソッドのメリットを教えて

823デフォルトの名無しさん:2010/05/09(日) 09:13:40
>>822
メソッドじゃなくてメンバ関数ね。

メリットも何もないと死ねる。
例えば
int foo(const MyClass& arg)
{
return arg.m_func();
}
でm_func()がconstメンバ関数じゃないとコンパイルエラー。
824デフォルトの名無しさん:2010/05/09(日) 09:16:11
インスタンスの状態変更のない事が保障されてるからconst参照、constポインタからでも呼べられるし
コピーや変態キャストに伴うメモリ状態同一性が問われる気持ち悪いコードを書いているときも結構諜報する。
825デフォルトの名無しさん:2010/05/09(日) 09:17:13
>>823
int foo(MyClass& arg)
{
return arg.m_func();
}

とすれば、いいのでは?
826デフォルトの名無しさん:2010/05/09(日) 09:18:53
>>825
                        ,、 '";ィ'
________              /::::::/l:l
─- 、::::;;;;;;;;;`゙゙''‐ 、    __,,,,......,,,,_/:::::::::/: !|       またまたご冗談を
  . : : : : : : `゙'ヽ、:::゙ヾ´::::::::::::::::::::::`゙゙゙'''‐'、. l|
、、 . : : : : : : : : r'":::::::::::::::::::::::::,r':ぃ::::ヽ::::::::ヽ!                 ,、- 、
.ヽ:゙ヽ; : : : : : :ノ:::::::::::::::::::::;;、-、、゙:::     rー-:'、                /   }¬、
. \::゙、: : : :./::::::::::::::;、-''"::::::::::   ,...,:::,::., :::':、            _,,/,,  ,、.,/   }
   ヽ:ヽ、 /:::::::::::::::::::::::::     _  `゙''‐''"  __,,',,,,___       /~   ヾ::::ツ,、-/
     `ヽ、:::::::::;;;、、--‐‐'''''',,iニ-    _|  、-l、,},,   ̄""'''¬-, '  ''‐-、 .,ノ'゙,i';;;;ツ
   _,,,、-‐l'''"´:::::::'  ,、-'" ,.X,_,,、-v'"''゙''yr-ヽ / ゙゙'ヽ、,    ,.'      j゙,,, ´ 7
,、-''"    .l:::::::::::;、-''"  ,.-'  ゙、""ヾ'r-;;:l  冫、     ヽ、 /    __,,.ノ:::::ヽ. /
       l;、-'゙:   ,/      ゞ=‐'"~゙゙') ./. \    /  '''"/::::;:::;r-''‐ヽ
     ,、‐゙ ヽ:::::..,.r'゙         ,,. ,r/ ./    ヽ.   ,'     '、ノ''"   ノ  
   ,、‐'゙     ン;"::::::.       "´ '゙ ´ /      ゙、 ,'            /
  '     //:::::::::            {.        V           /
        / ./:::::::::::::            ',       /         /
.    /  /:::::::::::::::::.            ',.      /   ,.、     /
827デフォルトの名無しさん:2010/05/09(日) 09:19:08
>>825
fooの中で引数に渡したオブジェクトが変更されてたら困るだろ。
828デフォルトの名無しさん:2010/05/09(日) 09:20:52
COM扱ってるとconst邪魔なんだよね
829デフォルトの名無しさん:2010/05/09(日) 09:22:26
質問者>>822の「constメソッドのメリットを教えて」に対する回答にconst抜きにすればいいのでは?というのは「またまたご冗談を」
830デフォルトの名無しさん:2010/05/09(日) 09:22:39
なぜ?(constが邪魔な理由と今更COMを扱っている事に大して)
831823:2010/05/09(日) 09:25:26
>>825
一体全体どこの言語ご出身の方かしりませんが、
まあ適当な書籍、『Exceptional C++』とかを熟読して
constの有用性について学んでください。

それで納得できないならC++は使えない。間違いなく。
832デフォルトの名無しさん:2010/05/09(日) 09:28:59
>>827
それはわかりますが、fooの中では、”オブジェクトの変更をしない”と覚えておけばいいだけでは?
833デフォルトの名無しさん:2010/05/09(日) 09:32:28
>>832
constが導入されていない時代はまさにそれだった。
それを明示的に示し、違反が合った場合にはコンパイラが自動的にエラーを出せる様にした
システムがconstとconstメソッド。
834デフォルトの名無しさん:2010/05/09(日) 09:32:58
そのfooの中を作った人間だけが、fooを使うとは限らない。
const 付いていれば、変更されないのが誰にでも理解できるし。
835デフォルトの名無しさん:2010/05/09(日) 09:33:44
>>832
ちなみにfooにがconstメンバ関数でもnon-constメンバ関数でも、
普通にconst MyClass& argのargから呼び出す事は可能なので、
毎回const版とconstじゃない版を用意する必要はない。
836デフォルトの名無しさん:2010/05/09(日) 09:34:40
>>832
変更されないことをコンパイラはどうやって知ればいい?
関数の中の処理を全て検査した後に「このポインタ(参照)の先にあるメモリは変更されない」と分かるというのなら、実用性がなさ過ぎて最適化の阻害になる。
837デフォルトの名無しさん:2010/05/09(日) 09:34:54
”オブジェクトの変更をしない”ということを覚えておいて機械的にチェックする作業をコンパイラに任せるのがconstの目的。
constの目的を理解できないアホでも間違いを起こさないようにするのがconstの意義。
mutableやconst_cast使いまくりでconstの意義を破壊するのが基地外。
838デフォルトの名無しさん:2010/05/09(日) 09:35:07
もう一回テスト書き込みさせてくれ
839デフォルトの名無しさん:2010/05/09(日) 09:36:52
>>832
それにfooの中では”オブジェクトの変更をしない”と覚えておいても、
そのfooが呼び出す別のメンバ関数がオブジェクトを変更してしまう可能性も考えられる。
小さなコードなら良いけど、そのすべてを記憶だけでやると危険なことになりかねない。
840デフォルトの名無しさん:2010/05/09(日) 09:37:54
>>833
そうですか
なぜこのようなことを聞いたというと
例えば、std::vectorでも
iterator begin()
const_iterator begin() const
と2つも実装してるみたいだし、面倒では?
と思ったからです。使う側は面倒ではないですけど。
841デフォルトの名無しさん:2010/05/09(日) 09:42:01
実装者の労力と使用者の利便性はトレードオフだろうがガキ
842デフォルトの名無しさん:2010/05/09(日) 09:44:16
>>840
面倒依然に、その二つは機能が違う。
非constのbegin関数はコンテナの中を変更することが可能なiteratorを返すが、begin() constはコンテナの中を変更できないわけで。
843デフォルトの名無しさん:2010/05/09(日) 09:56:47
>>842
いや、だからその変更できないようなiteratorをあえて使う必要があるか?ということです。
変更できるiteratorを取得しても、変更しなければいいだけの話では?
844デフォルトの名無しさん:2010/05/09(日) 10:00:14
constそのものの説明をしてやらなきゃこいつはだめじゃないか
845デフォルトの名無しさん:2010/05/09(日) 10:00:26
保守する人が変わっても
未来永劫それが徹底できるならね
846デフォルトの名無しさん:2010/05/09(日) 10:03:25
保守する人がconstを知らず、constを使わないコードを量産する事も・・・
847デフォルトの名無しさん:2010/05/09(日) 10:08:26
const参照で引数を受けとればその引数に対して
関数の内部で非constの操作がコンパイルエラーになる
要するにうっかり防止、人間はミスをする前提で考えるのが常識
拳銃についてるセーフティみたいなもんだよ
あとconst参照にしてればテンポラリオブジェクトを渡すのが合法になるがこれも結構大きなメリットになる
iteratorに関しては色々理由があってconst_iteratorを選択するメリットはあまり無いんじゃなかったか?
848デフォルトの名無しさん:2010/05/09(日) 10:09:13
constを知っていても、const_castで外してしまったらどう保障するのでしょうか?

上のレスをみてると、じゃあ、なぜconst_castなるものが存在するのでしょうか?
849デフォルトの名無しさん:2010/05/09(日) 10:11:29
選択するも何も、constなコンテナだと
const_iteratorかconst_reverse_iteratorしか選択肢ないだろ

constじゃなくてもsetはconst_iteratorしかない
850デフォルトの名無しさん:2010/05/09(日) 10:12:12
>>848
constのない、古いコードやバカの書いたコードに渡すため
851デフォルトの名無しさん:2010/05/09(日) 10:12:28
>>848
自前で用意したクラス、インスタンスなら必要ないかもしれない
けど、他人が用意したものでconstなインスタンスしか参照できないとき
const使わないと何もできないぞ
852デフォルトの名無しさん:2010/05/09(日) 10:13:33
>>850
あたなのいうところのバカが書いたコードをバカではないあなたが利用する理由は?
853デフォルトの名無しさん:2010/05/09(日) 10:14:19
const外ししたものに保証なんて無いよ
854デフォルトの名無しさん:2010/05/09(日) 10:14:48
>>852
会社の自前ライブラリの使用を強制される場合は
そういうことがいくらでもある。
855デフォルトの名無しさん:2010/05/09(日) 10:15:30
自分じゃ変更できない外部ライブラリにconstがついてない時とかに
const_castを使う
あと、COMを利用するときとか(COMにconstがないので)

constありの関数となしの関数を実装する時に、
const_castを利用して実装をまとめることもある
856デフォルトの名無しさん:2010/05/09(日) 10:16:54
>>854
ということは、あなたがいうバカが存在する会社と勤務乃至付き合いがある理由は?
857デフォルトの名無しさん:2010/05/09(日) 10:17:46
釣りはそこまでだ
858デフォルトの名無しさん:2010/05/09(日) 10:17:59
>>856は逃げに入りました
859デフォルトの名無しさん:2010/05/09(日) 10:18:28
Fishing is over
860デフォルトの名無しさん:2010/05/09(日) 10:18:30
test
861デフォルトの名無しさん:2010/05/09(日) 10:18:40
constを理解しようとしない馬鹿にも理解できそうなconstのメリットを一つ。
あるインスタンスのconst参照を渡す関数の前後でそのインスタンスは同値であることが期待できる。
従って、それ故の最適化が可能。これが非const参照を要求する関数であれば、その最適化はできない。
従って、const参照によるパフォーマンスの向上の可能性がある。
const参照がconstメンバ関数であっても理屈は同じこと。
862デフォルトの名無しさん:2010/05/09(日) 10:19:04
>>856
論破されたからって関係ない話を持ち出し始めるなよクズ
863デフォルトの名無しさん:2010/05/09(日) 10:22:52
constのない言語がほとんどだから
なくてもいいんじゃない?と思う人がいるのは分からなくもない
864デフォルトの名無しさん:2010/05/09(日) 10:22:53
>>848
const外しをした場合の動作が未定義なことくらい知っておけよ
865デフォルトの名無しさん:2010/05/09(日) 10:24:26
const外し全般が未定義はないわ

const int n = 0;
const_cast<int&>(n) = 1;
は未定義だが
866デフォルトの名無しさん:2010/05/09(日) 10:24:49
バカバッカだなw
結局constの有用性を説明できたのごく小数だったなw
867デフォルトの名無しさん:2010/05/09(日) 10:25:55
>>862
そのままおまえに返すよw

論破されたからって関係ない話を持ち出し始めるなよクズ
868デフォルトの名無しさん:2010/05/09(日) 10:27:42
自分にとって都合の悪いことには答えないんですね。分かります。
869デフォルトの名無しさん:2010/05/09(日) 10:28:26
折角いい流れだったのに台無しだな
870デフォルトの名無しさん:2010/05/09(日) 10:28:27
最近、内の会社にもいますよ
二言目には「〜の理由は?」って奴、アフォかと
話もしたくない
871デフォルトの名無しさん:2010/05/09(日) 10:28:39
他のスレでもこういうアホ見かけたな
最後には逃げる奴
872デフォルトの名無しさん:2010/05/09(日) 10:29:29
>>871
自分自身だったりしてw
873デフォルトの名無しさん:2010/05/09(日) 10:30:39
┐(゚〜゚)┌
874デフォルトの名無しさん:2010/05/09(日) 10:30:57
面白いテーマの掲示板が出来る。
 ↓
面白い人が集まってきて、面白いことをはじめる。
 ↓
面白くない人も大勢見に来る。
 ↓
面白くない人が面白い人の真似をしはじめる。
 ↓
面白くない人がやっても面白くない。
 ↓
面白くない人のほうが多いので、面白くないものの比率があがる。
 ↓
掲示板が面白くなくなって、面白い人がいなくなる。
 ↓
緩やかに過疎。
875デフォルトの名無しさん:2010/05/09(日) 10:32:05
はい、次のネタどうぞ

876デフォルトの名無しさん:2010/05/09(日) 10:34:30
上にconst int n = 0;ってあったが、
こういうコンパイル時に決まる静的な値だけで初期化された定数のことを指す用語ってあんの?
877デフォルトの名無しさん:2010/05/09(日) 10:36:17
>>861
それは無い。

定義時の const であれば別だけど、参照への const の有無だけでは
エイリアスの可能性(最悪グローバル変数経由とか)が消えないので、
コンパイラは変更されていないことを前提にできない。

参照への const の有無で最適化の結果が変わるようなコード、作れる?
878デフォルトの名無しさん:2010/05/09(日) 10:51:24
>>876
そのまんま。
コンパイル時定数(Compile-time constant)
879デフォルトの名無しさん:2010/05/09(日) 10:53:45
>>878
そのまんまだな。ありがとう。
880デフォルトの名無しさん:2010/05/09(日) 10:57:41
constの存在意義を聞いてるのに、あるもんはあるんだから仕方ないだろ、なんて
思考停止じゃ答えになってねーだろ。
881デフォルトの名無しさん:2010/05/09(日) 11:01:16
>>880
んなこと誰も言ってねーだろ死ねば?
882デフォルトの名無しさん:2010/05/09(日) 11:01:22
誰もそんな答えしてないだろ。
883デフォルトの名無しさん:2010/05/09(日) 11:02:35
バカには理解できなかったんだろう
884デフォルトの名無しさん:2010/05/09(日) 11:05:23
こういうヤツには頼むからC++使って欲しくない
ゆとりでも使える高級言語で満足して帰ってくれ
885デフォルトの名無しさん:2010/05/09(日) 11:08:33
最近の言語で軒並みconstが採用されないことからも
constはあまり重要なものでないと分かる
886デフォルトの名無しさん:2010/05/09(日) 11:10:45
constに出来ないんじゃないの
887デフォルトの名無しさん:2010/05/09(日) 11:11:05
constをつけ始めるとコンパイルエラーが頻発する。
すなわち、今まで危ない橋をいかに多く渡ってきたのが明確になってぞっとする。
そうなるとconst1を丁寧につけて、機械的に検出できる部類のバグはコンパイル時に解決してするありがたさが分かる。
888デフォルトの名無しさん:2010/05/09(日) 11:20:22
>>885
constもtypedefもないC#はVMの都合のような気がする。もしC#にconstを採用したら、VB.netで悲鳴が上がるんじゃないか?
まあいまさら追加できないだろうけど
889デフォルトの名無しさん:2010/05/09(日) 11:28:22
Dはconstどころかinvariantとかimmutableとかfinalとか余計に複雑になってる
890デフォルトの名無しさん:2010/05/09(日) 11:31:00
>>828
わかる
891デフォルトの名無しさん:2010/05/09(日) 11:31:58
readonlyはあるよね
892デフォルトの名無しさん:2010/05/09(日) 11:32:02
>>885
最新の言語といってもスクリプトだからな。
893デフォルトの名無しさん:2010/05/09(日) 11:33:01
スクリプトはconst以前の問題だしな
ああいった言語は安全性より手軽さだからそれでいいけど
894デフォルトの名無しさん:2010/05/09(日) 11:35:09
>>891
readonlyは参照を変更できないだけで、参照先のオブジェクトを変更できないわけではない。 const T&やconst T*とは意味が異なるので今の議論とは関係ない。
895デフォルトの名無しさん:2010/05/09(日) 11:37:15
スクリプト言語でもgetterのみのプロパティとかは、意味的にconstに近いだろう。
896デフォルトの名無しさん:2010/05/09(日) 11:38:49
>>895
const相当のgetterのみの使用に一時的な限定する機構があるならばね。
897デフォルトの名無しさん:2010/05/09(日) 11:39:48
readonlyのアダプタ使えばええやん
898デフォルトの名無しさん:2010/05/09(日) 11:45:30
>>897
kwskと言いたいとこだが、C++スレなんで3行でお願い
899デフォルトの名無しさん:2010/05/09(日) 11:50:08
いやだからwriteメソッド削ったアダプタかませりゃconstない言語でも安心だろ
900デフォルトの名無しさん:2010/05/09(日) 11:52:46
>>899
constがあればreadメソッドにつけるだけで簡単だろ。
901デフォルトの名無しさん:2010/05/09(日) 11:57:02
>>900
いや、今は無い言語の話をしてんじゃねーの?
902デフォルトの名無しさん:2010/05/09(日) 14:11:39
const一つでここまで熱くなれるおまいらが羨ましい
903デフォルトの名無しさん:2010/05/09(日) 14:25:41
Visual C++って最初から使いこなすのムズいな
いつから使い始めれば良いか、タイミングが難しいけど・・・・いつからやりゃあいいんだ?
最初から他のエディタ使ってると永遠に使わなさそう
904デフォルトの名無しさん:2010/05/09(日) 14:26:55
hoge(T** ptr)とhoge(T*& ptr)はどっちが一般的?
905デフォルトの名無しさん:2010/05/09(日) 14:28:04
どこの一般だよ
906デフォルトの名無しさん:2010/05/09(日) 14:31:05
そもそも使い道が違うし
907デフォルトの名無しさん:2010/05/09(日) 14:33:55
STL/Boost的に考えるなら後者
WinAPI的に考えるなら前者
じゃね?
908904:2010/05/09(日) 14:39:54
関数内部でmemcpyした後にポインタを動かしたいんだけどどっちにするべきかな?と思って
909デフォルトの名無しさん:2010/05/09(日) 14:42:11
memcpy??
どういうことがしたいんだ
910904:2010/05/09(日) 14:46:36
こんな感じ

void hoge(char** dst, char* src, size_t size)
{
memcpy(*dst, src, size);
*dst += size;
}

void hoge(char*& dst, char* src, size_t size)
{
memcpy(dst, src, size);
dst += size;
}
911デフォルトの名無しさん:2010/05/09(日) 14:52:37
すげー怖いコードだな
vector使おうぜ
912デフォルトの名無しさん:2010/05/09(日) 14:53:23
>>910 なら参照だろ。ポインタ使って何かいいことでもあるのか?
913デフォルトの名無しさん:2010/05/09(日) 14:54:34
>>910
たぶん dst をメンバに持つクラスを作ったほうがいい。
914デフォルトの名無しさん:2010/05/09(日) 14:58:38
dstのサイズが分からないから
いくらオーバーしても我関せずだな
915904:2010/05/09(日) 15:00:32
>>911-914
ありがとう
色々試してみる
916デフォルトの名無しさん:2010/05/09(日) 15:31:24
memcpyってどのコンテナのメソッド?
917デフォルトの名無しさん:2010/05/09(日) 15:38:22
vector::insert使えばいい
918デフォルトの名無しさん:2010/05/09(日) 15:47:09
vectorでバッファのアライメント指定できるの?
vector<char>に__attribute__((aligned))付けたら良きに計らってくれるの?
919デフォルトの名無しさん:2010/05/09(日) 15:47:55
テスト
920デフォルトの名無しさん:2010/05/09(日) 15:55:24
>>918 そうはいかない。
921デフォルトの名無しさん:2010/05/09(日) 15:58:13
動的に確保したメモリは最悪の条件でもアラインメントされてるはず
・・・はず
922デフォルトの名無しさん:2010/05/09(日) 15:59:35
>>920
じゃあやっぱりvectorを本物の配列の代わりに使うなんて無理なんだね
923デフォルトの名無しさん:2010/05/09(日) 16:02:22
横槍レス。>>922
どうしてそう言う結論になるん?
924デフォルトの名無しさん:2010/05/09(日) 16:02:33
Visual C++ってコンパイル機能ないのか?
メニュー探してもボタン探してもコンパイル機能らしきものがない
925デフォルトの名無しさん:2010/05/09(日) 16:05:12
あるよ?
926デフォルトの名無しさん:2010/05/09(日) 16:05:18
>>924
ビルドメニューの中にコンパイルって無い?
927デフォルトの名無しさん:2010/05/09(日) 16:08:25
プロジェクトから作ってないとダメなの?
cファイル開いたんだけど
928デフォルトの名無しさん:2010/05/09(日) 16:12:44
memcpy使わざるを得ないのは分かったが
dstのサイズくらい渡しとけ
バッファオーバーフロー攻撃のいい餌食だ
929デフォルトの名無しさん:2010/05/09(日) 16:14:08
>>924
2010のeeだったらメニュー項目が隠されている。
ツールのどっかにチェックがる。
930デフォルトの名無しさん:2010/05/09(日) 16:14:28
>>922
制約が厳しい場面では代わりにならないこともある、というだけのこと。
多くの場面では代わりに使える。無理じゃない。
931デフォルトの名無しさん:2010/05/09(日) 16:18:54
制約が厳しいっても
バイトストリーム扱う時に全く役に立たないって結構致命傷だと思うんだけど
特にC/C++の得意分野を考えると
932デフォルトの名無しさん:2010/05/09(日) 16:21:37
ストリームに使うのはストリームクラスじゃないのか
933デフォルトの名無しさん:2010/05/09(日) 16:23:26
え?iostreamで全部扱えって?
ご冗談でしょう
934デフォルトの名無しさん:2010/05/09(日) 16:23:48
道具なんだから場合によって使い分ければいいじゃない。
935デフォルトの名無しさん:2010/05/09(日) 16:26:00
>>931
「バイトストリーム扱う時」というのが何のことかさっぱりわからない。詳しく。
936デフォルトの名無しさん:2010/05/09(日) 16:26:21
俺が童貞だってconstで定義した奴は出てこいよ!
937デフォルトの名無しさん:2010/05/09(日) 16:27:02
>>931
vector が使えなくても代わりの手段があるだろ。
なんで vector が使えなかったら致命傷になるんだ?
938デフォルトの名無しさん:2010/05/09(日) 16:27:28
>>932
stringstreamじゃないの?
939デフォルトの名無しさん:2010/05/09(日) 16:30:17
>>936
const_castがあるじゃないか
940デフォルトの名無しさん:2010/05/09(日) 16:30:56
コンパイル時定数のconstをconst_castで外したときの動作は未定義です
941デフォルトの名無しさん:2010/05/09(日) 16:34:04
ROMに格納されてたらセグフォだな…
942デフォルトの名無しさん:2010/05/09(日) 16:43:14
>>940
> コンパイル時定数のconstをconst_castで外したときの動作は未定義です
そうなの?外すだけでだめ?

int foo(const MyClass& arg)
{
return const_cast<MyClass&>(arg).m_func_argを変更するメンバ関数();
}

MyClass x;//これがconstでないという前提の下で、
foo(x);
としても未定義の動作ではないんだよね。

いや普通はfooの作者を殴りに行く所だけど、文法的な話で。
943デフォルトの名無しさん:2010/05/09(日) 16:45:09
>>942
"コンパイル時定数"じゃないじゃん
944デフォルトの名無しさん:2010/05/09(日) 16:45:48
それはxがコンパイル時定数じゃないから未定義動作ではない
945デフォルトの名無しさん:2010/05/09(日) 16:48:23
分かりやすい例

const int n = 0;

int main() {
 const_cast<int&>(n) = 1;
 std::cout << n << std::endl;
}

1 と出力されるか 0 と出力されるかは規格では定義されていない
946デフォルトの名無しさん:2010/05/09(日) 16:49:38
>>942
コンパイル時定数の const を外しても書き込んでなければ未定義動作にはならない。
その例の x については書き込んでも未定義動作にはならない。
947デフォルトの名無しさん:2010/05/09(日) 16:50:49
>>945
その場合は未定義動作だから、 1 と 0 のどちらかが出力されるとも決まっていない。
948デフォルトの名無しさん:2010/05/09(日) 16:51:27
おおなるほど、ありがとう。
理解。

俺のレスの後半部分はあんま関係ない例だったっぽいな。

そしてコンパイル時定数でもconst_castするだけならOKなのか。
書き込まなければ。

>>945
> 1 と出力されるか 0 と出力されるかは規格では定義されていない
不定?それとも未定義の動作?
949デフォルトの名無しさん:2010/05/09(日) 17:01:43
>>946
まあそうか

>>948
undefinedだったと思う
950デフォルトの名無しさん:2010/05/09(日) 17:09:53
>>949
サンクス。undefinedか。じゃあ致命的だな。
951デフォルトの名無しさん:2010/05/09(日) 17:13:34
そもそも出力以前に、代入の時点でプログラムが落ちてもおかしくはないな
952デフォルトの名無しさん:2010/05/09(日) 19:57:12
const_castよりもmutableですよ。キャッシュ値を保存するのにmutableは便利。
953デフォルトの名無しさん:2010/05/09(日) 20:09:13
STLとかBOOSTで使う関数オブジェクトってあるじゃないすか
あれって関数オブジェクトを引数に受け取るときはconst参照じゃなくてオブジェクトの複製になってるのは規格や規則で指定されてるんですか?
自分でファンクタを作るときにどっちを前提で書けばいいのか迷ったので質問しました
954デフォルトの名無しさん:2010/05/09(日) 20:12:12
ああいうのは純粋関数のはずだから状態を持ってないわけで
それならconstも何もないってことなんじゃないの?
955デフォルトの名無しさん:2010/05/09(日) 20:13:35
>ああいうのは純粋関数のはずだから
どういうこと?
956デフォルトの名無しさん:2010/05/09(日) 20:14:55
>>953 標準ライブラリの話であれば規格で定められているとおり。
957デフォルトの名無しさん:2010/05/09(日) 20:17:34
>>955
結果が引数のみに依存する関数ってこと
内部状態を持ってる関数だとアルゴリズムに渡したときおかしなことになるから
958デフォルトの名無しさん:2010/05/09(日) 20:19:17
mutable使った事ない。
便利なのは知っているが、そのシチュエーションに遭遇したことがない。
959デフォルトの名無しさん:2010/05/09(日) 20:24:48
>>956
thxです
960デフォルトの名無しさん:2010/05/09(日) 20:28:04
mutableって他で代用出来なくて効果的な使い方なんてあるのか?
961デフォルトの名無しさん:2010/05/09(日) 20:32:31
複雑な計算をして得られる値を使い回したいけど
最初にその値を取得するconstメンバ関数を読んだ時に初めて計算して欲しい時とか
962デフォルトの名無しさん:2010/05/09(日) 20:33:07
mutableはC++を学び始めた時に「何に使うんだこれ」と思っていたが、今でも同じ事を思う。
963デフォルトの名無しさん:2010/05/09(日) 20:34:36
インスタンスの内部キャッシュを作ろうとするとmutableにせざるを得ない。
あとは参照カウントとか。
964デフォルトの名無しさん:2010/05/09(日) 20:37:32
>>958 こんな使い方
キャッシュなど呼び出し側からはオブジェクトの変更を意識する必要が無い場合とか。
const_castを駆使するより、constでも値を変えることができる事を明示するぐらいのメリット。

class hoge
{
mutable bool cached;
mutable int cachevalue;
public:
hoge()
:cached(false)
{
}
int getValue()const
{
if(!cached)
{
cachevalue=func();//すごい遅いけど同じ値が帰ってくることが分ってる関数。
cached=true;
}
return cachevalue;
}

};
965デフォルトの名無しさん:2010/05/09(日) 20:39:51
CRITICAL_SECTIONにmutable付けてみた
966デフォルトの名無しさん:2010/05/09(日) 20:40:33
意外と使いどころあるな
実際そんな使わないけど
967958:2010/05/09(日) 20:40:42
>>964
丁寧にありがとう!
ただ、それって単にmutableとメンバ関数のconst指定を消したらダメなのですかい?
・・・あ、それだと
void foo(const hoge&)
に渡せないってことか。
968デフォルトの名無しさん:2010/05/09(日) 20:41:28
boost::mutexなんかmutableをつけてるぜ俺
969デフォルトの名無しさん:2010/05/09(日) 20:41:46
http://codepad.org/xASzkIWx

mutableいらなくないっすか?
970デフォルトの名無しさん:2010/05/09(日) 20:42:53
getValue自体オブジェクトの状態を変更するような関数じゃないからな
constなのが自然
971デフォルトの名無しさん:2010/05/09(日) 20:44:15
ここらでだれか次スレたのむ
972デフォルトの名無しさん:2010/05/09(日) 20:44:28
>>969
おまいはいちいちmutable回避のためだけに、普段からそんなコードを書いてるのかと小一時間問い詰めたい。
973デフォルトの名無しさん:2010/05/09(日) 20:44:50
>>969
mutableだとキーワードひとつで済む上、目的が一目瞭然なのがメリット
974デフォルトの名無しさん:2010/05/09(日) 20:46:21
そんな遠回しなことしなくても、const_cast すれば代入は出来るだろ
気持ち悪いからやらないけど
975デフォルトの名無しさん:2010/05/09(日) 20:52:03
mutableよりconst_castの方が遠回しだろw
976デフォルトの名無しさん:2010/05/09(日) 20:52:55
どうせなら特定のメンバからのみ変更可能とかにして欲しいわ
他のメソッドからうっかりアクセスして壊れたらどうすんだよ
977デフォルトの名無しさん:2010/05/09(日) 20:53:29
>>974 const_cast で代入はダメだよ。未定義動作の可能性が出てくるだろ。
978デフォルトの名無しさん:2010/05/09(日) 20:54:00
メンバへの代入だから未定義動作にはなんないだろ
979デフォルトの名無しさん:2010/05/09(日) 20:54:49
>>977
const_castの対象がメンバ変数なら
設計の段階でconstじゃない事はわかりきっているから、
未定義の動作にはならないのでは・・・?
980デフォルトの名無しさん:2010/05/09(日) 20:55:20
mutableってマイナーなキーワードかと思ってたけどすごい人気だな。
981デフォルトの名無しさん:2010/05/09(日) 20:58:50
0x学園が興味を持ったようです
982デフォルトの名無しさん:2010/05/09(日) 20:59:52
0xでmutableって言うと
ラムダでキャプチャした変数を変更したい時に使うというあれか
983デフォルトの名無しさん:2010/05/09(日) 20:59:58
mutableは今現在でも仕事はあるが、
export, registerあたりは全く仕事してないと言って良いから
何か有用な使い道を考えてくれ誰か、
984デフォルトの名無しさん:2010/05/09(日) 21:01:05
registerとか管理クラス作るときその名前使わせろ糞がって思うわ
985デフォルトの名無しさん:2010/05/09(日) 21:02:11
exportは0xでめでたくリストラされました
予約語としては残るが
986デフォルトの名無しさん:2010/05/09(日) 21:04:10
registerも0xでdeprecatedになったな
予約語としては残るが
987デフォルトの名無しさん:2010/05/09(日) 21:04:22
>>985
むしろ新たな旅立ちと考えるべきでは。
何に使うのか知らんが、きっと良い案を誰かが考えてくれる。
988デフォルトの名無しさん:2010/05/09(日) 21:15:09
autoタンみたいに再就職先が見つかるといいんだが
989デフォルトの名無しさん:2010/05/09(日) 21:19:28
autoタンは再就職先どころかそっちが
もう本業になっちゃってるよな。
990デフォルトの名無しさん:2010/05/09(日) 21:19:38
>>978-979 クラスでもユーザーが const なインスタンスを作った場合には未定義動作になる。
991デフォルトの名無しさん:2010/05/09(日) 21:21:29
>>984
激しく同意
992デフォルトの名無しさん:2010/05/09(日) 21:22:50
結局const_cast後代入していいのはどういうときなのですか?
993デフォルトの名無しさん:2010/05/09(日) 21:23:33
次スレ立てるからちょっと待て。
994デフォルトの名無しさん:2010/05/09(日) 21:24:31
おk待つ
995デフォルトの名無しさん:2010/05/09(日) 21:24:47
>>992
「結局」どころかこの場にいるほぼ全ての人が
最初から知っていることだが。

大丈夫なのは元がconstじゃないのにconst属性が付いている時。

>>942の例のコードでわかるんじゃね。
996デフォルトの名無しさん:2010/05/09(日) 21:26:17
コンパイル時定数以外なら規格上は代入して良かったんじゃなかったっけ
コンパイル時定数以外の定数もだめなんだっけ?
997デフォルトの名無しさん:2010/05/09(日) 21:27:01
998992:2010/05/09(日) 21:27:32
待てというのに。

次スレ
http://pc12.2ch.net/test/read.cgi/tech/1273407971/

テンプレは今から貼る。
999デフォルトの名無しさん:2010/05/09(日) 21:31:12
うめ
1000デフォルトの名無しさん:2010/05/09(日) 21:32:50
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。