C++相談室 part80

このエントリーをはてなブックマークに追加
502デフォルトの名無しさん
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。