■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part45
751
名前:
デフォルトの名無しさん
:2005/12/31(土) 18:31:24
>>750
あー、暫く前に落ちましたよ。
752
名前:
デフォルトの名無しさん
:2005/12/31(土) 18:48:32
bool MakeList(Node*&)
というように、ノードのポインタのアドレスを引数にし、mainから参照したいのですが
うまくいきません。
Node* node;
if(MakeList(&node)){}
このように、条件判断に使いたいのですが・・・・
どうすればいいのですか?
753
名前:
デフォルトの名無しさん
:2005/12/31(土) 18:49:27
>>748
変な奴がいるみたいだが、もうしばらく相手してやる。
> Q1: (引用略)
> 誰のことですか。発言者の出典箇所は?
Windows や Linux をメインの環境としてプログラミングしてる人。
発言者とは誰のことですか。
> Q2:普段から ROM 環境でプログラムしてる人
> PICとか組み込み系の人のことですか。
そこらへんに多いと思う。あと携帯ゲーム機とか。
> Q3:世界中の人の前に広く出回る本であっても貴方は後者の
> 書き方で問題ないと寛容にお考えですか。
普段から後者に統一しているので、問題ないと考える。
C++ の書き方についての話なので、何語に翻訳されてようと変わらない。
> 関東圏内で会話していると(以下略)
大阪で暮らすために日本語を学ぶなら、標準語を学ぶだけでは不十分だろう。
逆に、東京だけで暮らすなら、関西弁を学ぶ必要は無い。
ROM 環境でプログラミングするために C++ を使うなら、以下略。
逆に、潤沢な RAM のある環境だけでプログラミングするなら、以下略。
754
名前:
デフォルトの名無しさん
:2005/12/31(土) 18:54:37
>>752
operator void* () を定義すればどうか。
755
名前:
デフォルトの名無しさん
:2005/12/31(土) 18:56:01
>>754
すいません、詳しく教えてください
756
名前:
デフォルトの名無しさん
:2005/12/31(土) 19:02:42
>>755
streamと同じ要領。変換演算子。"ストリーム c++ 変換演算子"でぐぐれば
いろいろ出てくる。
757
名前:
デフォルトの名無しさん
:2005/12/31(土) 19:03:45
"ストリーム 状態 c++"の方がいいか。
758
名前:
デフォルトの名無しさん
:2005/12/31(土) 19:09:23
>>754
MakeList() の戻り値が bool なのに、なんで変換演算子が要るの?
759
名前:
デフォルトの名無しさん
:2005/12/31(土) 19:12:01
>>752
呼び出しの時に & はいらんよ。
760
名前:
デフォルトの名無しさん
:2005/12/31(土) 20:11:56
>>759
どうもありがとうございます
761
名前:
デフォルトの名無しさん
:2005/12/31(土) 21:05:47
あれ? なんでみんなフツーに回答してんの?
>>752
がわけわかなのって俺だけ?
762
名前:
デフォルトの名無しさん
:2005/12/31(土) 21:11:25
>>761
自分自身に似たような経験があれば、質問者の意図は理解できる。
763
名前:
デフォルトの名無しさん
:2005/12/31(土) 21:23:04
>>752
なんかポインタのど初歩で間違えて内科医?
実引数おかしいよね
764
名前:
デフォルトの名無しさん
:2005/12/31(土) 22:09:06
>>761
こうすれば理解できると思う。
typedef Node *NodePtr;
bool MakeList(NodePtr&);
765
名前:
761
:2005/12/31(土) 23:14:04
>bool MakeList(Node*&)
>というように、ノードのポインタのアドレスを引数にし、
ここまではわかる。
>mainから参照したいのですが
なにを? 引数? 関数? 戻り値? それ以外のなにか?
>うまくいきません。
なにが? 引数を渡すこと? 関数呼び出し? 戻り値の取得? それ以外のなにか?
>Node* node;
>if(MakeList(&node)){}
>このように、条件判断に使いたいのですが・・・・
勝手に使えばいいじゃん。
>どうすればいいのですか?
俺も、どうすればいいのですか?
766
名前:
デフォルトの名無しさん
:2005/12/31(土) 23:28:52
うむ。さっぱりわからんな。
767
名前:
デフォルトの名無しさん
:2005/12/31(土) 23:52:27
ぱっと見た感じ
>>759-
>>760
で解決では?
if(MakeList(&node)) { ではなくて
if(MakeList(node)) { にしろってこった。
上のじゃコンパイル通らないだろう
768
名前:
デフォルトの名無しさん
:2006/01/01(日) 00:32:19
>>767
確かに、解決もしたんだろうし、そこでコンパイルエラーになって、
& を取っ払えばコンパイルが通るって話はわかる。
が、質問の意味がさっぱりわからん。
769
名前:
デフォルトの名無しさん
:2006/01/01(日) 01:45:47
C++ Primerってこのスレ的にはどうなんですか。
amazonの評価は結構微妙なんですけど禿本に書いてない細かい所とか書いてあるんですよね。
770
名前:
デフォルトの名無しさん
:2006/01/01(日) 01:51:14
量が多いから、1からC++Primerを読んで勉強するには相当辛いものがあるし、
索引がいい加減で、容も離散的に書いてあるから、マニュアル的に使うにも少々難ありって感じ。
俺の感想だけどね。
分からないトピックを絞って、その部分を集中して勉強するようなスタイルなら、それなりに使えるとは思う。
結局本棚の肥やしになってるけど。
771
名前:
デフォルトの名無しさん
:2006/01/01(日) 09:22:40
漏れには
>761
が判らん。
#「がわけわかなの」?
772
名前:
デフォルトの名無しさん
:2006/01/01(日) 09:27:06
シーケンシャルに読むならやっぱ禿本
ランダム読みに向いているのが C++ Effective
マニュアルは本当に処理系の取説と ISO/JIS の規格票
773
名前:
デフォルトの名無しさん
:2006/01/01(日) 09:31:19
>シーケンシャルに読むならやっぱ禿本
何の本のことか解りません。
タイトルを正確に教えて
774
名前:
デフォルトの名無しさん
:2006/01/01(日) 09:39:27
おまえら、最初にどの本読んでOOPの世界に入ったのよ。ちなみに俺は
「A級B型C++ (技術評論社かソフトバンク、忘れた、すでに絶版)」
775
名前:
デフォルトの名無しさん
:2006/01/01(日) 09:44:16
古禿
↑ISBN4-8101-8002-6
ISBN4-8101-8047-6
ISBN4-7561-1895-X
↓ISBN4-7973-2854-1
新禿
776
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:01:09
禿禿言うなっていう忠告を理解できなかったようだな…
777
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:09:04
ハゲでもいいじゃん。
ハゲこそC++だよ。
778
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:11:17
敬意を込めて禿と呼ぶ
779
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:49:58
>ハゲでもいいじゃん。
>ハゲこそC++だよ。
この本は髪質がツルツルと光って、そのうえ薄すぎて
さらにイタリックで読みにくくない。?
光沢が反射して目がクラクラするのは、俺だけか。
だいだい、あすきー社って、異常に紙質が厚いか
裏面が透過するほど薄いか、ざらざらしているか
値段が他社に比べてトビ抜けて高い。
つぶれてよし、逝ってよし。
練習問題の回答本も別途購入しないといけない。
買う人はいますか。
780
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:53:13
禿げてる奴って脳みそのしわも薄そうだよな。
頭悪そ
781
名前:
デフォルトの名無しさん
:2006/01/01(日) 11:58:15
禿の練習問題は同じ問題をやってみた人同士で論議するように意図されているもので
誰かが出してきた答案を見てそれをやめてしまう他力本願は「ユーザが育てた言語」にそぐわない
値段にしても自己投資として買う人には問題にならない金額だね
782
名前:
デフォルトの名無しさん
:2006/01/01(日) 14:42:27
みなさんにとってのデータアクセスの考え方についてお聞きしたいです。
class CMember
{
private:
int m_Age;
};
というクラスがあった場合、そのメンバーアクセスには
bool SetAge(int Age);
int GetAge() {return m_Age;}
というメンバー関数を用意しておこなうようにしていますが。
もし、他に
CStrVector m_NickName;// 文字列クラスの配列を管理している管理クラス
というデータがあった場合、取得に関してはどのような概念をお持ちでしょうか?
@メンバー関数は外から干渉絶対にさせないので、コピーにかかる時間は深く考慮せず
CStrVector& GetNickName() {return m_NickName;} とおこなう。
Aprivateメンバー宣言されている時点で、さわられたくないと言う意思表示をしているので
ポインタを取得させてしまう。
CStrVector* GetNickName() {return &m_NickName;} とおこなう。
ちなみにm_NickNameで配列化される文字列は300個ぐらいです、
各文字列はせいぜい20バイトほどです。
MFCで言えばCStrVectorはCStringArrayのようなものだとお考えください。
作製しているアプリは事務的な物です、決してゲームのような一刻の早さを求める物ではありません。
みなさんならどちらでしょうか?
783
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:02:39
>>782
そのクラスの設計目的を抜きにしてそんなことを議論できるとでも思ってるのが間違い。
784
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:04:18
>>782
実装からインターフェースを考えてるのが間違い。
先にインターフェースを考えろ。
785
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:05:54
Aはアフォ
786
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:06:13
>>782
(1)にコピー云々と書いてあるけど
CStrVector& GetNickName() {return m_NickName;}
CStrVector GetNickName() {return m_NickName;}
の違いは分ってる?
787
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:24:03
>Aprivateメンバー宣言されている時点で、さわられたくないと言う意思表示をしているので
constを忘れているよ(w
788
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:28:24
privateは、派生クラスからも触れないので、まず使わない。protected
にするな。それと、MFCだとCMemberは、CObjectの派生クラスとして定義
する。
んでもって...
const CStrVector &GetNickName() const { ASSERT_KINDOF(CMember,this); return(m_NickName);}
CStrVector &NickName() { ASSERT_KINDOF(CMember,this); return(m_NickName);}
の2つを用意する。前者用意していないと、後者は、constなメンバ関数
から参照できないため。クラス定義の目的と場合によっては、virtual関数に
する。
なぜわざわざメンバ変数を隠蔽してアクセス関数を用意するのか理解して
いない
>>785
は、アフォ
789
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:29:16
禿げって、髪質がツルツルと光って、そのうえ薄すぎて
さらにイタリックで読みにくくない。?
光沢が反射して目がクラクラするのは、俺だけか。
790
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:37:11
>>788
protectedは、派生クラスからも触れるので、まず使わない。
791
名前:
デフォルトの名無しさん
:2006/01/01(日) 15:40:51
派生クラスから触るためにprotectedにするって......
なぜわざわざメンバ変数を隠蔽してアクセス関数を用意するのか理解して
いない
>>788
は、アフォ
792
名前:
782質問者
:2006/01/01(日) 16:06:16
元日早々いろいろと勉強になったような気がします。
みなさんありがとうございました。
class test
{
public:
test() {m_a = 10;}
const int& get_a() const{return m_a;}
private:
int m_a;
};
int main()
{
test t;
const int &a = t.get_a();
a = 20;// エラー
return 0;
}
793
名前:
デフォルトの名無しさん
:2006/01/01(日) 16:19:33
>>788
みたいな奴が穴ありまくりの腐りきった関数作るんだな
794
名前:
デフォルトの名無しさん
:2006/01/01(日) 16:26:56
>>791
や、
>>793
みたいな奴が、パフォーマンスが出なくて、再利用でき
ない糞なクラスの再発明を繰り返してして、ばかでかくて無駄なコードを
量産しているんだろうな。間違いない。
795
名前:
デフォルトの名無しさん
:2006/01/01(日) 16:53:01
自己紹介乙
796
名前:
デフォルトの名無しさん
:2006/01/01(日) 16:57:03
>>788
リファレンサくらい憶えろよ、アフォ
797
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:04:37
>>796
また馬鹿が釣れた。
798
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:15:15
(;´Д`) おまえら、なに新年早々揉めてんだよ。
799
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:29:35
>privateは、派生クラスからも触れないので、まず使わない。
そんな論法がまかり通るならアクセス関数とか使わずに全部public。
実際それが一番良い場面も多いしな
800
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:33:43
>>799
また馬鹿が釣れた。
801
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:34:01
新春早々馬鹿が現れてるようだな。
802
名前:
デフォルトの名無しさん
:2006/01/01(日) 17:34:55
>>801
またまた馬鹿が釣れた。
803
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:03:47
「釣れた」と言ってる馬鹿がいる。
804
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:05:24
>>803
違う、「釣れた」としか言えない馬鹿がいる、だろ。
~~~~~~~~~~~~~~
805
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:10:53
>>803-804
まだまだ馬鹿が釣れた。
806
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:24:39
>>805
やあ朝鮮人。
807
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:28:57
>>805
また馬鹿が連れた。
808
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:32:21
>>792
intなら参照を返す必然性は無いと思う。
あと、コンストラクタで代入するよか、
test() : m_a(10) {}
と書くようにした方が良いかも。
809
名前:
デフォルトの名無しさん
:2006/01/01(日) 18:50:30
>>806-807
なお馬鹿が連れた。
810
名前:
デフォルトの名無しさん
:2006/01/01(日) 19:19:31
猫のページを参考にオペレータオーバーロードの定義方法はわかったのですが。
例えば class Age内にて
Age operator + (Age& temp){ return 何か; }
とされていればAge+Ageの演算は return 何か; の部分が返されるのですが、
3+Ageとか、前方がAgeでは無い場合のオペレーターロードはどうすればよいでしょうか・・
811
名前:
デフォルトの名無しさん
:2006/01/01(日) 19:24:14
>>810
普通の関数として用意する
812
名前:
デフォルトの名無しさん
:2006/01/01(日) 19:25:30
>>810
グローバルでオペレータオーバーロード+コンストラクタで数字からの変換定義
813
名前:
デフォルトの名無しさん
:2006/01/01(日) 19:56:12
いろいろ試行錯誤してみたんですけど
int operator + (int n,Age& temp) { ... }
のように引数を二つ取ればよかったのですねorz
すみませんでした
814
名前:
デフォルトの名無しさん
:2006/01/01(日) 22:18:16
微分方程式を解くプログラムをオブジェクト指向で作成したいと思っています。
微分方程式、積分ルーチンのクラスを作ったところで微分方程式の解を保持する
変数はどこに置いたらいいか分からなくなりました。
当初は微分方程式のクラスにおいていましたが、複数の積分ルーチンを作る際に
不都合が生じてきました。例えば、解を補間しない場合は、積分ルーチンから得た
解を微分方程式のクラスに置いていても問題はないのですが、補間する場合は
積分ルーチンの方に置いたほうが都合がいい為です。
何か良いアイデアがあればお聞かせください。
815
名前:
デフォルトの名無しさん
:2006/01/01(日) 22:23:11
>>814
普通に考えれば微分方程式クラスに置くべきだと思うが
それで不都合が生じるなら生じない方かもしくは
別途、解クラスとして独立させてみたらどうか?
816
名前:
デフォルトの名無しさん
:2006/01/01(日) 22:49:18
>>815
ども。別途解クラスを作って微分方程式クラスと積分ルーチンクラス
で集約するのですね。色々考えてはいますが、クラスを使ってデータを加工していく
作業は手続き型に思えてオブジェクト指向的な設計に感じないんですよ。
集約と言うか解クラスが微分方程式クラスと積分ルーチンに依存(を利用)すると
思えばいいのかなぁ・・・。
817
名前:
デフォルトの名無しさん
:2006/01/01(日) 22:56:23
>>816
それじゃ逆転の発想で、解とその他の計算にかかる純粋仮想関数を持ったクラスと
それから派生した2つの微分方程式クラスと積分クラスってのは?
818
名前:
魚チョコ
:2006/01/01(日) 23:06:05
>>816
漠然とした話なので「お好みで」としか答えようがないなあ。
前俺がその手の計算プログラムを組んだときには、
XYデータ列クラスと多項式クラスが大活躍したぞ。
何としても、シンプソンの方法(method)クラスみたいのを
作りたくなかったのだが、意味があったのだろうか。
数学計算は手続き型の方が相性がいいなと思ったしだい。
819
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:10:03
>>817
それだと結合が強すぎないですか?
うーん、やはり
>>815
さんのおっしゃる様に3つのクラスが互いに参照しあって
処理を進めるべきかな?
820
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:12:48
>>818
手続き型っすか・・・orz
XYデータ列クラスと多項式クラスってどのように使うものですか?
821
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:15:39
>>818
>>何としても、シンプソンの方法(method)クラスみたいのを
>>作りたくなかったのだが
何故なんとしても作りたくなかったのか、その心を是非聞きたいです。
822
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:18:49
>>814
データはどうなってるの?
823
名前:
流れ読まずに釣られるテスト
:2006/01/01(日) 23:27:19
>791
の言うアクセス関数、所謂アクセサがパフォーマンスを落とすと思い込んでいる
>794
はカス。
そもそも、日本語もまともに書けない
>788
はゴミ。
824
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:33:04
積分ルーチン・インスタンスに微分方程式インスタンスを与えると、解インスタンスが出てくるのではいかんのか。
3つのインスタンスの関係は、上位構造で管理すればいいように思うけど。
825
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:36:32
>>822
聞かれている事が良く分からないのですが、
データ(解)の型ですか?配列にΔ時間だけ微分方程式を発展させた際の解を
入れるつもりです。
826
名前:
デフォルトの名無しさん
:2006/01/01(日) 23:45:31
>>824
時刻t1から時刻t2になった時に、時刻t2の解だけ欲しいならば
それでも良いのですが、t1からt2の間を補間する場合はt2の解とt2を計算した
途中の情報が必要になります(それは積分ルーチンのprivateメンバになっているはず)。
t2の解を積分ルーチンのメソッドの引数として与えれば良いのかな?
時刻tの解を得るために
3種類のインスタンス:微分方程式、データクラス、積分ルーチンの
誰にメッセージを送るべきでしょうか?
827
名前:
デフォルトの名無しさん
:2006/01/02(月) 00:01:01
つか
>>791
関連の話してる奴ら全員論法がおかしい
828
名前:
814
:2006/01/02(月) 00:02:59
データクラスを作ると微分方程式が多次元の場合、データ配列のどこにどの
次元の解が入っているか誰が把握するべきかという問題もありますね。
>>822
さんはこういった事を質問されたのでしょうか?
自問自答が多いので一旦出直した方がいいかもしれませんね。お騒がせ致しました。
829
名前:
デフォルトの名無しさん
:2006/01/02(月) 20:15:39
あのーC++のstring型ってなんでしょうか
それとどの様な仕掛けで変数のサイズを可変させてるのでしょうか。。
830
名前:
デフォルトの名無しさん
:2006/01/02(月) 20:16:40
>>829
http://www.sgi.com/tech/stl/basic_string.html
831
名前:
デフォルトの名無しさん
:2006/01/02(月) 21:33:08
>>829
ふつうに考えて、クラスのなかに文字列へのポインタとサイズが
入っているのではないでしょうか(予想)
ですから、サイズ変更(別の文字列を代入)するときは、クラスのサイズ
を書き換えているんだと思います。(もちろんポインタも)
このような文字列も持ち方は他の言語では普通。\0で終わる文字列という
Cの仕様のほうがどちらかというと特殊。
832
名前:
デフォルトの名無しさん
:2006/01/02(月) 21:40:35
アセンブラでは普通
\0 が MSB だったりはするが
833
名前:
デフォルトの名無しさん
:2006/01/02(月) 21:55:52
つ malloc, new []
834
名前:
デフォルトの名無しさん
:2006/01/03(火) 03:01:05
以下のようなことがしたいのですが、なるべく余計なコピーを行うことなしに標準的な手段で実現することは可能でしょうか。
buf = 可変長バッファ、is = istreamとして、
1) 任意のバイト数分のデータをisから取ってきてbufに追加。
2) bufの頭から「ある処理」を行い、処理を完了したバイト数分bufから捨てる。なお、「ある処理」は使用するライブラリの都合上(const)char*が必須。
いまのところbufにstringを使用していて、(2)は以下:
const char* p = buf.data();
...
buf.erase(0, processed_size);
のように実現できそうなのですが、(1)がうまくいきません。
今はこう(↓)なっていますが、激しく気持ち悪いです。
char *add = alloca(n + 1); // char add[n + 1]; だとg++ -ansi -pedanticで怒られた
memset(add, '\0', n + 1);
is.read(add, n); // 実際に読み取ったバイト数もわからない。処理前後の位置を調べるしかない?
buf += add;
最初はnバイト分bufを広げてdata()の後ろに追記しようとしたのですが、返す型がconstなのでボツ。(書き換えると何が起きるかわからんで、と書いてあるし)
次にostringstreamを使おうとしたのですが、str()が返すのはコピーのようなので意味なし。
今のところ考えているのは、(1)を
a) 素直に1バイトずつループで追記。
b) 可変長バッファクラスを独自実装。
のどちらかで実現、と思っているのですが、C++は初心者なので、アプローチからして何か間違えているような気がしてならないです……。
835
名前:
デフォルトの名無しさん
:2006/01/03(火) 03:43:03
>is.read(add, n); // 実際に読み取ったバイト数もわからない。処理前後の位置を調べるしかない?
>buf += add;
is.read(add, n);
buf.append(add, is.gcount());
でよかったと思う。あと、n は const で定義してれば char add[n +1]; でも怒られんよ。
836
名前:
デフォルトの名無しさん
:2006/01/03(火) 03:49:12
>今のところ考えているのは、(1)を
>a) 素直に1バイトずつループで追記。
>b) 可変長バッファクラスを独自実装。
>のどちらかで実現、と思っているのですが、C++は初心者なので、アプローチからして何か間違えているような気がしてならないです……。
いまのままじゃダメなん?
処理の内容にもよるけど、あんまり速度的な効率求めるよりも、
簡素な記述で目的が果たせているんならそれに越したことはないよ。
837
名前:
デフォルトの名無しさん
:2006/01/03(火) 03:55:28
>>834
>最初はnバイト分bufを広げてdata()の後ろに追記しようとしたのですが、返す型がconstなのでボツ。(書き換えると何が起きるかわからんで、と書いてあるし)
std::vector<char>にしてよければ:
std::vector<char> buf;
std::size_t s = buf.size();
buf.resize(s + n);
is.read(&buf[s], n);
buf.resize(s + is.gcount());
とか?
838
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:09:26
>>837
ちょwwwwおまっwwwwwww
そりゃ、意図通りには動くかもしれんけど、規格的には反則だろw
# そーゆーことをしてもいいことにしようって動きはあったとは思うが。
839
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:19:08
横から失礼しますが
>>838
>規格的には反則
どこがまずい?
840
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:22:07
>>839
>is.read(&buf[s], n);
vector の要素が連続していることは保証されてたと思うけど、
こーゆー形でデータを受け取ることはまだinvalidなハズ。
841
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:27:59
いやvectorなら大丈夫だぞ?
842
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:31:53
>>840
vectorを837のように配列の代わりに渡すのは
Effective STLで紹介されていたと思う
>こーゆー形でデータを受け取ることはまだinvalidなハズ。
ソースは?
843
名前:
デフォルトの名無しさん
:2006/01/03(火) 04:49:26
あれ? いんだっけ?
ごめん、俺、なんか他の話と混同してたかも。
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/
これなんか、まんまだね。
844
名前:
デフォルトの名無しさん
:2006/01/03(火) 09:00:19
>>840
予めresizeで配列は十分要素数を持っているので問題ない。
要素数が足りないければ(reserveだけ行っていることも含む)たしかにまずいが。
845
名前:
834
:2006/01/03(火) 10:21:00
各位情報感謝。
>>835
なるほど、gcount()を使うんですね。
こういうインターフェースは予想してなかったので目に入ってませんでした。
> n は const で定義してれば char add[n +1]; でも怒られんよ。
ところがですね、
> error: ISO C++ forbids variable-size array `add'
そもそも可変長配列自体規格違反らしいんですわ。
// んなアホな。だったらどうしろと言うのだ。alloca()じゃ退化してるやん。>ISO C++
// まぁ-pedantic付けなきゃ通るんですが。
>>836
んー、でもそれだとC++を使う旨みが半減。効率あまり考えないなら、
他の言語の方が扱い易いような。
>>837-844
をを、vector使えるんですね。
stringのdata()のような内臓さらすメソッドがないので無理かと思ってました。
// しかし、&buf[n]ってぱっと見るとぎょっとするな……。
846
名前:
デフォルトの名無しさん
:2006/01/03(火) 11:11:22
>>845
>そもそも可変長配列自体規格違反らしいんですわ。
ん? n が const なら可変長配列にはならんでしょ?
>んー、でもそれだとC++を使う旨みが半減。効率あまり考えないなら、
>他の言語の方が扱い易いような。
実際、そーなんじゃない?
特別に効率が求められる場面でもなけりゃ、あえて C++ にこだわる必要はないよ。
それでも、俺は C++ が好きだから C++ を使うことにこだわるけどね。
あと、C++ の旨みは効率だけじゃないし。
847
名前:
デフォルトの名無しさん
:2006/01/03(火) 11:14:45
>>846
可変長配列にならないためには const なことに加えて
定数式("constant expression")で初期化されている必要がある。
848
名前:
デフォルトの名無しさん
:2006/01/03(火) 11:16:21
>>847
char add[n +1]; だぞ。
849
名前:
848
:2006/01/03(火) 11:17:18
あ、ごめん、寝ぼけてた。忘れてくれ。
850
名前:
834
:2006/01/03(火) 12:10:40
>>846
残念ながら今回のシチュエーションでは、代替手段としてalloca()を使って
いることからわかるように、可変長配列でなければならないんですよう。
void fill(int n) { char add[n+1]; ... } こんな感じ。
int nをconst int nにしても、定数式じゃないのでNG。
あと、今回は効率を求めてCに行き、CでOOやるのがメンドくなってC++に
走ったので、あまり効率は落としたくない、という理由もあったり。
ま、コンテナクラスを使いまくると裏でメモリアロケータががんがん
走ってるだろうからあまり気にしても意味がないような気はしますが……。
851
名前:
デフォルトの名無しさん
:2006/01/03(火) 12:32:17
>>850
残念だけど、効率求めんなら stream 系は使わずに C と女滋養なやり方したほうがいいよ。
852
名前:
デフォルトの名無しさん
:2006/01/03(火) 13:25:54
Cを何年かうってきてC++を勉強中なんですがクラスを作ってそのクラスで宣言
されてる関数をつかうときに宣言したクラス名.関数名みたいな形で書くのが
めんどくさく感じるんですがこれが普通なんでしょうか?こっちの方がどのクラス
を使ってるのかわかりやすいと言われればそんな感じもしますが他になにかやり
方があって私がめんどくさいことをしてるだけなのでしょうか?どなたがわかる
方いらっしゃいましたら教えてください。
853
名前:
デフォルトの名無しさん
:2006/01/03(火) 13:28:04
>>852
まさかクラスのメンバ関数を全てstaticにするとか馬鹿なことやってないよね?
854
名前:
デフォルトの名無しさん
:2006/01/03(火) 13:28:12
>宣言したクラス名.関数名みたいな形で書くのが
あんたクラスって名前空間だと勘違いしていないか?
855
名前:
デフォルトの名無しさん
:2006/01/03(火) 13:48:24
852です。
例えばclass AAA{
int aaaa;
void AAAA(){}
}
みたいなクラスを作ってどっかでAAA a;って宣言して
中の関数を呼び出すときにa.AAAA()って呼び出すのではないでしょうか?
856
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:02:09
a.AAAA() の a はクラス名じゃなくてインスタンス名
めんどくさく感じるのは、多分オブジェクト指向に対する理解が足りないから
857
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:05:05
>>855
そのAAAA()の中では、 a.aaaa じゃなくて aaaa で済むのが利点のひとつ。
858
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:07:27
this->aaaaが省略できてaaaaと書けるだけだけどね。
thisが省略できない場合も多々ある。
859
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:07:39
Cで構造体使ったことないんかい。
860
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:07:44
てか、いくらサンプルのコードだからってその命名は酷い。
>>855
のセンスの無さを垣間見た気がするのは俺だけですか? そーですか。
861
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:12:28
>>852
Cを長年やってきたなら、関数名(というか、外部名空間)の管理に手を焼いたことくらいあるだろう?
長ったらしいプリフィックスを毎回打たされるのとどっちが面倒だろうね
862
名前:
デフォルトの名無しさん
:2006/01/03(火) 14:55:39
>>855
a.AAAA()はC言語ならAAA_AAAA(&a)とでも書くところなのだけど、
それでもめんどうくさく感じる?
863
名前:
デフォルトの名無しさん
:2006/01/03(火) 16:41:17
そう考えるとusing使うなって言う意見は酷だよなやっぱり
864
名前:
デフォルトの名無しさん
:2006/01/03(火) 16:44:57
オブジェクト指向って人によって意見がまちまちのような気がします.
本当に一つの概念として確立されているのかよく分かんなくなります.
分かる人には分かる,といったものでない雰囲気がするんですが,やはり,僕の認識が誤りなんでしょうか?
865
名前:
デフォルトの名無しさん
:2006/01/03(火) 16:48:32
IDEのインテリセンス使ったらマンドクサイの軽減するんじゃまいか?
866
名前:
デフォルトの名無しさん
:2006/01/03(火) 16:55:31
>>864
つ
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716844/249-1429959-0070736
オススメ。嫁。
867
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:06:15
>>866
レスありがとうございます.
アマゾンとかで検索するとオブジェクト指向のデザインパターンを説明する本って星のようにありますよねぇ...
この本読んで勉強してみようと思います.
868
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:32:52
>>863
誰がそんなこと言うんだ?
俺だってグローバルスコープで using namespace を使っているのを見かけたら
口に出すかどうかは別としてやった奴を警戒するけど、using そのものを否定するわけじゃない
869
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:39:48
>>867
オブジェクト指向って学ばなくても組んでたらその方向へ
いくと思う。学ぶと近道になるのは確かだけどね。
870
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:41:36
しかしboost::lambdaなんか使うと
グローバルでusing namespaceしないと面倒でやってらんない
871
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:44:28
グローバルって言ってもファイルスコープだろうしな
872
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:47:25
ソースのグローバルスコープなら問題なくね?
873
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:52:19
グローバルスコープ≠無名の名前空間
874
名前:
デフォルトの名無しさん
:2006/01/03(火) 17:56:32
この問題に関しては同じことだけど
875
名前:
デフォルトの名無しさん
:2006/01/03(火) 18:43:26
using については、C++ Coding StandardsとC++ 標準的コーディング技法
で言及されとりますな。
さすがに関数内だけでのみusing namespaceを使うつうのは厳しすぎるので、
ソースファイルの最後のincludeの後でusing namespaceを使うというのが
妥当な所かと思う。
876
名前:
デフォルトの名無しさん
:2006/01/03(火) 19:04:08
using が効かないメンバを作れるならまだマシだけどね
自分が言及した覚えのない識別名との衝突にびくびくするのはやっぱりやだ
877
名前:
デフォルトの名無しさん
:2006/01/03(火) 19:14:54
>867
こんな指向とか
ttp://www.entis.jp/doc/lolita_programing/lolita1.html
878
名前:
魚チョコ
:2006/01/03(火) 20:25:17
>>877
そうなんだよな。いくら例のための無意味な名だとしてもだ。みーんなして判でおしたように foo や hoge ばかり使うってのが没個性で気にいらねえ。
わからんちん相手には、 _____(_,__,___);
まともなプログラムじゃ使えないからせめてこういうときだけ、 o(oo,oo);
いつぞや誤用を指摘されてくやしかったから、 null(NULU, NULl_, NUl_l_ );
こんなん使ってもちっとも読みやすくならないばかりか打ちまちがえるってえのなあ…… flase(ture,tuer,fals);
嫌な奴の名前 void Kusakabe(henjin);
そういや、hogebar てのも見ないな
879
名前:
デフォルトの名無しさん
:2006/01/03(火) 20:28:09
>>877
アルファベットじゃ萌えない
880
名前:
デフォルトの名無しさん
:2006/01/03(火) 21:29:28
>>877
肝心な変数名が萌えない。
881
名前:
デフォルトの名無しさん
:2006/01/03(火) 21:37:11
using namespace std;
は別にグローバル空間で明記したって重大な問題にはならないような。
他は名前のルックアップとnamespace ○○=boost::lambdaと#includeの位置を調整で対処。
882
名前:
デフォルトの名無しさん
:2006/01/03(火) 21:47:00
>>880
つ
ttp://tokuhirom.dnsalias.org/~tokuhirom/wiki/%E3%82%A8%E3%83%AD%E3%82%B2%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
883
名前:
デフォルトの名無しさん
:2006/01/03(火) 21:47:22
ヘッダにusing書かなきゃ何したって構わんけどな。それだけはやめてくれ
884
名前:
デフォルトの名無しさん
:2006/01/03(火) 21:50:39
>>881
問題が起こらないようにわざわざ std namespace を利用してんのにそれを無駄にするようなことをするな。
まぁ、個人的にはそれで問題が起きるようならその衝突相手が悪い気がせんでもないが。
885
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:07:22
>>884
衝突が起きたらそのときにstd::で修飾すれば良い。
一般に、「グローバルでusing namespaceをすると名前空間の利点が失われる」というのは
言い過ぎだと思う。
886
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:10:48
事故ってから修復ってスタンスやだ
クリーンを保ちながら育てていきたい
887
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:13:01
聞いてない空間名が出てきただけで激しく気持ち悪い
888
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:26:30
#include <iostream>
#include <list>
struct A{
int a, b, c;
long x;
};
struct B{
int a, b, c;
};
struct Hoge{
A* pa;
B* pb;
};
void func0( std::list<Hoge>& list_hoge ){
for( std::list<Hoge>::iterator it = list_hoge.begin(); it != list_hoge.end(); ++it ){
std::cout << it->pa->a << it->pa->b << it->pa->c << std::endl;
}
}
void func1( std::list<Hoge>& list_hoge ){
for( std::list<Hoge>::iterator it = list_hoge.begin(); it != list_hoge.end(); ++it ){
std::cout << it->pb->a << it->pb->b << it->pb->c << std::endl;
}
}
ストライドが微妙に違うA、Bがありまして、それをアクセス用のポインタとして持つHoge型があります。
Hoge自体はいじれるのですが、厄介なことにHogeにアクセス用ポインタを持たせるという点だけは変えられません。
func0とfunc1はそのストライドの差以外は全く同じ処理なので、どうにか一つにしたいと思っています。
しかし、template、union・・・・それなりに考えて見たのですが、上手く行きません。
何か良い手をご存じの方、いらっしゃいましたら是非にも。
889
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:34:05
>>888
A を B から public継承すればいいじゃん。
890
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:39:28
>>889
ヒントありがとうございます、なんとなく出来そうな気がしてきました。
もう少し悩んできます。
891
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:40:24
>>890
あと、その func0/func1 は B のメンバ関数にするときっと幸せになれる。
892
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:48:18
>>888
メンバへのポインタを使ってみた。
typedef std::list<Hoge> HogeList;
template<typename T>
void func(const HogeList& list_hoge, T* Hoge::*member) {
for (HogeList::const_iterator it = list_hoge.begin(); it != list_hoge.end(); ++it) {
const T& foo = *(*it.*member);
std::cout << foo.a << foo.b << foo.c << std::endl;
}
}
int main(){
const std::size_t N = 3;
B a[N] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
Hoge hoge[N];
for (int i = 0; i < N; ++i)
hoge[i].pb = &a[i];
HogeList ls(hoge, hoge + N);
func(ls, &Hoge::pb);
}
893
名前:
892
:2006/01/03(火) 22:51:51
それで気付いたんだけど、イテレータに対して->*が使えないのはどうかと思った。演算子オーバーロードしろよ。
.*はなぜか*よりも優先順位が低いから、そのせいで括弧の数は増えなかったけどさ。
894
名前:
デフォルトの名無しさん
:2006/01/03(火) 22:54:55
>>891
さらにヒント感謝です。なるほど・・・。
>>892
ぐぁ、凄い。すぐに理解できないですが、じっくり読んでみます。
お二人ともありがとうございます
895
名前:
デフォルトの名無しさん
:2006/01/03(火) 23:24:26
横からすみません
>> T* Hoge::*member
はなんでT* Hoge::member じゃだめなんですか?
896
名前:
デフォルトの名無しさん
:2006/01/03(火) 23:24:59
Loki::Int2Typeやboost::enable_if使用すべきタイミング。
897
名前:
デフォルトの名無しさん
:2006/01/03(火) 23:26:31
>>895
ポインターじゃないと意味が無いから。
898
名前:
デフォルトの名無しさん
:2006/01/04(水) 02:15:04
メンバ関数にしない理由がわからん。
899
名前:
デフォルトの名無しさん
:2006/01/04(水) 11:57:29
int hoge(100);
なんていう初期化、ありなんですか?
900
名前:
デフォルトの名無しさん
:2006/01/04(水) 12:26:18
>>899
ええよそれでも
901
名前:
デフォルトの名無しさん
:2006/01/04(水) 12:52:36
int hoge(int(100));
902
名前:
デフォルトの名無しさん
:2006/01/04(水) 12:58:58
>>901
もっと!もっと!
903
名前:
デフォルトの名無しさん
:2006/01/04(水) 13:09:09
int hoge((int)int(100));
904
名前:
デフォルトの名無しさん
:2006/01/04(水) 13:09:52
>>899
それができなかったら、templateで使えねー。
905
名前:
デフォルトの名無しさん
:2006/01/04(水) 17:10:13
あの、英語読めないのでC++の解説書でも読もうと思うのですが
例えばifstreamクラス内のメンバ関数や定数を一つ一つ丁寧に説明しているお勧めの本ってありますか?
906
名前:
デフォルトの名無しさん
:2006/01/04(水) 17:58:48
後々嫌でも英語読むことになるから、イマノウチに読めるようになっとケ
907
名前:
デフォルトの名無しさん
:2006/01/04(水) 18:02:41
>>905
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
908
名前:
デフォルトの名無しさん
:2006/01/04(水) 18:29:14
Java のアプレットに対して、外部ツール(VC++で作成)からコンボボックスの操作および
ボタンの押下を制御したいと思っていますが、うまくいきません。
ボタンが押されたときにアプレットのウィンドウに送られるメッセージをSPYで監視して
それらしいメッセージを送ってみたのですが、期待する動作をしません。
コンボボックスの操作は出来たのですが。。。
何か考え方が間違っているのでしょうか?
909
名前:
デフォルトの名無しさん
:2006/01/04(水) 18:30:40
goto Win32スレ;
910
名前:
908
:2006/01/04(水) 18:41:08
>>909
誘導ありがとうございます。
お手数をお掛けしました。
911
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:12:28
質問です。以下のようなエラーが出るのですが仕様でしょうか。
仕様なら、綺麗な回避方法はあるでしょうか。
(typeを一緒にテンプレートパラメータとして渡すとか位?)
コンパイラはcygwinのgcc3.4.4です。
コード-----------------------------------------
template <class T>
struct foo {
typedef typename T::type type;
};
template <class T>
struct goo : foo<goo<T> > {
typedef T type;
};
main() {
goo<int>::type t;
}
コンパイル結果---------------------------------------------
test.cpp: In instantiation of `foo<goo<int> >':
test.cpp:8: instantiated from `goo<int>'
test.cpp:13: instantiated from here
test.cpp:4: error: no type named `type' in `struct goo<int>'
912
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:41:30
template <class T>
struct foo {
typedef T type;
};
template <class T>
struct goo : foo<T> {
using foo<T>::type;
};
int main() {
goo<int>::type t;
}
913
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:43:49
>>911
goo の無限再帰でコンパイラがラリった?
914
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:47:47
コンパイラのせいというより、単純に
goo<int>のインスタンス化にはgoo<int>が必要っていう
自己言及による矛盾が起きてるだけかと。
915
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:52:10
>>911
struct goo : foo<goo<T> >
これ展開しようとしたらどうなるんだっけ?
916
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:53:07
テンプレートの再帰は特殊化で止めるんだけど
このケースでは無理そうだな
917
名前:
デフォルトの名無しさん
:2006/01/04(水) 20:54:06
どうしたらこんな状況になるのか分からない
918
名前:
デフォルトの名無しさん
:2006/01/04(水) 21:19:27
>>911
VC6,VC2005なら通るね
CRTPって言うんだっけ。
ATL/WTLなんかこんなコードだらけのような
919
名前:
918
:2006/01/04(水) 21:21:23
ごめん、通ったのは
>>912
のコードだ。
920
名前:
デフォルトの名無しさん
:2006/01/04(水) 21:48:17
ATL gaかなりこんな感じのコードだらけなのは確かだよね。
うまく避けてるんだろう・・・
921
名前:
デフォルトの名無しさん
:2006/01/04(水) 22:48:03
>>911
こんなとこか
template <class T>
struct foo {
struct apply{typedef typename T::type type;};
};
922
名前:
918
:2006/01/05(木) 00:33:53
>>911
>(typeを一緒にテンプレートパラメータとして渡すとか位?)
↓こういうことなのかな?とりあえずVCでは通る。
template <class T, class TY>
struct foo {
typedef typename TY type;
};
template <class T>
struct goo : foo<goo<T>, T> {
typedef T type;
};
でも、911の意図通りの展開がされてるのやらどうやら?
頭こんがらがってよく分らない
923
名前:
デフォルトの名無しさん
:2006/01/05(木) 01:42:41
>>911
こんなのも
template <class T>
struct foo;
template<template<class>class F, class T>
struct foo< F<T> >{
typedef T type;
};
924
名前:
デフォルトの名無しさん
:2006/01/05(木) 01:51:54
回避方法なんていくらでもあるってことだな。
925
名前:
デフォルトの名無しさん
:2006/01/05(木) 09:07:49
>912-924
ありがとうございます。
>917
本当はgooはテンプレート引数がもっと多い巨大なクラス。
その中から幾つかをfooに渡してfooを特殊化すれば、
gooを全部特殊化しなくてもいい
(さらに本当はfooにあたるクラスは複数あって、
各々の特殊化をgooが多重継承して一つのクラスに仕上げる、
という構造になっている。)
↓
しかしその中でgooで定義されるtypedefが必要になった
↓
gooをパラメータで渡したらこうなった
といった経緯なんです。
922さんのがまさに意図していた回避法なんですが、
かなり凄い量のパラメータを与えなければならないので微妙な感じです。
926
名前:
デフォルトの名無しさん
:2006/01/05(木) 09:10:59
>>925
一旦白紙に戻してクラス設計やり直した方がいいんじゃまいか?
流石に巨大なテンプレートクラスを複雑に多重継承していかないと
駄目なようなのは、設計として破綻してる希ガス
927
名前:
911=925
:2006/01/05(木) 09:17:35
ていうかこれ情報小出し臭い質問の仕方でしたね。
エラーになる部分だけ抜き出したつもりだったんですが……
結局回答を参考にしつつ、力技でなんとかすることになりそうです。
928
名前:
デフォルトの名無しさん
:2006/01/05(木) 10:53:11
>>927
今頃気づいたか。最も第三者から見て理解不能の質問の仕方だ。
929
名前:
デフォルトの名無しさん
:2006/01/05(木) 11:30:24
それなりに話のねたにはなったんで迷惑じゃなかったけどね
930
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:16:52
template<class T> int func(T arg);
というテンプレート関数があるのですが、
Tがクラス型などの場合に備えると、引数は参照にすべきなんでしょうか?
その場合参照の引数のと参照なしの引数のと2つ関数を用意すべきでしょうか?
931
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:22:16
>>930
1. boost::call_traits<T>::param_type
2. const T&
3. T
932
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:24:44
>>931
3つ用意せい言うことですか?
933
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:27:31
>>932
優先順位。上のほうが望ましいと俺は思っているだけ。
934
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:30:55
>>933
じゃあboostない場合はconst T&で一括でもよろし言うことですね
ありがとございますっ
935
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:33:51
>>934
それくらい自分で作れ。
936
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:36:10
>>935
えっ、何のことです?
937
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:46:22
template <class T>
struct call_traits {
typedef const T& param_type;
};
template<>
struct call_traits<int> {
typedef int param_type;
};
//以下値渡しするものすべてについて繰り返し
938
名前:
デフォルトの名無しさん
:2006/01/05(木) 12:54:57
Boostをダウンロードすればいいじゃないか。
939
名前:
デフォルトの名無しさん
:2006/01/05(木) 13:09:19
>>937
あっ、boostと同じようなものを作れっちゅーことでしたか
てことは組み込み型は参照で受け取ったらまずい場合があるちゅうことですかね?
940
名前:
デフォルトの名無しさん
:2006/01/05(木) 13:13:58
>>939
まずくはないけど効率が悪いってだけ
941
名前:
デフォルトの名無しさん
:2006/01/05(木) 13:59:40
>>940
いろいろ調べましたがわかりません、何故効率が悪いのか教えてくださいな?
942
名前:
デフォルトの名無しさん
:2006/01/05(木) 14:13:00
本来間接参照しなくてもいいものを間接参照してしまうからだろ
943
名前:
デフォルトの名無しさん
:2006/01/05(木) 14:26:55
なるほど、実引数でコピーした実体を直で扱うのではなく、
アドレスを参照して扱うので効率が悪いというわけですか
944
名前:
デフォルトの名無しさん
:2006/01/05(木) 14:54:19
組み込み型でもdoubleだと微妙かもね。
945
名前:
デフォルトの名無しさん
:2006/01/05(木) 17:41:09
64bitならポインタの大きさがdoubleと一緒だ
946
名前:
デフォルトの名無しさん
:2006/01/05(木) 18:01:25
その程度だともう処理系とか周りのコードに依存するんじゃないのか
947
名前:
デフォルトの名無しさん
:2006/01/05(木) 18:13:51
>>946
するする、doubleの引き数はスタックを介さずに受け渡すコンパイラもあることだし。
#つーか、そもそも最適化で消える可能性もあるわけで。
948
名前:
デフォルトの名無しさん
:2006/01/06(金) 15:14:37
インライン展開できないような関数をオーバーヘッドが気になるくらい
何回も呼び出すっていう設計が想像できない俺は素人?
それともでっっっかいクラスから組み込み型にまで使う超汎用ライブラリなんだろうか
949
名前:
デフォルトの名無しさん
:2006/01/06(金) 17:25:06
まあ、素人だね。
画像処理やってみなっせ。
950
名前:
デフォルトの名無しさん
:2006/01/06(金) 22:35:06
>>943
値渡しのとき、オブジェクトが複製されるかどうかはコンパイラも含めて状況による。
レジスタ使いまわして、まったくオブジェクトのコピーが発生しないケースもありうる。
>>948
どんなのがインライン展開されるべきかは規定されてないから、よほど自明でないかぎり
常に関数呼び出しのオーバヘッドはあると思ってたほうが安全。嫌なら手で最適化するしか。
951
名前:
VC++スレから飛んできました
:2006/01/07(土) 10:07:19
よく単位を間違えて代入してしまうので、
別の型にしておけばいいじゃん、と思って
typedef double millisecond;
typedef double microsecond;
typedef double second;
ってやったけど、
millisecond x = 0.1;
microsecond y = 0.2;
second z = 0.3;
としても x=y; y=z; z=x; とかなんの警告も出ないのね。
やっぱそれぞれクラスを作らなきゃだめ?
952
名前:
デフォルトの名無しさん
:2006/01/07(土) 10:33:19
boostかどっかにstrong_typedefってなかったっけ?
953
名前:
デフォルトの名無しさん
:2006/01/07(土) 10:45:00
D言語にするか、クラスにするかのどちらか
954
名前:
デフォルトの名無しさん
:2006/01/07(土) 10:49:49
D言語なんか問題外。ここはC++スレです。
955
名前:
デフォルトの名無しさん
:2006/01/07(土) 10:50:57
BOOST にあるね。
boost/strong_typedef.hpp 見てみた。
結局主要な演算子を定義した構造体を作ってるだけだった。
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double,strong_millisecond);
BOOST_STRONG_TYPEDEF(double,strong_microsecond);
BOOST_STRONG_TYPEDEF(double,strong_second);
とすると、
strong_millisecond x = strong_millisecond(0.1);
double d = (double)x;
と明示的に変換しないといけなくなる。
うはwww、これでポカミスしないですみそうだ。
正規表現ライブラリくらいしか boost つかってなかったけど、
また一つ boost の恩恵に浴することができた。
956
名前:
デフォルトの名無しさん
:2006/01/07(土) 10:58:43
こういう単位付きの量を表すためのライブラリってなんかBoostで作りかけのものがあったような気がする。
957
名前:
デフォルトの名無しさん
:2006/01/07(土) 11:08:15
boost.mpl のチュートリアルに速度と質量とを掛け算したもの同士でしか比較できないとか
速度/時間 * 時間 == 速度 とか、数値と物理単位を同時にあつかうような例があったと思う。
958
名前:
デフォルトの名無しさん
:2006/01/07(土) 11:17:07
>>957
少なくとも次元を考慮して欲しいよね。
959
名前:
デフォルトの名無しさん
:2006/01/07(土) 14:39:33
>>959
五右衛門も忘れないでね。
960
名前:
デフォルトの名無しさん
:2006/01/07(土) 17:09:39
くぁwせdrftgyふじこlp;「」’
961
名前:
デフォルトの名無しさん
:2006/01/07(土) 17:12:42
とっつぁ(ry
962
名前:
デフォルトの名無しさん
:2006/01/07(土) 19:28:27
お前ら面白すぎ
963
名前:
デフォルトの名無しさん
:2006/01/07(土) 19:32:37
元々ハンガリアン記法は、型名を付けるんじゃなくて、
型の意味を付けるはずだった、と言う話を思い出した。
inchAvgDistance += mmDist[0];
で間違いが直ぐ判るとかなんとか。
964
名前:
デフォルトの名無しさん
:2006/01/07(土) 19:51:04
全然わからん
965
名前:
343
:2006/01/07(土) 22:21:08
#defineを使って
としてCLASSES(Hoge)を
class Hoge; class HogeFactory;
と展開させられないでしょうか
お願いします
966
名前:
965
:2006/01/07(土) 22:25:31
誤爆、965≠343です
967
名前:
デフォルトの名無しさん
:2006/01/07(土) 22:39:34
class Hoge; class Hoge ## Factory;
968
名前:
デフォルトの名無しさん
:2006/01/07(土) 22:41:15
>>967
の ## の前後のスペースはいらないね。
って、2ch だと勝手に入っちゃうんだったっけ?
それはそうと、開区間、閉区間、片開区間を表現する
標準的なクラスって用意されていましたっけ??
969
名前:
965
:2006/01/07(土) 23:19:47
>967
お早いレスありがとうございます。
おかげさまで、いろいろやりたかったことができそうです。
970
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:03:00
>>968
標準にはないけどboostになら
Boost Interval Arithmetic Library
http://www.boost.org/libs/numeric/interval/doc/interval.htm
971
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:05:46
>>965
俺もそんなことをやったことがあったが、
結局後でテンプレート使えば言いやということに気付いて#defineには引っ込んでもらった。
972
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:08:02
Boost にはあるのか。使おうかな。
Boost って本当に何でもあるよな。
えらい人たちが標準化も視野に入れてやってるんだから
大丈夫だとは思うけど、なんでもいれちゃえ、って
感じじゃないんだろうか・・・
973
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:11:02
>>972
Boostに収録されるまでにも過程があって、
認められないとBoostには収録されない仕組みになっている。
974
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:22:45
一部分だけ異なる似たような処理を、簡潔かつ実行速度が速くなるように
記述する方法ってありませんか?
2次元配列に対して処理を行う関数を複数作りたいと思っています。
例えば以下の関数sumは配列の合計を出す関数です。(変数宣言などは省略)
int sum(){
(前処理)
for(r = 0; r < nRow; r++){
for(c = 0; c < nCol; c++){
s += cell[r,c]; … (1)
}
}
(後処理)
return s;
}
似た形として、平均値を出す関数や配列の中身をインクリメントする関数など、
(1)の部分だけが異なる関数をたくさん作りたいと思っています。
ただ、(1)の部分だけ違う関数を作るにはこのままではループ部分や前処理・後処理も
記述しないといけません。
新しく関数を付け加えたいとき、できれば(1)の部分だけ書けばいいような形に
したいのですが何かいい方法がありませんか?
なお、ループの回数が多いため(1)の部分は関数呼び出しの形にはしたくないです。
(コンパイルしてインライン展開されるならok)
975
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:23:12
cell[r,c]はcell[r][c]の間違いです。
976
名前:
デフォルトの名無しさん
:2006/01/08(日) 00:24:06
>>974
関数オブジェクト
977
名前:
デフォルトの名無しさん
:2006/01/08(日) 01:19:06
>951
typedefは別の名前をつけるだけで、全部同じ型だよ。
でも、例に挙げているのは全部同じ単位だから、別の型に定義するのは
止めといた方が……double使うのなら素直に基本単位にして使うのが
吉だと思う。
978
名前:
デフォルトの名無しさん
:2006/01/08(日) 01:22:02
>974
MetaProgram
979
名前:
デフォルトの名無しさん
:2006/01/08(日) 02:12:46
今猫のページでC++を勉強してるのですが、
vectorクラス、mapクラス ...と勉強していっていきなり
basic_stringコンテナとか不明な表現が出てきて困っています
察するに今までのvectorやmapも各々
vectorコンテナ
mapコンテナ
的な感覚でいいのでしょうか
980
名前:
デフォルトの名無しさん
:2006/01/08(日) 02:22:41
>>979
Yes
ひっくるめて、コンテナクラスライブラリといったりするね。
C++ だとそれを実現するためにテンプレートを使うから、
テンプレートライブラリと言うことも多いけど。
981
名前:
デフォルトの名無しさん
:2006/01/08(日) 02:26:18
>>979
container = 入れ物
和訳してみれば分かりやすいものも結構ある。
頑張れ。先は長いぞ。
982
名前:
デフォルトの名無しさん
:2006/01/08(日) 02:35:31
>>951
次元解析は Barton and Nackman trick と呼ばれる有名な解決法あり。
983
名前:
デフォルトの名無しさん
:2006/01/08(日) 02:48:09
>>980
>>981
はい、ありがとうございます
せめてヘッダーの中が読めればいいのですが・・・
精進します
984
名前:
デフォルトの名無しさん
:2006/01/08(日) 03:46:00
クラス内でプロトタイプ宣言した
enum型の型をclass A{…}の外で実装しようとしたのですが
class A{
public:
enum Event;
};
enum A::Event{ onClick, onMove }; //この行で未定義のシンボル A::Eventとエラーがでてしまいました
どう書けば良いのですか…ご教示お願いします
985
名前:
984
:2006/01/08(日) 03:48:19
すいません、↑は enum A::Event={ onClick, onMove };と書き間違えました
986
名前:
984
:2006/01/08(日) 04:04:14
985は間違いです…ごめんなさい、もう寝ます
987
名前:
デフォルトの名無しさん
:2006/01/08(日) 06:28:01
>>984
出来ないことはヤメロ。
988
名前:
デフォルトの名無しさん
:2006/01/08(日) 07:05:07
>>974
こんなんで。それなりの最適化するコンパイラならインライン化は十分期待できるんじゃないかな。
もちろん関数ポインタじゃなくて関数オブジェクトで書いてもいいけど好みで。
#include <iostream>
const int nRow = 3, nCol = 2;
int cell[nRow][nCol];
template<class T, void func(T&, int&)>
T apply() {
T tmp = 0;
for (int r = 0; r < nRow; ++r)
for (int c = 0; c < nCol; ++c)
func(tmp, cell[r][c]);
return tmp;
}
void inc(int &tmp, int &x) { ++x; }
void add(int &tmp, int &x) { tmp += x; }
typedef int apply_func(void);
apply_func *all_inc = apply<int, inc>;
apply_func *sum = apply<int, add>;
int main() {
all_inc();
std::cout << sum() << std::endl;
}
989
名前:
974
:2006/01/08(日) 11:20:58
>988
あーなるほど、関数ポインタ自体をテンプレートにしてしまえばいいのか。
自分で考えたときには関数ポインタを引数で渡す形しか思い浮かばなかったので、
これじゃインライン展開されないよなぁ…ということでドツボにはまってました。
MetaProgramってのははじめて聞きました。
でもやることに対してちょっと大掛かりすぎるので今回は見送りたいと思います。
これで見難いマクロで無理やり実現する必要がなくなりそうです。
どうもありがとうございました。
990
名前:
デフォルトの名無しさん
:2006/01/08(日) 11:29:59
梅
991
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:12:46
新スレは?俺が立てるの?
992
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:14:18
テンプレートスレはなくなったから、
「テンプレートは別スレ」という表現はどうかと思う。
993
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:25:49
新スレ
C++相談室 part46
http://pc8.2ch.net/test/read.cgi/tech/1136690107/
994
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:43:23
埋まるまで息止める
995
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:44:11
苦しい早く埋めてくれ
996
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:45:32
afsd
997
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:46:48
うめ
998
名前:
デフォルトの名無しさん
:2006/01/08(日) 12:58:43
埋めはらがー
999
名前:
デフォルトの名無しさん
:2006/01/08(日) 13:01:44
うめ
1000
名前:
デフォルトの名無しさん
:2006/01/08(日) 13:01:44
コンクラーベ
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.