■過去ログ置き場に戻る■ 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.