namespace hoge { class Test; } class Test;とするとclass Test{}と同じ意味になるのですか?
ならない
宣言と定義は違う
505 :
502 :2010/05/02(日) 11:17:24
それじゃ、前方宣言なのかな? class Test; namespace hoge{} って、普通なら書く気がすんだけど
namespace内に閉じこめるかどうか
::Test じゃなくて hoge::Test を宣言したかったんでしょ
508 :
502 :2010/05/02(日) 11:38:57
namespace hoge { void __stdcal fuga(void); } この関数をDLLにしてエクスポートするにはどうすればいいんですか?
>>509 DLLって何ですか?
ここはC++相談室ですけど。
511 :
デフォルトの名無しさん :2010/05/02(日) 14:59:36
えっとtemplate template....何とかって知っている? 使ったことある?
とあるソフトの設定ファイル関係のクラスを読んでいます メンバ変数をpublicにしているようですが、お前らだったらprivateにする?
privateにする理由がわからん。 外から書き込まれるのを禁止したかったら、コメントを入れておけば十分 privateにして、わざわざアクセサ書くの面倒だし、無駄なオーバーヘッドあるし。
privateにしたほうがいいんだろうなあ と思いつつも面倒だからpublicにしてしまう
複数でやってるようなプロジェクトならprivate/protectedにしてget/setメソッドを 実装するのが普通だろうが、一人でやってるようなものはすべてpublicでOK
アクセサならまずinline化がきくから、実行時オーバーヘッドは無いだろ。
一人でやっていようがメンバ変数はprivateだろ。
>>516 中途な知識でinlineなんて言葉使うと突っ込まれるぞ
ちなみに、inlineとしてコンパイラからみえないこともあるんだぞZ
519 :
512 :2010/05/02(日) 16:10:38
以前、設定ファイルをprivateにしたときは、 get/setだらけのクラスが出来上がって気持ち悪いことになりました でも、publicだらけにするのも気持ち悪い
ただ読んで使うだけならいいかもしれないけど、 後でエラーチェックが必要になったときとかにその変数にアクセスしてる全ての箇所を 修正するのとget/setの中だけ修正するのとどっちが仕様変更に強い良いプログラムかってことだな。
>inlineとしてコンパイラからみえないこともあるんだぞ どういう意味か教えてほしい
>>521 inlineとしても展開されないことがあるといいたいんだろう。
でも展開されないアクセサはまずないだろう。
>>519 そのような値を持つだけで機能が無いものは構造体にしてもいいと思うよ。
機能を持ち、メンバー変数を隠蔽するのはclassでと使い分けるのもいいと思う。
他人が書いたコードを読んでいたら 「GetER()->AddErrorMessage("エラー")」という箇所がありました。 エラーを処理しているメンバ関数みたいなのですが なぜ関数にアロー演算子がついているのでしょうか? GetER->AddErrorMessage("エラー"); ならオブジェクトポインタから関数にアクセスしていると分かるのですが・・・
>>524 CFoo* GetER();
ってな、感じで宣言されていませんか?
>>526 はい、されてます!
こんな感じになってます。
static CErrorReport* GetER(){return &m_ErrorReport;};
ちなみにm_ErrorReportは下記です
static CErrorReport m_ErrorReport;
>>527 GetEDがCErrorReportへのポインタを返すんですよね
だから、その戻値をアロー演算子で参照して、AddErrorMessageメソッドを呼んでる
って感じですね
>>528 ありがとうございます。
戻り値をアロー演算子で参照ですか・・・。
やっている事は何となく分かったのですが、どうしてそんな間接的な方法を取るのでしょか?
直接オブジェクトから呼び出してはダメなのでしょうか?
>>529 簡単に書くと(クラスの中)
CErrorReport* errorReport = GetER();
errorReport->AddErrorMessage("エラー");
と2行で書いていもいいんですよ
GetER()->AddErrorMessage("エラー");
と書いたほうが1行でかけますよね?
ただ面倒でかつ、errorReportの使い道がそこしかないなら、
間接段階があると、あとからなにかあったときとか、なにかと便利なのだ。
>>530 あら、日本語がおかしくなっちゃったw
ただ面倒でかつ、errorReportの使い道がそこしかないなら、
GetER()->AddErrorMessage("エラー");
と書いたほうが1行でかけますよね?
>どうしてそんな間接的な方法を取るのでしょか? static CErrorReport* GetER(){ return m_ErrorReport.isValid() ? &m_ErrorReport : m_ErrorReport2.isValid() ? &m_ErrorReport2 : 0 ; }; みたいなことができるから。
hoge()->hoge2()->hoge3()->hoge4()…とかね
haskellたのひ
質問者さ〜ん、ついていけてますか?w
ポインタ返すのにぬるぽチェックしないのとか この値は開放しなくていいのかなとか なんか気になるんですけど みなさんはそうでもないんですか?
自分だけのテストソースなら気にしない
返却値のNULLチェックなんてやってたら、面倒でしかたないよ 普通、例外処理でしょ
だったら参照返してくれって思うんだけど わざわざポインタで返すってことは暗に無効値を返すぜって言ってるようなもんだろう
参考になるのでこのスレ見てる初心者の疑問なんですが 参照を返した場合それの解放ってどうするんでしょうか? ちなみにあまり一連の質問応答にはついていけてません ただ、参照を返すという一言を見て生じた疑問です
返値が参照の場合、ふつうそのオブジェクトの所有権は呼出先のクラスなり関数なりにある。 よほど変な設計になっていない限り、呼出元は解放処理を気にする必要はない。 Foo& foo = obj.GetFoo(); delete &foo; // obj < おいやめろ馬鹿!
つくったとこが解放するのが常識 値を取得できたってことは,そのクラスでつくったってこと あとはわかるよな?
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を書かなくちゃ
いけない様な設計は危険すぎると思います。
普通はスマポか内蔵参照カウンタ使うよな
実装の途中段階から参加すると そういうインターフェースがごろごろ転がってるから油断ならない
>>543-544 ご回答ありがとうございます
そういうケースでは参照で返したらいいんじゃないかっていう話だったんですね
関数、参照で返すしか見てなかったためにあほな質問してすいませんでした
550 :
デフォルトの名無しさん :2010/05/02(日) 20:15:27
>>545 sub10::sub10() { x = 1; }
無理じゃね?
コンストラクタで代入はできるけど初期化リストでは無理な気がする
553 :
551 :2010/05/02(日) 20:25:54
ごめんなさい 見なかったことにして下さい
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でメンバに持つように書くといい。
初期化リストは使えないの?
xはbaseのprivateなんだからbaseで面倒見るべき 遙か彼方の派生クラスからいじくろうと思うこと自体が間違い 設計に問題がある
メンバ関数testMethod メンバ変数mTestobj、sTestobj クラスClassTest って感じの命名規則でおk?
sTestobjの接頭子sてなにーーーーーーーーーーーーーーー??????????????????????????????????????^−^
命名規則なんて上が決めるからどうでもいいよ
560 :
557 :2010/05/02(日) 21:16:22
>>558 staticのs
この命名規則はaroraってブラウザで使われていた
>>559 職場はVBとC#
システムハンガリアンはキモい……
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)){} //初期化子
>>562 カンマ演算子は左から順番に評価されると規格で決まっています
初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
二つほど疑問点。 カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ? あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
>>563 早速の回答ありがとうございます。評価順がはっきりしたので安心しました。
初期化子の評価順に従えばメンバーを参照して初期かも可能なのでしょうか?
たとえばこんなかんじ。
class hoge
{
int m1;
int m2;
int m3;
public:
hoge(x)
:m1(a(x)
,m2(m1+b(x))
,m3(c(m2))
{
}
};
>>564 > カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ?
オーバーロード?
> あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
関係無いって何?関係はあるだろうが、結果には影響が無いね。
不定なだけで、順番は処理系依存ではあるが、実行はされるから。
>>561 その例はアプリケーションハンガリアンだと思うよ。
メンバーを示すためにプリフィックスmをつけるのは有益だと思う。
記憶クラスの間違いは型チェックだではコンパイルでチェックできないからね。
C++は型情報を多相性で曖昧に判別できるからせっかくのその機能を命名規則で台無しにするなんてできないな。 staticとかならいっそのこと、変数名にそのままstatic_hogehoge_valueという風に組み込んでしまった方が分かりやすいし。
>>569 うんわかった。注意して使うことにするよ。ありがとう
>>565 VC++2008でやってみたら 初期化の場合は宣言されてる変数順っぽいかもよ
初期化部分が
hoge:m1(1), m2(m1+1), m3(m2+1)
として
int m1,m2,m3
と
int m2,m1,m3
だと結果が異なった
>初期化の場合は宣言されてる変数順っぽいかもよ
>>563 の人が
>初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
とすでにいっているんだけど
先に初期化して欲しい変数は、それ専用の基底クラスに持たせるかな 宣言順でもいいけど意図が伝わらないと困るかもしれない
enumの定義でtypedef使う場合と使わない場合の違いってなんでしょうか?
>>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 は不要、と考えていいとオモ。
>>576 ありがとうございます。スタイルの問題なんですね
>>434 信じがたいというかタダの嘘だよ
シングルスレッドでそんなの間抜けなコードじゃなく不可能なコードだし。
雰囲気よくってなってんな
>>576 みたいな初心者に優しい方ばっかならいいのにな
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を使ってるからアウツだよね?
thisを使うのは別に問題ないだろ
初期化の順番は保証されてるから問題は無いと思うが 初期化式でthisを使うのは警告出る場合もある
システム全体で使う設定ファイルを扱う関数に付いて お前らなら「singleton」 or 「staticだけのクラス」 or 「クラスに属していない関数」 or その他 のどれを使いますか?
singletonかsingletonですらない普通のクラスのどちらかだな
singleton>=staticのあるクラス singletonが使えるならsingleton。後は気分
Singletonかなぁ。 読み込むタイミングと書き戻すタイミングを制御したい時は どうせInitialize,Finalizeみたいな関数用意することになるからmonostateにしてまうかも。
singletonは基本的に高度なグローバル変数だから 使わないでいいなら使わないに越したことは無い
普通のクラス+それをラップしたシングルトン
参照カウントで複数オブジェクトをディスる
シングルトンは全部staticなクラス同士の初期化順問題を回避するためのものであって、 全部staticなクラスはシングルトンの代替にはならない
逆に言えば初期化順がどうでも良ければmonostateの方がよろしい
シングルトンには破棄側に問題がある事があるからなあ
596 :
585 :2010/05/03(月) 18:12:59
そんじゃ、monostateパターンを使うことにするよ お前らやさしいな、ありがとうよ
深い知識はないから、具体的に質問されると下向いて閉口だがなw
あとはクラスとしてまとめる必要があるか、かなあ。 なかったら只の関数でも十分。
>>585 みたいなのはnamespaceに全部突っ込んでるけどこれはダメなのかな
どうせインスタンス作らないんだからclassじゃなくてもいいだろって考えなんだけど
クラスにすればprivateメンバとかテンプレートが使えるよやったねたえちゃん
privateだとヘッダ書き換えるのめんどくさくない? 実装側に無名namespaceで書けばヘッダ書き換えなくていいから楽だなーと テンプレートは全然考えてなかった というかまだ使いこなせない
602 :
585 :2010/05/03(月) 20:53:00
>>599 意味もなくインスタンスを生成するのはキモいですね
クラスはnamespaceに属させないで、
>>599 のやり方の時だけnamespaceを使うのは非常識ですかね?
テンプレートは全然わからない & わからないので、使うつもりは無いです
どっちの実装も見たことあるな。 用途にあった方を使えばいいんでね?
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)が コールされるとかそんな感じに動きますか?
あ、まちがえた >ここでparrayはメンバで、以下の様にします。 ×var * parray; ○var ** parray;
動くかどうかは知らないけど 分かりづらいから やらないほうがいいと思う
>使う側が >var x[2][3]とかやります この時点で多次元配列なわけだが…
>>608 C/C++に多次元配列は無いわけだが…
さすがにそれはねーよ
別モンです。 var x(2, 3); とかやって x[1][2] みたいなことはできる。 ちなみに返すのはポインタ(var *)じゃなくて参照(var &)な。
>>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[]ってどうするんですか?
>>614 返り値にまたoperator[]する感じ
つまりすごいめんどくさい
>>614 考え方としては
>>613 が基本。
var& var1::operator[](int ind);
var1& var2::operator[](int ind)
var2& var3::operator[](int ind)
好きな次元だけ繰り返す。
>>615 えっ、次元の数だけ型に合わせたoperator[]を用意するんですか><
力任せじゃなく賢い方法無いですか
こういう時のために神はテンプレートを創った
神はじゃなくて禿はだろ
Boost.MultiArray
template作ったの禿げ神じゃないでしょ。禿げ神はパクッタんじゃなかったっけ
流れ読まずに何でもかんでもboost勧める奴って馬鹿なんじゃないかって思う
原理が知りたけりゃ実装嫁って話だろ
boostはデザインパターンの実例の宝庫だからな。使うだけでも勉強になる。
お前らが今までC++(ひいてはC言語)の勉強にどんな本読んできた? どんなフローチャートで勉強したら良いか、の参考にしたいから是非勉強した順に教えて欲しいな
628 :
627 :2010/05/04(火) 11:09:36
×お前らが ○お前ら
猫でもわかるシリーズ一択だろjk
この質問者のレベルでboostのソース読めるわけねーだろ
読めなきゃステップ実行でも良いんじゃないか
>>627 猫でもわかるC言語
Windowsゲームプログラミング
C++ 入門書の次に読む本
Boost C++ Libraries プログラミング
Modern C++ Design
Effective C++
More Effective C++
Exceptional C++
Exceptional C++ Style
634 :
632 :2010/05/04(火) 11:33:36
言語仕様(非C部分)は次読のサンプルコード打ちながらSTLのソース追いつつ覚えた。
exceptionalなぜか大学の図書館においてないから困る
636 :
627 :2010/05/04(火) 11:53:10
>>632 THX
やっぱ猫でもわかる〜で導入の後、WinAPI(?)か・・・、俺は今「基礎からのC」で勉強中なので先が長いなあ。
他の人達も
>>632 みたいな感じで書いてくれると助かる。
ググれカス
638 :
627 :2010/05/04(火) 11:55:48
いや、ググっても他人の勉強歴ってあんまり出て来ないよ・・・・・ 貴重な情報の一つだけどネットには中々転がってない情報でもある気がする
昔の人間に聞いても古い本が出てくるだけじゃないかな C++の昔の本は仕様が古い場合があるとか(iostream.hとか) Cを長く使った上でC++を適当に覚えたとかあるから、 今の人には役に立たない事も多いと思う
>>638 プログラミングの本って面白くないよな
例えば、例題が「女性の平均バストを求めよ」とか少しやる気出るのに
「結城浩」はわかりやすくていいよな
でも、俺は絶対に本でプログラミングの勉強をしたいと思わないな〜
オライリー本は高い&難しいからやめといた方がいいよ
その程度でやる気が出るお前がおかしい。
サンプルフォームの内容がことごとく「宇宙人」「異世界人」「これを衆目に晒すというのか」 だったりピクチャボックスが自作の萌え絵だったりする本でVC++(C++/CLI)勉強したけど糞も面白くなかったぞ。
643 :
627 :2010/05/04(火) 12:17:44
>>640 ??
いや、プログラミングの本って自分は大好きですが・・・
エロに絡めて勉強って言うのは斬新で効果あるかもしれないな ぶっちゃけPC覚えた理由ってエロ目的じゃん俺らって あれと同じノリで簡単なエロツールを作るのを目的に プログラミングを勉強していくのっていいんじゃないだろうか
>>642 おっと赤坂玲音さんの悪口はそこまでだ。
>>644 エロが目的でコンピュータ&プログラミングを覚えたわけではないが、
エロのためにコンピュータ&プログラミングを使っている点では俺と同じ
↓のようなコードを作ってみたんですけど、最初の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"); } }
※#include<stdio.h>、#define TSUUJOU 0、#define URUUDOSHI 1です。 ↑これは余計でした。すみません。
無駄な括弧が多いくせに空白が少ないから読みづれぇ 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 するといった処理が必要になる
650 :
648 :2010/05/04(火) 15:17:37
ありがとうございます。読みづらくて申し訳ないです。さっきは間違ってTabスペースを消してしまいました。 >戻り値を確認して、失敗したら1文字飛ばしてもう一回scanf すみませんこれがよく分かりません・・・・いや言ってることは分かるのですが方法が全く浮かばなくて・・・・
scanfなんぞ使わずに fgets+sscanf にすれば万事解決なのだが
scanf は入力が終わった場合かエラーになった場合にEOFが返ってくるので、 まず、EOFが返されたらループは終了しないといけない 入力があっても、%d に相当する入力(要するに数値)でないと失敗して 0 を返すので この場合は1文字読み飛ばす(要するに getchar する)必要がある
ああ、仕様によっては1文字じゃなくて1行丸ごと読み飛ばす必要もあるわな その場合は \n が出てくるまで fgets しても良いし、 \n が出てくるまで getchar しても良い
654 :
648 :2010/05/04(火) 15:31:31
>>651-653 ありがとうございます。
今読んでる本の索引で調べてみたんですけど、この本(基礎からのC)だとgetcharとかsscanfの使い方が載ってなかったですorz
で、fgetsについてはまだ読んでない関数・構造体・ポインタのページで解説されてるようですし、
皆さんのレスを読んでいると、恐らく1文字読み飛ばしたりするのは自分にとって未習の知識なのではないかと思いました。
なので、せめて読み通すまではオリジナルのコードを書くのはあまりしないようにしておきます。
すみませんでした。
C/C++の入出力ライブラリは曲者揃いだから 勉強でやってるならあんまりそこで詰まらない方がいいよ もっと大事なことがいっぱいある
656 :
648 :2010/05/04(火) 16:05:58
「詰まらないようにする」とは要するに、分からない部分があってもサッサと先に進んで、 その後で辿ってきた道のりを概観してみろ、ってことですよね
そうね 後で分かる事もあるし
getcとケットシー
入出力なんてただの一機能に過ぎないし はっきり言ってC/C++の入出力ライブラリって出来悪いしな どうしても標準出力に吐く所から勉強が始まるもんで それだけ見てプログラムとはこういうもんなのかと嫌いになる初心者が結構いるから
stdioはまだ許せるけどiostream、オメーはだめだ ios_stateなんてのが出てくる時点で欠陥品
コンソールじゃなくてMassageBoxとかから教えた方が初心者はやる気でんのかね?標準じゃないけど
ファイルを本格的に扱うにはiostreamよりWin32API直接が確かに楽だね
#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) 」が継承されているはずなので、エラーにならないと思ったのですが…
まずはstaticにしよう
std::iostreamは高度な処理には向いていないが、 だからこそ意義があるんじゃない? 例えば広く使えるライブラリの文字列処理とか。
666 :
デフォルトの名無しさん :2010/05/04(火) 21:09:10
operator==とoperator>をオーバーロードすれば operator>=も自動でオーバーロードしてくれるんですか?
してくれませんが、自動化するテクニックはあります
そういうわけではありません。
>>666 それをやられると困るシチュエーションが考えられるから
(思い浮かばないけど理論上はね。)
それはない。
自動化させるテクニックはあるよ。
boost operator
でggr
666です。ありがとう!
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つの整数を入力して大中小を判定するプログラムです。 これでコンパイルにはエラーがないのですが、実行結果が大と小が同じ値になってしまいます。 どこが間違っているでしょうか?
{}が足りない
674 :
デフォルトの名無しさん :2010/05/04(火) 22:19:27
どこに足りませんか?
else mid=min; min=c; else { mid=min; min=c; }
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
676です。どういたしまして。
なんか最近みんな言葉づかいが異常に丁寧だな。
>>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
何? イメージとか言われても全然分からん。 どこの言語 出身の方? 少なくともC系列じゃないよね?
684 :
デフォルトの名無しさん :2010/05/04(火) 22:40:02
681は図がずれましたが、c系列です・・・
685 :
デフォルトの名無しさん :2010/05/04(火) 22:41:40
失礼しました
「変数は箱だ」という説明から生じた誤解のような気がする。 a = b という代入は、 aという箱の中にbという箱を入れているのではなく aという箱の中にbという箱の中身を入れている。
>>680 日本語を誤って使ってしまっては元も子もありませんが、言葉遣いを丁寧にするというのに流行などは関係ありません。
普通です。
>>687 細かいこと言うと、複製してるだね、
中身を入れるだと移動と取られかねない
>>684 C系列なのにその誤解は・・・
と思ったら
>>687 「変数は箱だ」と教わったという事か。
そんなクソみたな例えは止めて、
C/C++でプログラミングしたければ
「メモリ」っていうものについてちゃんと真っ向から向かい合った方がいいよ。
そうだな 「箱」の例えでいいのはBASICだな C/C++は箱の概念だと間違いなくポインタでつまずく
つまずいて理解を深めればいいじゃない
まあ苦しむのは俺じゃないからな 苦しめ苦しめ
苦しんだ人間がめちゃくちゃなコードを書いて保守する人も苦しめる
>691 ポインタは箱にそれぞれ異なった内容のラベルが貼ってあってそれを書いた紙で考えればいいんじゃないの? ポインタへのポインタは、「ラベルの内容が書いてある紙が入った箱」のラベルが書いてある紙、で。
newで確保した値を別の関数にアドレスで渡してdeleteするのって大丈夫でしょうか? 関数Aで「obj.table = new int[ 10 * 10 ];」ってやって、 それを関数Bに渡して「delete[] &obj->table;」とやるのはどうなのでしょうか?
関数AがコンストラクタでBがデストラクタだとしたら普通だな
>>699 大丈夫だけど、確実にdeleteされる保証がもてないならしないほうが良い。
それと、なんで delete[] obj.table; じゃないのだろうかと思う。
というかコンパイルエラーになると思うんだが。
どうしてもやるなら delete[] (&obj)->table; だと思うな。
>>699 できるけど std::vector<int> を使っとけ
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); } }; 動作を見た感じは同じなんですが、上下で違いはありますかね?
>>704 static付けても付けなくても同じ。
ありざす!
>>704 リンク時に関数が外に見えるかどうか、だったかと。
え?
だったかと(キリッ
configureオプションに以下のようなものがありますが、 これはプログラマーが任意に作成することができるオプションなのでしょうか? これをコンパイルすると、マクロが定義され機能のON/OFFが出来るってことでおk? >--with-gthread > pthreadの代わりにgthreadを使用する。 >--with-[native|core2duo|athlon64|atom|ppc7400|ppc7450] > CPUに合わせた最適化 他にはalsa、pangoの設定等など
どこの誤爆?
WS_SIZEBOXだと境界線が出るんですが クライアント領域がサイズ変更可能で境界線を持たないウインドウはどうすれば作成できますか?
C++の話題じゃないな。Win32スレへ
C++でboost::shared_ptrないしstd::tr1::shared_ptrを使用しています。 循環参照が生じていないように気をつけてしようしているつもりではありますが、 もし生じていた場合にそれを検出する方法はありませんでしょうか? (デバッグビルドでだけ検出できれば十分です。リリースビルドで検出できなくても諦めます。) よろしくお願いいたします。
717 :
715 :2010/05/06(木) 13:06:09
>>716 その話題を投稿したのは私です・・・。
boost::shared_ptrの循環参照について調べていて例えが分かりやすい
と思ったのでBoostスレで例のURLを紹介しました。
一方、"循環参照が生じているかどうかを検出する方法"については
boost::shared_ptrに限らずstd::tr1のものも含むという事と、
Boostには"循環参照が生じているかどうかを検出する方法"がない事を私は知っているので、
一般のC++スレで聞くべきと思いこちらで聞きました。
>>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にあるんですね。
全然分かりませんでした。
ありがとうございました。
同じ内容の非constメンバ関数とconstメンバ関数を定義してあるソースを見るんですが何のためなんですか
>>721 非constメンバ関数からもconstメンバ関数からも呼べるように多重定義してある
本当はmutableを使うとconstメンバ関数一個で済むんだけど、mutableは
出来るだけ使わないようにって不文律があるんでな
そうしたければそうしてもいい
>>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 はコンパイルエラーだ。
class Foo {
MyClass mem;
public :
const MyClass& get_raw_data() const {return mem;}
MyClass& get_raw_data() {return mem;}
};
これで意義が分かるのでは。
>723滅多打ちw
void f(std::istream &s) { // ストリームを使って何か処理 } これって引数がテキストモードなのかバイナリモードなのか判断する方法はありますか?
class BBB : public AAA {} ←この中括弧の意味を教えてください
継承元のクラスを空実装してんじゃね?
>>730 >class BBB : public AAA {
>}
こういう形だと見覚えないかな?
1/pow(n, x)を高速で計算するにはどうすればいいですか? 誤差はあってもいいです。実値より大きくずれなければ。 1 < n < 3000000 、 0 < x < 1
>>734 >誤差はあってもいいです。実値より大きくずれなければ。
これが難しいんだよ
nの値によってズレ方が変わるからな
条件分けが必要
>>734 例えば2重のループでnとxを繰り返すなら、ln(n)を配列に保存してexp(ln(n)*x)の式で再利用する。
expとpowは圧倒的に速度差出るんでしょうか? pow関数はexpに展開するのが標準って事ですか。
サンクス。最善は
>>736 ってことでしょうか。
expをマクローリン展開して上位のこうだけ使うのもありげてすが。
実測がいいですね。
>>739 > expをマクローリン展開して上位のこうだけ使うのもありげてすが。
それはexpの実装で既に行なわれていそうな気がしてならないけど。
まあ誤差がどのくらいまで許せるのかってことに大いに依存するよね。
741 :
740 :2010/05/07(金) 19:47:03
>>739 あとxの絶対値が1未満ってのはマクローリン展開において
すごい収束がよくなりそうだけど、それでもn=3000000は
巨大すぎて誤差がデカめになりそうだ。
まあ実際にやってみてよ!
logやlnを求める漸化式ってあったっけ?あったら前回の計算結果が使えるな。
743 :
740 :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)
と変形する事で容易に計算できる。
>>738 こういう奴って馬鹿でしょ?
試さないとわからないのか?
しかも、
FuncA FuncBを比較したとき
FuncAの実行時間が短かったとしたとしても、今後永続的に
FuncAの実行時間がFuncBの実行時間よりも短いなんてどうしたらいえる?
普通、試してから聞かね?
746 :
デフォルトの名無しさん :2010/05/07(金) 22:20:38
>>744 同感
具体的にどこでどんなアルゴリズムが使われていて、
それがどのくらい一般的かを示したうえで
定量的な考察を述べるならともかく、
そのへん全然わかんねークルクルパーが態度だけでかいのは許し難いね
直列を前提とした場合に遅いと言われていたアルゴリズムが、
並列もありになったら話が違ってきたとかなら読み応えがあるのに
そういう内容がないよう
オーダーの計算は係数が無視されてるから状況次第でいくらでも優劣が逆転する 結局のところ測るしかないんだよ
実際に使うNの範囲で 無視可能な係数の範囲は分かるけどね
749 :
デフォルトの名無しさん :2010/05/08(土) 08:58:00
おまえら優しいなスレ違いなのに
splitのデミリタが1文字ではなく文字列の場合はどのようにすればいいでしょうか? ぐぐっても1文字のデミリタ用のしかでてきませんでした。 boostも試してみましたが1文字分割しかできません。
1時間探してアホらしくなったので自分で作ったら5分でできました。 割と使われそうな内容なのになんでグーグルででてこないんだろう・・・検索の仕方悪いのかな・・・ グーグルで出てくるのは全部find_fist_ofでデミリタ検索してるから"abc"って渡すとaとbとcで区切るんですね。 単にそれをfindにするだけでした。
delimiter デリミタです><
すいません><
>>735 謝罪の心が感じられるので特別に許してあげる。
>>750 regex_token_iteratorってのがあるみたいだけど、わざわざ正規表現使うのもアレだな
delete instance;と書くと~instance()が呼び出されますが、 ~instance()を呼び出すだけじゃダメなの?
だめです
みんなC++やってて具体的な成果残せた?
>>758 ライブラリ自作して満足してるな。
具体的に作りたいものあるけど、毎日気が乗らない。
具体的に作りたいものkwsk
>>756 deleteから~instance()が呼び出されるわけであって
~instance()がメモリを開放するわけでもない
762 :
756 :2010/05/08(土) 19:44:28
>>755 boostは遅いからやめておけ
自作したほうがいい
764 :
デフォルトの名無しさん :2010/05/08(土) 21:34:49
>>758 俺的には HDL のウイザードとジェネレータが最高傑作かな
俺自身がそのコードを触れなくなってしまったのが悲しい
>>764 噴いたw
大風呂敷にもほどがあんだろ?w
>>763 十分な速度が出ていると思うが。
自作とか不可能です。
>>767 ああ、いや俺は別人だ。
まあ十分だろ。
boost::xpressiveね。
自作でboostを超えられるヤツは そう居ないと思うが。
>>769 boostの凄さは速度じゃないぞ
あの、汎用性だぞ
確かに、あそこまで汎用的なクラスライブラリを自作できる奴
少ないだろが、特定の処理だけの速度なら超えれるぞ
超えられるんならboostの開発メンバーのフォーラムに にここをこうすれば良いッスよってレクチャーしてくださいよ
boost::shared_ptrとかも遅い遅いと言われるけど 実際にそれより速くて色々と安全なスマポを 自作できるやつって少ないんだよね。 Loki Libraryのスマポにすら遅いとか 言うやついるしなぁ。
汎用性犠牲にすれば速く出来るってだけだろ それぐらいできてもらわないと困るわ
自作できないと、遅いと言っちゃいけないのか? VISTAが遅いと評判だったが、VISTAを自作できる奴が多いとは とても思えんが?
Vistaが遅い?
正規表現を利用するのに特化したライブラリ取ってきて使えばいいだけじゃん 俺って頭いいなぁ
>>774 遅いというなら自作ができるのがC++のメリット。自由ね作ればいい。
だけどshared_ptrより速い同等な機能のスマポはまず作れないということ。
機能制限版を作ったとしてもshared_ptrよりわずかに速いだけ。
shared_ptrなんて、使うか? C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず そうでないなら、JAVAやC#なんてオコチャマ言語でも使ってればw
GCは気持ち悪いけどスマポは気持ち悪くない
ただの道具にお子様も糞もねえよ
shared_ptrがどこで破棄されるか分からないとか・・・ shared_ptrを何だと思ってるんだろう
>>778 コンテナにポインタ入れてポリモーフィズムやらせたくないの?
>>782 コンテナにポインタ入れるのになぜshared_ptr?
お前はまずC++を勉強してからレスしろ
>>778 shared_ptr 使ったらどこで破棄されるか分からなくなる、などということはない。
実行時に決まるようになるだけ。
うわぁwww
>>778 > C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず
うむ。だからshared_ptrを使うんだけど。
shared_ptrをどんな使い方をしたらどこで破棄されるか分らなくなるの?
>>783 が酷い件について
右辺値参照があれば話は変わるが
C++屋ってw ヘンテコな名前の方じゃないですよねw
C++屋ってチャオプラヤみたいだな
ちょっとテスト書き込みさせてくれ。
あれれー?
だが断る
>>787 循環参照以外の問題ってあるっけ?あれも対策あるし。
それこそいつ破棄するべきかわかわからないでしょ。いちいちこんなこと書くの? 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();//きれいに削除
>>797 × v.claser();//きれいに削除
○ v.clear();//きれいに削除
我々は釣られたのだ
shared_ptrを使えといってるのでは?
boost::ptr_vectorっていうのもあるんだが・・・・ 選択肢が広いという利点がある
shared_ptrのコストがどうしても気になるならptr_vectorという選択肢もある。
ptr_vectorはvector<unique_ptr<T>>に集約されそうだね。
vector<unique_ptr<T>>ってソートとか普通にできんの?
>>805 ムーブかスワップでソートを実装すればできるんじゃね?
shared_ptrがいまいちわかってない俺ガイル 自分のコードだけで使うなら勝手に削除してくれるのはわかるんだけど ライブラリに生ポインタ渡さないといけない場合、まだライブラリが使ってるのに削除しちゃったりしないか考えてると よくわからなくなってくる
要素の追加すらめんどくさそうだな
ValueSwappable かつ *first が MoveConstructible かつ MoveAssignable でさえあればソートは可能だし、 事実 std::sort などはそう要求している(C++0xで)
>>807 ライブラリを使う時に shared_ptr を複製して、
ライブラリの後始末をする時に破棄すればいい
>>807 ライブラリのドキュメントを読めばすむ問題。
>>810 なるほど
そういうことをするラッパークラスを作るのがいいのかなぁ
813 :
デフォルトの名無しさん :2010/05/09(日) 02:42:53
用途によると思うが、 std::vector<MyClass> vecと std::vector<MyClass*> vec ってどっちがいいの?
そんなのお前にしか分からんだろ
>>813 後者はboost::ptr_vectorに入れた方が何かと都合がいい
>>813 あと前者はそもそもポリモーフィズムできんぞ
コンテナに入れるオブジェクトのサイズは一定でないと
>>816 この手の質問する馬鹿がポリモーフィズムなんて分かるかよ、ボケ
所有権の認識が曖昧なまま生ポインタ使うとか恐ろしすぎる
ばか ポインタとセックスは生が最高なんだよ
と、童貞が申しております
>>819 > セックスは生が最高
そんなでもないんだぜ、案外
constメソッドのメリットを教えて
>>822 メソッドじゃなくてメンバ関数ね。
メリットも何もないと死ねる。
例えば
int foo(const MyClass& arg)
{
return arg.m_func();
}
でm_func()がconstメンバ関数じゃないとコンパイルエラー。
インスタンスの状態変更のない事が保障されてるからconst参照、constポインタからでも呼べられるし コピーや変態キャストに伴うメモリ状態同一性が問われる気持ち悪いコードを書いているときも結構諜報する。
>>823 int foo(MyClass& arg)
{
return arg.m_func();
}
とすれば、いいのでは?
>>825 ,、 '";ィ'
________ /::::::/l:l
─- 、::::;;;;;;;;;`゙゙''‐ 、 __,,,,......,,,,_/:::::::::/: !| またまたご冗談を
. : : : : : : `゙'ヽ、:::゙ヾ´::::::::::::::::::::::`゙゙゙'''‐'、. l|
、、 . : : : : : : : : r'":::::::::::::::::::::::::,r':ぃ::::ヽ::::::::ヽ! ,、- 、
.ヽ:゙ヽ; : : : : : :ノ:::::::::::::::::::::;;、-、、゙::: rー-:'、 / }¬、
. \::゙、: : : :./::::::::::::::;、-''":::::::::: ,...,:::,::., :::':、 _,,/,, ,、.,/ }
ヽ:ヽ、 /::::::::::::::::::::::::: _ `゙''‐''" __,,',,,,___ /~ ヾ::::ツ,、-/
`ヽ、:::::::::;;;、、--‐‐'''''',,iニ- _| 、-l、,},,  ̄""'''¬-, ' ''‐-、 .,ノ'゙,i';;;;ツ
_,,,、-‐l'''"´:::::::' ,、-'" ,.X,_,,、-v'"''゙''yr-ヽ / ゙゙'ヽ、, ,.' j゙,,, ´ 7
,、-''" .l:::::::::::;、-''" ,.-' ゙、""ヾ'r-;;:l 冫、 ヽ、 / __,,.ノ:::::ヽ. /
l;、-'゙: ,/ ゞ=‐'"~゙゙') ./. \ / '''"/::::;:::;r-''‐ヽ
,、‐゙ ヽ:::::..,.r'゙ ,,. ,r/ ./ ヽ. ,' '、ノ''" ノ
,、‐'゙ ン;"::::::. "´ '゙ ´ / ゙、 ,' /
' //::::::::: {. V /
/ ./::::::::::::: ', / /
. / /:::::::::::::::::. ',. / ,.、 /
>>825 fooの中で引数に渡したオブジェクトが変更されてたら困るだろ。
COM扱ってるとconst邪魔なんだよね
質問者
>>822 の「constメソッドのメリットを教えて」に対する回答にconst抜きにすればいいのでは?というのは「またまたご冗談を」
なぜ?(constが邪魔な理由と今更COMを扱っている事に大して)
831 :
823 :2010/05/09(日) 09:25:26
>>825 一体全体どこの言語ご出身の方かしりませんが、
まあ適当な書籍、『Exceptional C++』とかを熟読して
constの有用性について学んでください。
それで納得できないならC++は使えない。間違いなく。
>>827 それはわかりますが、fooの中では、”オブジェクトの変更をしない”と覚えておけばいいだけでは?
>>832 constが導入されていない時代はまさにそれだった。
それを明示的に示し、違反が合った場合にはコンパイラが自動的にエラーを出せる様にした
システムがconstとconstメソッド。
そのfooの中を作った人間だけが、fooを使うとは限らない。 const 付いていれば、変更されないのが誰にでも理解できるし。
>>832 ちなみにfooにがconstメンバ関数でもnon-constメンバ関数でも、
普通にconst MyClass& argのargから呼び出す事は可能なので、
毎回const版とconstじゃない版を用意する必要はない。
>>832 変更されないことをコンパイラはどうやって知ればいい?
関数の中の処理を全て検査した後に「このポインタ(参照)の先にあるメモリは変更されない」と分かるというのなら、実用性がなさ過ぎて最適化の阻害になる。
”オブジェクトの変更をしない”ということを覚えておいて機械的にチェックする作業をコンパイラに任せるのがconstの目的。 constの目的を理解できないアホでも間違いを起こさないようにするのがconstの意義。 mutableやconst_cast使いまくりでconstの意義を破壊するのが基地外。
もう一回テスト書き込みさせてくれ
>>832 それにfooの中では”オブジェクトの変更をしない”と覚えておいても、
そのfooが呼び出す別のメンバ関数がオブジェクトを変更してしまう可能性も考えられる。
小さなコードなら良いけど、そのすべてを記憶だけでやると危険なことになりかねない。
>>833 そうですか
なぜこのようなことを聞いたというと
例えば、std::vectorでも
iterator begin()
const_iterator begin() const
と2つも実装してるみたいだし、面倒では?
と思ったからです。使う側は面倒ではないですけど。
実装者の労力と使用者の利便性はトレードオフだろうがガキ
>>840 面倒依然に、その二つは機能が違う。
非constのbegin関数はコンテナの中を変更することが可能なiteratorを返すが、begin() constはコンテナの中を変更できないわけで。
>>842 いや、だからその変更できないようなiteratorをあえて使う必要があるか?ということです。
変更できるiteratorを取得しても、変更しなければいいだけの話では?
constそのものの説明をしてやらなきゃこいつはだめじゃないか
保守する人が変わっても 未来永劫それが徹底できるならね
保守する人がconstを知らず、constを使わないコードを量産する事も・・・
const参照で引数を受けとればその引数に対して 関数の内部で非constの操作がコンパイルエラーになる 要するにうっかり防止、人間はミスをする前提で考えるのが常識 拳銃についてるセーフティみたいなもんだよ あとconst参照にしてればテンポラリオブジェクトを渡すのが合法になるがこれも結構大きなメリットになる iteratorに関しては色々理由があってconst_iteratorを選択するメリットはあまり無いんじゃなかったか?
constを知っていても、const_castで外してしまったらどう保障するのでしょうか? 上のレスをみてると、じゃあ、なぜconst_castなるものが存在するのでしょうか?
選択するも何も、constなコンテナだと const_iteratorかconst_reverse_iteratorしか選択肢ないだろ constじゃなくてもsetはconst_iteratorしかない
>>848 constのない、古いコードやバカの書いたコードに渡すため
>>848 自前で用意したクラス、インスタンスなら必要ないかもしれない
けど、他人が用意したものでconstなインスタンスしか参照できないとき
const使わないと何もできないぞ
>>850 あたなのいうところのバカが書いたコードをバカではないあなたが利用する理由は?
const外ししたものに保証なんて無いよ
>>852 会社の自前ライブラリの使用を強制される場合は
そういうことがいくらでもある。
自分じゃ変更できない外部ライブラリにconstがついてない時とかに const_castを使う あと、COMを利用するときとか(COMにconstがないので) constありの関数となしの関数を実装する時に、 const_castを利用して実装をまとめることもある
>>854 ということは、あなたがいうバカが存在する会社と勤務乃至付き合いがある理由は?
釣りはそこまでだ
Fishing is over
test
constを理解しようとしない馬鹿にも理解できそうなconstのメリットを一つ。 あるインスタンスのconst参照を渡す関数の前後でそのインスタンスは同値であることが期待できる。 従って、それ故の最適化が可能。これが非const参照を要求する関数であれば、その最適化はできない。 従って、const参照によるパフォーマンスの向上の可能性がある。 const参照がconstメンバ関数であっても理屈は同じこと。
>>856 論破されたからって関係ない話を持ち出し始めるなよクズ
constのない言語がほとんどだから なくてもいいんじゃない?と思う人がいるのは分からなくもない
>>848 const外しをした場合の動作が未定義なことくらい知っておけよ
const外し全般が未定義はないわ const int n = 0; const_cast<int&>(n) = 1; は未定義だが
バカバッカだなw 結局constの有用性を説明できたのごく小数だったなw
>>862 そのままおまえに返すよw
論破されたからって関係ない話を持ち出し始めるなよクズ
自分にとって都合の悪いことには答えないんですね。分かります。
折角いい流れだったのに台無しだな
最近、内の会社にもいますよ 二言目には「〜の理由は?」って奴、アフォかと 話もしたくない
他のスレでもこういうアホ見かけたな 最後には逃げる奴
┐(゚〜゚)┌
面白いテーマの掲示板が出来る。 ↓ 面白い人が集まってきて、面白いことをはじめる。 ↓ 面白くない人も大勢見に来る。 ↓ 面白くない人が面白い人の真似をしはじめる。 ↓ 面白くない人がやっても面白くない。 ↓ 面白くない人のほうが多いので、面白くないものの比率があがる。 ↓ 掲示板が面白くなくなって、面白い人がいなくなる。 ↓ 緩やかに過疎。
はい、次のネタどうぞ
上にconst int n = 0;ってあったが、 こういうコンパイル時に決まる静的な値だけで初期化された定数のことを指す用語ってあんの?
>>861 それは無い。
定義時の const であれば別だけど、参照への const の有無だけでは
エイリアスの可能性(最悪グローバル変数経由とか)が消えないので、
コンパイラは変更されていないことを前提にできない。
参照への const の有無で最適化の結果が変わるようなコード、作れる?
>>876 そのまんま。
コンパイル時定数(Compile-time constant)
constの存在意義を聞いてるのに、あるもんはあるんだから仕方ないだろ、なんて 思考停止じゃ答えになってねーだろ。
誰もそんな答えしてないだろ。
バカには理解できなかったんだろう
こういうヤツには頼むからC++使って欲しくない ゆとりでも使える高級言語で満足して帰ってくれ
最近の言語で軒並みconstが採用されないことからも constはあまり重要なものでないと分かる
constに出来ないんじゃないの
constをつけ始めるとコンパイルエラーが頻発する。 すなわち、今まで危ない橋をいかに多く渡ってきたのが明確になってぞっとする。 そうなるとconst1を丁寧につけて、機械的に検出できる部類のバグはコンパイル時に解決してするありがたさが分かる。
>>885 constもtypedefもないC#はVMの都合のような気がする。もしC#にconstを採用したら、VB.netで悲鳴が上がるんじゃないか?
まあいまさら追加できないだろうけど
Dはconstどころかinvariantとかimmutableとかfinalとか余計に複雑になってる
890 :
デフォルトの名無しさん :2010/05/09(日) 11:31:00
readonlyはあるよね
>>885 最新の言語といってもスクリプトだからな。
スクリプトはconst以前の問題だしな ああいった言語は安全性より手軽さだからそれでいいけど
>>891 readonlyは参照を変更できないだけで、参照先のオブジェクトを変更できないわけではない。 const T&やconst T*とは意味が異なるので今の議論とは関係ない。
スクリプト言語でもgetterのみのプロパティとかは、意味的にconstに近いだろう。
>>895 const相当のgetterのみの使用に一時的な限定する機構があるならばね。
readonlyのアダプタ使えばええやん
>>897 kwskと言いたいとこだが、C++スレなんで3行でお願い
いやだからwriteメソッド削ったアダプタかませりゃconstない言語でも安心だろ
>>899 constがあればreadメソッドにつけるだけで簡単だろ。
>>900 いや、今は無い言語の話をしてんじゃねーの?
const一つでここまで熱くなれるおまいらが羨ましい
Visual C++って最初から使いこなすのムズいな いつから使い始めれば良いか、タイミングが難しいけど・・・・いつからやりゃあいいんだ? 最初から他のエディタ使ってると永遠に使わなさそう
hoge(T** ptr)とhoge(T*& ptr)はどっちが一般的?
どこの一般だよ
そもそも使い道が違うし
STL/Boost的に考えるなら後者 WinAPI的に考えるなら前者 じゃね?
908 :
904 :2010/05/09(日) 14:39:54
関数内部でmemcpyした後にポインタを動かしたいんだけどどっちにするべきかな?と思って
memcpy?? どういうことがしたいんだ
910 :
904 :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; }
すげー怖いコードだな vector使おうぜ
>>910 なら参照だろ。ポインタ使って何かいいことでもあるのか?
>>910 たぶん dst をメンバに持つクラスを作ったほうがいい。
dstのサイズが分からないから いくらオーバーしても我関せずだな
915 :
904 :2010/05/09(日) 15:00:32
memcpyってどのコンテナのメソッド?
vector::insert使えばいい
vectorでバッファのアライメント指定できるの? vector<char>に__attribute__((aligned))付けたら良きに計らってくれるの?
テスト
動的に確保したメモリは最悪の条件でもアラインメントされてるはず ・・・はず
>>920 じゃあやっぱりvectorを本物の配列の代わりに使うなんて無理なんだね
横槍レス。
>>922 どうしてそう言う結論になるん?
Visual C++ってコンパイル機能ないのか? メニュー探してもボタン探してもコンパイル機能らしきものがない
あるよ?
>>924 ビルドメニューの中にコンパイルって無い?
プロジェクトから作ってないとダメなの? cファイル開いたんだけど
memcpy使わざるを得ないのは分かったが dstのサイズくらい渡しとけ バッファオーバーフロー攻撃のいい餌食だ
>>924 2010のeeだったらメニュー項目が隠されている。
ツールのどっかにチェックがる。
>>922 制約が厳しい場面では代わりにならないこともある、というだけのこと。
多くの場面では代わりに使える。無理じゃない。
制約が厳しいっても バイトストリーム扱う時に全く役に立たないって結構致命傷だと思うんだけど 特にC/C++の得意分野を考えると
ストリームに使うのはストリームクラスじゃないのか
え?iostreamで全部扱えって? ご冗談でしょう
道具なんだから場合によって使い分ければいいじゃない。
>>931 「バイトストリーム扱う時」というのが何のことかさっぱりわからない。詳しく。
俺が童貞だってconstで定義した奴は出てこいよ!
>>931 vector が使えなくても代わりの手段があるだろ。
なんで vector が使えなかったら致命傷になるんだ?
コンパイル時定数のconstをconst_castで外したときの動作は未定義です
ROMに格納されてたらセグフォだな…
>>940 > コンパイル時定数のconstをconst_castで外したときの動作は未定義です
そうなの?外すだけでだめ?
int foo(const MyClass& arg)
{
return const_cast<MyClass&>(arg).m_func_argを変更するメンバ関数();
}
は
MyClass x;//これがconstでないという前提の下で、
foo(x);
としても未定義の動作ではないんだよね。
いや普通はfooの作者を殴りに行く所だけど、文法的な話で。
それはxがコンパイル時定数じゃないから未定義動作ではない
分かりやすい例 const int n = 0; int main() { const_cast<int&>(n) = 1; std::cout << n << std::endl; } 1 と出力されるか 0 と出力されるかは規格では定義されていない
>>942 コンパイル時定数の const を外しても書き込んでなければ未定義動作にはならない。
その例の x については書き込んでも未定義動作にはならない。
>>945 その場合は未定義動作だから、 1 と 0 のどちらかが出力されるとも決まっていない。
おおなるほど、ありがとう。
理解。
俺のレスの後半部分はあんま関係ない例だったっぽいな。
そしてコンパイル時定数でもconst_castするだけならOKなのか。
書き込まなければ。
>>945 > 1 と出力されるか 0 と出力されるかは規格では定義されていない
不定?それとも未定義の動作?
>>949 サンクス。undefinedか。じゃあ致命的だな。
そもそも出力以前に、代入の時点でプログラムが落ちてもおかしくはないな
const_castよりもmutableですよ。キャッシュ値を保存するのにmutableは便利。
STLとかBOOSTで使う関数オブジェクトってあるじゃないすか あれって関数オブジェクトを引数に受け取るときはconst参照じゃなくてオブジェクトの複製になってるのは規格や規則で指定されてるんですか? 自分でファンクタを作るときにどっちを前提で書けばいいのか迷ったので質問しました
ああいうのは純粋関数のはずだから状態を持ってないわけで それならconstも何もないってことなんじゃないの?
>ああいうのは純粋関数のはずだから どういうこと?
>>953 標準ライブラリの話であれば規格で定められているとおり。
>>955 結果が引数のみに依存する関数ってこと
内部状態を持ってる関数だとアルゴリズムに渡したときおかしなことになるから
mutable使った事ない。 便利なのは知っているが、そのシチュエーションに遭遇したことがない。
mutableって他で代用出来なくて効果的な使い方なんてあるのか?
複雑な計算をして得られる値を使い回したいけど 最初にその値を取得するconstメンバ関数を読んだ時に初めて計算して欲しい時とか
mutableはC++を学び始めた時に「何に使うんだこれ」と思っていたが、今でも同じ事を思う。
インスタンスの内部キャッシュを作ろうとするとmutableにせざるを得ない。 あとは参照カウントとか。
>>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;
}
};
CRITICAL_SECTIONにmutable付けてみた
意外と使いどころあるな 実際そんな使わないけど
967 :
958 :2010/05/09(日) 20:40:42
>>964 丁寧にありがとう!
ただ、それって単にmutableとメンバ関数のconst指定を消したらダメなのですかい?
・・・あ、それだと
void foo(const hoge&)
に渡せないってことか。
boost::mutexなんかmutableをつけてるぜ俺
getValue自体オブジェクトの状態を変更するような関数じゃないからな constなのが自然
ここらでだれか次スレたのむ
>>969 おまいはいちいちmutable回避のためだけに、普段からそんなコードを書いてるのかと小一時間問い詰めたい。
>>969 mutableだとキーワードひとつで済む上、目的が一目瞭然なのがメリット
そんな遠回しなことしなくても、const_cast すれば代入は出来るだろ 気持ち悪いからやらないけど
mutableよりconst_castの方が遠回しだろw
どうせなら特定のメンバからのみ変更可能とかにして欲しいわ 他のメソッドからうっかりアクセスして壊れたらどうすんだよ
>>974 const_cast で代入はダメだよ。未定義動作の可能性が出てくるだろ。
メンバへの代入だから未定義動作にはなんないだろ
>>977 const_castの対象がメンバ変数なら
設計の段階でconstじゃない事はわかりきっているから、
未定義の動作にはならないのでは・・・?
mutableってマイナーなキーワードかと思ってたけどすごい人気だな。
0x学園が興味を持ったようです
0xでmutableって言うと ラムダでキャプチャした変数を変更したい時に使うというあれか
mutableは今現在でも仕事はあるが、 export, registerあたりは全く仕事してないと言って良いから 何か有用な使い道を考えてくれ誰か、
registerとか管理クラス作るときその名前使わせろ糞がって思うわ
exportは0xでめでたくリストラされました 予約語としては残るが
registerも0xでdeprecatedになったな 予約語としては残るが
>>985 むしろ新たな旅立ちと考えるべきでは。
何に使うのか知らんが、きっと良い案を誰かが考えてくれる。
autoタンみたいに再就職先が見つかるといいんだが
autoタンは再就職先どころかそっちが もう本業になっちゃってるよな。
>>978-979 クラスでもユーザーが const なインスタンスを作った場合には未定義動作になる。
結局const_cast後代入していいのはどういうときなのですか?
次スレ立てるからちょっと待て。
おk待つ
>>992 「結局」どころかこの場にいるほぼ全ての人が
最初から知っていることだが。
大丈夫なのは元がconstじゃないのにconst属性が付いている時。
>>942 の例のコードでわかるんじゃね。
コンパイル時定数以外なら規格上は代入して良かったんじゃなかったっけ コンパイル時定数以外の定数もだめなんだっけ?
998 :
992 :2010/05/09(日) 21:27:32
うめ
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。