C++相談室 part45
■ このスレッドは過去ログ倉庫に格納されています
0001(*^ー゚)b グッジョブ!!
2005/11/26(土) 21:20:04ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1128512737/
0685デフォルトの名無しさん
2005/12/30(金) 10:19:26MyClass x,y,z;
...
z=x+y;
などと書けるようにするためでは?
0686デフォルトの名無しさん
2005/12/30(金) 10:34:50参照がないと値渡し以外で使うときにoperatorが使いにくい罠ってこったな。
Hoge hage(Hoge *p)
{
Hoge kami(0);
Hoge fusa;
fusa = p->operator *(kami) ; //これ以外呼びようがない!
return fusa;
}
これはつらいっしょ。
0687デフォルトの名無しさん
2005/12/30(金) 10:35:43bcc32.exeなら__propertyで読み出し専用配列つくれるよ!
ハ_ハ
('(゚∀゚∩ つくれるよ!
ヽ 〈
ヽヽ_)
0688デフォルトの名無しさん
2005/12/30(金) 11:07:070689デフォルトの名無しさん
2005/12/30(金) 11:12:55VCにも__declspec(property())があるよ!
ハ_ハ
('(゚∀゚∩ あるよ!
ヽ 〈
ヽヽ_)
0690デフォルトの名無しさん
2005/12/30(金) 11:31:120691デフォルトの名無しさん
2005/12/30(金) 11:42:40こういうことではないかと。
0692デフォルトの名無しさん
2005/12/30(金) 11:43:27環 立 イ_i_ ┼─
土見 | イ ヒ イ 子
/\___/ヽ
(.`ヽ(`> 、 /'''''' '''''':::::\
`'<`ゝr'フ\ + |(●), 、(●)、:| +
⊂コ二Lフ^´ ノ, /⌒) | ,,,ノ(、_, )ヽ、,, .:::|
⊂l二L7_ / -ゝ-')´ + | `-=ニ=- ' .::::::| +
\_ 、__,.イ\ + \ `ニニ´ .:::/ +
(T__ノ Tヽ , -r'⌒! ̄ `":::7ヽ.`- 、 ./|
ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、 \ ( ./ヽ
\l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
class Cool
{
public:
__declspec(property(get=GetX, put=PutX)) int x[];
:
:
};
0693デフォルトの名無しさん
2005/12/30(金) 11:47:54その部分は脳内修正お願いします。
アク禁うざいOTL
0694デフォルトの名無しさん
2005/12/30(金) 12:05:52木タ 木旧 小 ⊥
 ̄
/\___/ヽ
(.`ヽ(`> 、 /'''''' '''''':::::\
`'<`ゝr'フ\ + |(●), 、(●)、:| +
⊂コ二Lフ^´ ノ, /⌒) | ,,,ノ(、_, )ヽ、,, .:::|
⊂l二L7_ / -ゝ-')´ + | `-=ニ=- ' .::::::| +
\_ 、__,.イ\ + \ `ニニ´ .:::/ +
(T__ノ Tヽ , -r'⌒! ̄ `":::7ヽ.`- 、 ./|
ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、 \ ( ./ヽ
\l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
class Cool
{
public:
#ifdef __MICROSOFT_C__
__declspec(property(get=GetX, put=PutX)) int x[];
#endif
#ifdef __BORLAND_C__
__property int x[int] = { read=GetX, write=PutX };
#endif
:
:
};
0695デフォルトの名無しさん
2005/12/30(金) 13:46:31ぐぐってもヒットしません。
0696681
2005/12/30(金) 14:44:17「参照渡しがデフォってスタイルでなんかいいことひとつでもあんの?」
の間違い。orz
0697デフォルトの名無しさん
2005/12/30(金) 14:50:490698デフォルトの名無しさん
2005/12/30(金) 15:13:01「ビットの定数性」に対する語としての論理的定数性のこと?
0699デフォルトの名無しさん
2005/12/30(金) 15:23:43蒸し返して悪いけど、そうじゃないかと思ったのだが、それだと
後半の値渡しを批判しているっぽいくだり『コピコンを呼ぶのは
パフォーマンス的に全くの無駄だし』と矛盾しない?
0700デフォルトの名無しさん
2005/12/30(金) 15:26:57exception から直接派生しているもの
bad_alloc, bad_cast, bad_exception, bad_typeid,
ios_base::failure, logic_error, runtime_error
logic_error から派生しているもの
domain_error, invalid_argument, length_error, out_of_range
runtime_error から派生しているもの
overflow_error, underflow_error, range_error
例えばメモリアロケーションに失敗したり、
その他浮動小数点演算で数値として表すことができない結果が出たり、
といろいろと例外処理したいシチュエーションがありますが、
そういう例外クラスの事実上の標準なクラスライブラリってあります?
0701デフォルトの名無しさん
2005/12/30(金) 16:08:47処理系依存です
処理系依存です
処理系依存です
処理系依存です
0702700
2005/12/30(金) 17:03:49ISO規格に含まれている >>700 の例外だけは
ポータブルってことですね。
0703デフォルトの名無しさん
2005/12/30(金) 17:27:45メモリアロケーションの失敗は bad_alloc でいいんじゃないの?
0704700
2005/12/30(金) 17:31:120705デフォルトの名無しさん
2005/12/30(金) 19:47:26Generic なアルゴリズム書くのが激しく面倒になるが。
0706デフォルトの名無しさん
2005/12/30(金) 19:48:53テンプレートなら特殊化があるね
0707デフォルトの名無しさん
2005/12/30(金) 20:10:12それは >>680 の言うコピコンの使い方(値を変えられると困る場面で、const の代わりに引数を変更
されてもいいようにコピーを渡す)を受けての話。
0708デフォルトの名無しさん
2005/12/30(金) 21:47:48if( ClassA b = a )
b.func();
今気付いたんだけど、ifの条件式でこんなことできるんだね。
知らなかった。
0709デフォルトの名無しさん
2005/12/30(金) 21:52:180710デフォルトの名無しさん
2005/12/30(金) 21:54:34dynamic_cast用にしといた方が無難だと思う。
0711デフォルトの名無しさん
2005/12/30(金) 21:55:41気づかないかもしれないね
0712デフォルトの名無しさん
2005/12/30(金) 22:00:330713デフォルトの名無しさん
2005/12/30(金) 22:03:11たしか、while でもできるよ。
0714デフォルトの名無しさん
2005/12/30(金) 22:06:45条件式を持っているなら、どれでもできるような気が・・・
0715デフォルトの名無しさん
2005/12/30(金) 22:07:29は合法?
0716デフォルトの名無しさん
2005/12/30(金) 22:08:39do whileじゃ無理っす
まぁ、正直出来ても活用性0ですけどw
0717デフォルトの名無しさん
2005/12/30(金) 22:09:250718デフォルトの名無しさん
2005/12/30(金) 22:10:31さすがにC++じゃ無理だろうが
0719デフォルトの名無しさん
2005/12/30(金) 22:14:14a[b] は*(a+b)と同じ意味なので
1["STR"] = *(1 + "STR") = *("STR" + 1) = "STR"[1]
という事やね。
C++でも出来た気がする。
0720デフォルトの名無しさん
2005/12/30(金) 22:14:32のように、変数導入宣言が二回以上使うことができないのだろうか?
C#ではできるのかな?
0721デフォルトの名無しさん
2005/12/30(金) 22:22:340722デフォルトの名無しさん
2005/12/30(金) 22:24:340723デフォルトの名無しさん
2005/12/30(金) 22:25:51構造体にパックしたりすればいいんでない?
またはcharとか1byte変数配列を必要な数だけ宣言して、型キャストするとか
0724デフォルトの名無しさん
2005/12/30(金) 22:26:010725デフォルトの名無しさん
2005/12/30(金) 22:35:160726デフォルトの名無しさん
2005/12/30(金) 22:37:44FOREACH( v, int i){ printf("%d",i); }
みたいなことのできるマクロ書いてた頃(素直にboost使う気になれなかった頃)
for(int i=0, v::iterator it=v.begin;
と実装できなくて困った覚えがあるなぁ
0727デフォルトの名無しさん
2005/12/30(金) 22:38:040728デフォルトの名無しさん
2005/12/31(土) 05:11:09public:
Type &func1(){return data1;}
Type data1;
};
template <class Type> class B : public A<Type>{
public:
void func2(){
data2 = A<Type>::func1();
//data2 = func1();
}
Type data2;
};
gccで上記はコンパイルできますが、//でコメントアウトしている書き方では
エラーがでてしまいます。
この例ではなぜベースクラスまで指定しないといけないんでしょうか?
0729デフォルトの名無しさん
2005/12/31(土) 08:06:11テンプレートは、引数が与えられていない定義そのものと、引数を与えられた時点の
2回構文がチェックされる。
クラス・テンプレートのメンバは、あとで明示的特殊化によって御破算にされる可能性が
あるから、最初のチェックのときには名前検索の対象にならない。だから修飾されていない
"func1"はその定義が見つからず、エラーとなる。
ただし、その名前がテンプレート・パラメータに従属している基底クラスのメンバである
可能性が示されたら、2回目のときまでチェックを遅延することが許されている。
それで A<Type>::func1() はコンパイルを通る。
ちなみに
data2 = this->func1();
と書くことも可能。
ここいらへんは、テンプレートの機能の中でもややこしいところだから、詳しく解説した
本を読んだほうがいい。
C++ Templates とか
0730デフォルトの名無しさん
2005/12/31(土) 14:32:52>>詳しく解説した
>>本を読んだほうがいい。
>>C++ Templates とか
どの本をさしますか。
ルキーの解説書ですか。
ブーストの取説ですか。
教祖の本では不十分ですか。
0731デフォルトの名無しさん
2005/12/31(土) 14:36:57>>9
0732デフォルトの名無しさん
2005/12/31(土) 15:17:39C++で中国と戦えるでしょうか?
0733デフォルトの名無しさん
2005/12/31(土) 15:19:24おまいあきらかにC#スレからきただろ!!!
0734デフォルトの名無しさん
2005/12/31(土) 15:33:00>>730
>>9
ずばり言ってよ。
今の時間読めん
0735デフォルトの名無しさん
2005/12/31(土) 15:37:43C++ Templates: The Complete Guide
http://www.amazon.com/gp/product/0201734842/102-0872632-8435348?n=283155
でいいんじゃない?
0736デフォルトの名無しさん
2005/12/31(土) 15:43:050737デフォルトの名無しさん
2005/12/31(土) 16:07:040738デフォルトの名無しさん
2005/12/31(土) 16:08:51規約無視して、変体書式で書いてある事を貴方は
どの様にお考えですか。初めてテンプレ学ぶ人には
変換することが難題だと思いますが。ソースは↓
http://www.josuttis.com/tmplbook/
The only gripe I have against this book is a very very minor one:
the authors for some inexplicable reason decided to write
"T const* p" instead of "const T* p" in function prototypes.
Both are correct and both mean the same thing but nobody uses
the first convention whose major fault is
that it's too close to "T *const p" - a different thing entirely.
Plus the second convention is such an ingrained idiom that fighting
it is pure nonsense which makes the book initially hard to read.
Example: what does "char const* const& a" mean?
(p. 17) On top of that the reader cannot simply substitute one convention for the other,
as the 25,000 C++ books already in print are
still going to *be* there plus the x billion lines of legacy C++ code is
not leaving any decade soon! So one has to keep *both* conventions
in mind in order to read the text. It's really not much of a big deal
but I wonder: what were they thinking?
0739デフォルトの名無しさん
2005/12/31(土) 16:15:44コンベンションを覚えておかなければなりません。
本当に、大したことの多くではないのか。
私が不思議に思うのは、 彼らは何を考えてたのか
ボケ?
0740デフォルトの名無しさん
2005/12/31(土) 16:42:37何かの病気?
0741デフォルトの名無しさん
2005/12/31(土) 16:57:05main の argv の型だって、
const char * const char * const argv と書くやつもいれば
const を変なところに(意味が変わらない範囲で)くっつける奴もいる
0742デフォルトの名無しさん
2005/12/31(土) 17:17:59const char* と書く人に文字列リテラルの配列を定義させると、半分以上は
const char* table[] と書く。
char const* を使う人は
char const* const table[] と書く。
Windows や Linux など、すべて RAM 上で動かすプログラミングをしていると、
前者と後者の違いが重要だとは思わないだろう。
しかし ROM 環境で、さらに RAM の少ない環境でプログラミングしていると
これらの違いに神経を使う必要が出てくる。
故に、普段から ROM 環境でプログラムしてる人
または偏執的な const マニアは後者に落ち着く可能性が高い。
0743デフォルトの名無しさん
2005/12/31(土) 17:33:46マニアかどうかわかんないが、俺も
const できるところは全部 const にしないと気持ち悪いな。
結構潜在的なバグを発見できたりするし。
const つけまくったからと行ってどの程度最適化に
反映してくれるかはわかんないけど。
0744デフォルトの名無しさん
2005/12/31(土) 17:40:09ちなみに違いを教えてくれ。
0745デフォルトの名無しさん
2005/12/31(土) 17:47:31俺もどっちがどっちだか分からなくなった。
まぁ宰相ググレカスだな
0746728
2005/12/31(土) 17:54:14いままでVC++使いだったけど、>>728みたいなのは
ベースクラス指定無しで通ってたんで、なんかめんどくさい、、、。
ぐぐる先生に聞いたところ、他の複雑なテンプレートの例でも、「VC++ならOK」
というのがあるようですね。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html
LINUX環境で開発することになったので、そのへんのところ
元の言語仕様をよく確認しなきゃいけない。
0747742
2005/12/31(土) 17:57:36わかりやすい話だと table[0] = "modified" が、前者だと通り、後者だとエラーになる。
前者では table を書き換え可能な RAM に置く必要があり、後者ではその必要が無い。
起動時に全部 RAM にロードされる環境だと、それらの違いはほとんど無視できる。
( OS による最適化で const な table をプロセス間で共有してくれる可能性はある。)
ROM 環境では必要な分だけ RAM を使うことになるので、
table[] のサイズがそのまま RAM の消費量の差になる。
0748デフォルトの名無しさん
2005/12/31(土) 18:02:33前者と後者の違いが重要だとは思わないだろう
誰のことですか。発言者の出典箇所は?
Q2:普段から ROM 環境でプログラムしてる人
PICとか組み込み系の人のことですか。
Q3:世界中の人の前に広く出回る本であっても貴方は後者の
書き方で問題ないと寛容にお考えですか。
この本は、英語、中国語、アラビア語で翻訳されてます。
関東圏内で会話していると
標準語と関西弁の違いが重要だと思わないだろう。
しかし大阪でさらになんばで会話をしていると
これらの違いに神経を使う必要が出てくる。
私は、東京のど真ん中で偏執的な関西弁マニアが巻くし立てらたら
必ず違和感を持つ。そして、日本の公用語は関西弁に
は絶対にならないと考える。
0749デフォルトの名無しさん
2005/12/31(土) 18:02:53俺はconst char *派だけど、typedefする。
typedef const char *PCSTR; //大抵<windows.h>で済ます
const PCSTR *table[];
0750デフォルトの名無しさん
2005/12/31(土) 18:08:37てか、const char * って形の宣言ができることがそもそも間違いの始まりなんだよなぁ。
てな、話は↓こっちでやれ・・・
って、「const だけでメシが3杯喰えちゃうスレ」がいつのまにかなくなってる。(´;ω;`)
0751デフォルトの名無しさん
2005/12/31(土) 18:31:24あー、暫く前に落ちましたよ。
0752デフォルトの名無しさん
2005/12/31(土) 18:48:32というように、ノードのポインタのアドレスを引数にし、mainから参照したいのですが
うまくいきません。
Node* node;
if(MakeList(&node)){}
このように、条件判断に使いたいのですが・・・・
どうすればいいのですか?
0753デフォルトの名無しさん
2005/12/31(土) 18:49:27変な奴がいるみたいだが、もうしばらく相手してやる。
> Q1: (引用略)
> 誰のことですか。発言者の出典箇所は?
Windows や Linux をメインの環境としてプログラミングしてる人。
発言者とは誰のことですか。
> Q2:普段から ROM 環境でプログラムしてる人
> PICとか組み込み系の人のことですか。
そこらへんに多いと思う。あと携帯ゲーム機とか。
> Q3:世界中の人の前に広く出回る本であっても貴方は後者の
> 書き方で問題ないと寛容にお考えですか。
普段から後者に統一しているので、問題ないと考える。
C++ の書き方についての話なので、何語に翻訳されてようと変わらない。
> 関東圏内で会話していると(以下略)
大阪で暮らすために日本語を学ぶなら、標準語を学ぶだけでは不十分だろう。
逆に、東京だけで暮らすなら、関西弁を学ぶ必要は無い。
ROM 環境でプログラミングするために C++ を使うなら、以下略。
逆に、潤沢な RAM のある環境だけでプログラミングするなら、以下略。
0754デフォルトの名無しさん
2005/12/31(土) 18:54:37operator void* () を定義すればどうか。
0755デフォルトの名無しさん
2005/12/31(土) 18:56:01すいません、詳しく教えてください
0756デフォルトの名無しさん
2005/12/31(土) 19:02:42streamと同じ要領。変換演算子。"ストリーム c++ 変換演算子"でぐぐれば
いろいろ出てくる。
0757デフォルトの名無しさん
2005/12/31(土) 19:03:450758デフォルトの名無しさん
2005/12/31(土) 19:09:23MakeList() の戻り値が bool なのに、なんで変換演算子が要るの?
0759デフォルトの名無しさん
2005/12/31(土) 19:12:01呼び出しの時に & はいらんよ。
0760デフォルトの名無しさん
2005/12/31(土) 20:11:56どうもありがとうございます
0761デフォルトの名無しさん
2005/12/31(土) 21:05:47>>752 がわけわかなのって俺だけ?
0762デフォルトの名無しさん
2005/12/31(土) 21:11:25自分自身に似たような経験があれば、質問者の意図は理解できる。
0763デフォルトの名無しさん
2005/12/31(土) 21:23:04なんかポインタのど初歩で間違えて内科医?
実引数おかしいよね
0764デフォルトの名無しさん
2005/12/31(土) 22:09:06こうすれば理解できると思う。
typedef Node *NodePtr;
bool MakeList(NodePtr&);
0765761
2005/12/31(土) 23:14:04>というように、ノードのポインタのアドレスを引数にし、
ここまではわかる。
>mainから参照したいのですが
なにを? 引数? 関数? 戻り値? それ以外のなにか?
>うまくいきません。
なにが? 引数を渡すこと? 関数呼び出し? 戻り値の取得? それ以外のなにか?
>Node* node;
>if(MakeList(&node)){}
>このように、条件判断に使いたいのですが・・・・
勝手に使えばいいじゃん。
>どうすればいいのですか?
俺も、どうすればいいのですか?
0766デフォルトの名無しさん
2005/12/31(土) 23:28:520767デフォルトの名無しさん
2005/12/31(土) 23:52:27if(MakeList(&node)) { ではなくて
if(MakeList(node)) { にしろってこった。
上のじゃコンパイル通らないだろう
0768デフォルトの名無しさん
2006/01/01(日) 00:32:19確かに、解決もしたんだろうし、そこでコンパイルエラーになって、
& を取っ払えばコンパイルが通るって話はわかる。
が、質問の意味がさっぱりわからん。
0769デフォルトの名無しさん
2006/01/01(日) 01:45:47amazonの評価は結構微妙なんですけど禿本に書いてない細かい所とか書いてあるんですよね。
0770デフォルトの名無しさん
2006/01/01(日) 01:51:14索引がいい加減で、容も離散的に書いてあるから、マニュアル的に使うにも少々難ありって感じ。
俺の感想だけどね。
分からないトピックを絞って、その部分を集中して勉強するようなスタイルなら、それなりに使えるとは思う。
結局本棚の肥やしになってるけど。
0771デフォルトの名無しさん
2006/01/01(日) 09:22:40#「がわけわかなの」?
0772デフォルトの名無しさん
2006/01/01(日) 09:27:06ランダム読みに向いているのが C++ Effective
マニュアルは本当に処理系の取説と ISO/JIS の規格票
0773デフォルトの名無しさん
2006/01/01(日) 09:31:19何の本のことか解りません。
タイトルを正確に教えて
0774デフォルトの名無しさん
2006/01/01(日) 09:39:27「A級B型C++ (技術評論社かソフトバンク、忘れた、すでに絶版)」
0775デフォルトの名無しさん
2006/01/01(日) 09:44:16↑ISBN4-8101-8002-6
ISBN4-8101-8047-6
ISBN4-7561-1895-X
↓ISBN4-7973-2854-1
新禿
0776デフォルトの名無しさん
2006/01/01(日) 11:01:090777デフォルトの名無しさん
2006/01/01(日) 11:09:04ハゲこそC++だよ。
0778デフォルトの名無しさん
2006/01/01(日) 11:11:170779デフォルトの名無しさん
2006/01/01(日) 11:49:58>ハゲこそC++だよ。
この本は髪質がツルツルと光って、そのうえ薄すぎて
さらにイタリックで読みにくくない。?
光沢が反射して目がクラクラするのは、俺だけか。
だいだい、あすきー社って、異常に紙質が厚いか
裏面が透過するほど薄いか、ざらざらしているか
値段が他社に比べてトビ抜けて高い。
つぶれてよし、逝ってよし。
練習問題の回答本も別途購入しないといけない。
買う人はいますか。
0780デフォルトの名無しさん
2006/01/01(日) 11:53:13禿げてる奴って脳みそのしわも薄そうだよな。
頭悪そ
0781デフォルトの名無しさん
2006/01/01(日) 11:58:15誰かが出してきた答案を見てそれをやめてしまう他力本願は「ユーザが育てた言語」にそぐわない
値段にしても自己投資として買う人には問題にならない金額だね
0782デフォルトの名無しさん
2006/01/01(日) 14:42:27class 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のようなものだとお考えください。
作製しているアプリは事務的な物です、決してゲームのような一刻の早さを求める物ではありません。
みなさんならどちらでしょうか?
0783デフォルトの名無しさん
2006/01/01(日) 15:02:39そのクラスの設計目的を抜きにしてそんなことを議論できるとでも思ってるのが間違い。
0784デフォルトの名無しさん
2006/01/01(日) 15:04:18実装からインターフェースを考えてるのが間違い。
先にインターフェースを考えろ。
■ このスレッドは過去ログ倉庫に格納されています