C++相談室 part45
■ このスレッドは過去ログ倉庫に格納されています
0001(*^ー゚)b グッジョブ!!
2005/11/26(土) 21:20:04ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1128512737/
0153デフォルトの名無しさん
2005/12/01(木) 23:22:07仕様では、charT*を引数とするoperator=は
*this = basic_string<charT, traits, Allocator>(pointer_to_string);
を行うことになっている。
つまり、一時オブジェクトが作られ、それがthisに代入されることが保証されている。
0154デフォルトの名無しさん
2005/12/01(木) 23:34:18安心して良いって事だね。
0155デフォルトの名無しさん
2005/12/01(木) 23:35:280156デフォルトの名無しさん
2005/12/01(木) 23:38:18効率最悪
0157デフォルトの名無しさん
2005/12/02(金) 00:01:13文字列が丸ごとコピーされるとは限らないよ
リファレンスカウントによる実装もある
0158デフォルトの名無しさん
2005/12/02(金) 00:02:25部分文字列まで考慮したRefCountの実装って相当面倒な気がするんだけど、
実際のSTLの実装で使われてたりするんかな?
0159デフォルトの名無しさん
2005/12/02(金) 00:12:358Rはいくらなんでも王者をバカにしすぎやわ
7R
6-2 30000
12R
1-3 10000
1-5 20000
0160159
2005/12/02(金) 00:20:14誤爆や
0161デフォルトの名無しさん
2005/12/02(金) 12:00:08efficient c++に書いてあるけれど、すべてをinline展開するとコードサイズが増えすぎるので注意
コードサイズが増えると、キャッシュミスが多発して効率が下がることも。
使用コンパイラが、組込型変数の場合だけRVOする場合
=のついてない算術演算子(operator+()とか)はexpression templateが必要かも
ただし、expression templateは、「演算子の種類とlhs, rhsへのポインタ」などをメンバに持つ
一時オブジェクトを生成するコストがかかる。
線形代数ライブラリみたいに巨大なオブジェクトの一時オブジェクト生成を阻止したいときならいざしらず
class hoge_t {
int x, y;
};
みたいに小さなクラスのときは、逆効果だと思う。
どうしてもスピードがほしい部分なら、
hoge0 = hoge1; hoge0 *= hoge2; hoge0 *= 0.5;と展開するのがいいんじゃないかな。
コンパイラによっては:
int i = 10;
return i;
はRVOせず
return int(10);
はRVOするようなパターンもあるらしい。operator*()の定義を、最適化されやすいよう変えてみては。
0162105
2005/12/02(金) 20:38:47コンパイル時に右辺の変数の値が確定している場合 expression template
を使えば、よく出来たコンパイラならコンパイル時に左辺値を計算するため
最高の実行速度と最小のコードサイズを得ることが出来る。
というのが >>107 の紹介したページの主張(の一部)だと。
0163デフォルトの名無しさん
2005/12/03(土) 00:38:07C++ でストレートに書いて問題になったことなどないのだが
0164デフォルトの名無しさん
2005/12/03(土) 07:21:27>This is a very elaborate, complex solution which is difficult to extend and
>maintain. It is probably not worth your effort to take this approach.
とあるように,効率のためにETが必要なほどのケースは滅多に存在しない.
0165110
2005/12/03(土) 07:46:15長い関数の最初で、ある型の自動変数に同じ型の参照を代入していたせいでした。
コンパイルエラーにならないけど壊れるんですね。
0166デフォルトの名無しさん
2005/12/03(土) 10:13:29いいサイト紹介してくれてありがとう。
ただその引用の箇所は例えば boost::lambda あたりを揶揄してるっぽいので
可読性と一時オブジェクト生成コストのトレードオフについての論評じゃないと思う。
0167デフォルトの名無しさん
2005/12/03(土) 11:11:08WinProc 内(WM_KEYDOWN / WM_SYSKEYDOWN)にて
検出しようというのは間違っているのでしょうか。
0168デフォルトの名無しさん
2005/12/03(土) 11:25:32このスレで聞くのも間違ってる
0169デフォルトの名無しさん
2005/12/03(土) 12:06:370170デフォルトの名無しさん
2005/12/03(土) 12:44:18class A
{
private:
A();
public:
static A* Create()
{ return new A; }
};
これはどういうことでしょうか?
static関数って通常は非staticメンバ関数を呼び出せないですよね
0171デフォルトの名無しさん
2005/12/03(土) 13:07:42どこで非staticなメンバ関数を呼び出してるの?
0172デフォルトの名無しさん
2005/12/03(土) 13:13:520173デフォルトの名無しさん
2005/12/03(土) 13:19:430174デフォルトの名無しさん
2005/12/03(土) 13:34:220175デフォルトの名無しさん
2005/12/03(土) 14:44:51インスタンス化したときになんでコンパイルエラー出ないのか?
ってことを言いたいんだと思うのだが、それの答えは。
staticメンバ関数は friend みたく非公開メンバにアクセスできるから。
0176デフォルトの名無しさん
2005/12/03(土) 14:53:09その文面を「暗黙の this-> を省略できない」と読みかえればいいだにょん。
0177170
2005/12/03(土) 15:03:40なるほど。
理解できました。ありがとうございました。
0178デフォルトの名無しさん
2005/12/03(土) 16:34:52質問:
http://pc8.2ch.net/test/read.cgi/prog/1129609762/440
よろしくおながいします。
学生ではなく現在はH/W設計もかけもちしています。
長年プログラムを組んで食ってきましたが、オブジェクト指向の言語は未経験です。
0179デフォルトの名無しさん
2005/12/03(土) 16:44:18推薦図書スレ行ったら・・・と言おうとしたけど荒れてるね。
演習的なのをやりたいのならExceptional C++かな?
ただWisdomSoftのを読んだだけだと厳しいかもしれない。
#マ板の割にはいいレス付いてるなw
#俺がひどいスレしか見てないだけかもしれんが。
0180デフォルトの名無しさん
2005/12/03(土) 17:41:19失礼しました。
0181デフォルトの名無しさん
2005/12/03(土) 17:43:44K&Rは感動の良書で、そんな演習の入ったC++本を探していますが、
気に入ったもの見つからないのです。
K&Rは1章の問題(1日で踏破できた)をやるだけで、ひととおり
C言語プログラムが書けるように工夫して書かれてました。
コンストラクタ、ディストラクタの概念などは、C言語にはなかったじゃない
ですか。なのでC++仕様の大きさには感心しています。
ただ正直のところは、クラスの定義について、どのような考え方で
システム構成を構築するか、あるいはシステムをどのように分割して
クラスに分解する?・・・みたいな考え方も知りたいところです。
あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
その根本的思想を知りたい、と思います。
なお、
マ板は、読むと精神的に良くないのですが、酷い会社環境で
苦労している人(自分もそう)の話から、自分の知らない
世の中の現実から、学べ取れるものがあります。
0182デフォルトの名無しさん
2005/12/03(土) 17:48:39大雑把に言えば、C++の基礎文法はこんなとこ。後ろに行くほど分野によって不要だったりもする。
上記でまだ分からないものがあれば、ウェブなり、入門書なりでまずは補完すること。
このレベルなら独習シリーズでいいんじゃね?
で、C++の機能の多くはオブジェクト志向の実装のためにあるわけだからオブジェクト指向もかじっ
ておかないと、意味わからないことも多いと思われる。
ただし、組み込みみたいに特殊な分野だと、また文化が違ったりするから、目的がはっきりしている
なら、その点ハッキリさせて質問したほうがいいと思われ。
0183デフォルトの名無しさん
2005/12/03(土) 17:55:22>システム構成を構築するか、あるいはシステムをどのように分割して
>クラスに分解する?・・・みたいな考え方も知りたいところです。
>あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
>その根本的思想を知りたい、と思います。
それはもう言語の話じゃないな。
0184デフォルトの名無しさん
2005/12/03(土) 18:08:080185デフォルトの名無しさん
2005/12/03(土) 18:19:48デストラクタ処理で終了待ちのループさせるとかしか思いつかんけど。
0186デフォルトの名無しさん
2005/12/03(土) 20:32:08環境依存の話はスレ違いなのです。。。
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
こちらへどうぞ
0187デフォルトの名無しさん
2005/12/03(土) 21:02:38言語仕様や文法がどうこうというのを気にするんじゃなくて
オブジェクト指向とはどういうものか、というのを一度
言語という枠を超えて(SmalltalkとかRubyとか)勉強して、
理解してからC++に戻ってきても遅くないと思うよ。
0188デフォルトの名無しさん
2005/12/04(日) 01:39:42{
public:
int i;
A( int _i ):i( _i ){};
A(){ A(1); }
};
A a;
printf("%d\n", a.i );
で分けわからない数値が出力されます。
コンストラクタ内で別のコンストラクタを呼び出すのはダメなんでしょうか?
0189デフォルトの名無しさん
2005/12/04(日) 01:40:420190デフォルトの名無しさん
2005/12/04(日) 03:33:48呼び出しても一時オブジェクトが生成されるだけだよ。
デフォルト引数使って逃げるか、init() みたいな関数に共通処理をくくり出すか(初期化じゃなくなっちゃうけど)かな。
0191デフォルトの名無しさん
2005/12/04(日) 06:24:58{
public:
int i;
A( int _i = 1 ):i( _i ){};
};
class A
{
public:
int i;
A( int _i ) { init(_i); };
A(){ init(1); }
void init( int _i ) { i = _i; };
};
0192デフォルトの名無しさん
2005/12/04(日) 09:57:430193デフォルトの名無しさん
2005/12/04(日) 10:12:550194188
2005/12/04(日) 11:45:37解りました。ありがとうございました。
0195デフォルトの名無しさん
2005/12/04(日) 12:14:25どこだか忘れたけど、C++入門なんて偉そうに書いてるWebSiteでその手の間違いを堂々と書いてたな。
ご丁寧に勘違いに基づいた結果に合うようなサンプルまで用意して。
もしあんたがそのサイトで勉強しているならとっととそのページをブックマーク、キャッシュごと捨ててしまえ。
0196デフォルトの名無しさん
2005/12/04(日) 14:39:380197デフォルトの名無しさん
2005/12/04(日) 14:46:06(というより、自分は結構詳しいと勘違いしているから)
0198デフォルトの名無しさん
2005/12/04(日) 14:57:14http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/
>>178はこれら読むしかないんじゃないの?
それかオブジェクト指向の本
0199デフォルトの名無しさん
2005/12/04(日) 15:06:55独習C++で勉強した後、VC++(MFC)の勉強をしていたら、
次のような文を何気なく使われているのを発見しました。
class TestView: public CView
{
/*各種オブジェクトの宣言*/
private:Crect m_rectEllipse;
}
CMyView :: CMyView : m_rectEllipse(0,0,200,200) //←ココ
{
/* CMyViewのコンストラクタ
.
.
.
*/
}
"ココ"の文っていろいろ調べたんですが、載ってなくて。
こういう初期化の書き方ってありなんでしょうか。
それとも何か別の意味があるんでしょうか。
0200デフォルトの名無しさん
2005/12/04(日) 15:09:42初期化リストでぐぐってみ。
基底クラスのコンストラクタを呼び出す意味と、メンバを初期化する意味がある。
0201199
2005/12/04(日) 16:01:30デフォルトコンストラクタを持たないクラスのオブジェクト、
const 宣言されたメンバ、リファレンスメンバ
はメンバ初期設定リストによって初期化されなければならない。
0202デフォルトの名無しさん
2005/12/04(日) 16:36:08そんな限定的に使うんじゃなくて、なるべく全部
初期化リストで初期化するようにしような。
0203デフォルトの名無しさん
2005/12/04(日) 18:17:300204デフォルトの名無しさん
2005/12/04(日) 18:27:350205デフォルトの名無しさん
2005/12/04(日) 21:22:37そもそもPODじゃないデータを初期化でコピーした記憶が無かった
0206デフォルトの名無しさん
2005/12/04(日) 21:54:35int KANSUU(hoge *a){}
という関数があった場合hogeを継承したhogehogeクラスを引数にとることはできるんでしょうか?
0207デフォルトの名無しさん
2005/12/04(日) 21:55:430208デフォルトの名無しさん
2005/12/04(日) 23:50:50継承を理解していればそんな質問を投げないぞ。
0209デフォルトの名無しさん
2005/12/05(月) 00:09:48つ http://www.pearsoned.co.jp/washo/prog/wa_pro51-j.html
これは誰も紹介しないのか……初心者にちょうどいいとおもうけど。
0210デフォルトの名無しさん
2005/12/05(月) 00:12:21Thinking in Javaが名著なだけに、是非読んでみたいと思ってるんだけど
邦訳が出てないようだし・・・
原著買うしかないかなぁ
0211デフォルトの名無しさん
2005/12/05(月) 00:32:27クラス情報がどのようにメモリに配置されるかなどを図で説明した本はないでしょうか?
0212デフォルトの名無しさん
2005/12/05(月) 00:45:10EffectiveC++にもvptr周りは図付きで説明されてた気がするが
もうちょっと詳しく知りたいならARMかD&Eじゃね?
0213デフォルトの名無しさん
2005/12/05(月) 02:04:32ARMはともかくD&Eなら近くの本屋さんにあると思うので調べてみます。
ありがとうございました
0214デフォルトの名無しさん
2005/12/05(月) 02:06:330215デフォルトの名無しさん
2005/12/05(月) 02:14:57ARM http://www.amazon.co.jp/exec/obidos/ASIN/4901280392/
D&E http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/
0216デフォルトの名無しさん
2005/12/05(月) 02:16:02D&E : The Design And Evolution of C++ : C++の設計と進化
0217デフォルトの名無しさん
2005/12/05(月) 04:00:21>ARM : The Annotated C++ Reference Manual : プログラミング言語C++
邦訳タイトルが違う >>215 が正しい
0218デフォルトの名無しさん
2005/12/05(月) 05:26:34"vtable c++"でぐぐってみるとか。手っ取り早く知るにはまずこれ。
0219デフォルトの名無しさん
2005/12/05(月) 05:28:560220デフォルトの名無しさん
2005/12/05(月) 07:13:51typedef {
int (*func)(int param);
}funcList[]={
func1,func2,func3・・・
};
int callFunc(int funcNum,int param)
{
return funcList[funcNum].func(param);
}
のような実装をC++のクラスでできますか?
関数ポインタによるリスト化したいのは protected なメソッドです。
そのクラスは継承されるのが前提でひとつのプログラム内部で複数のインスタンスが生成されるのでクラスの外に定義するのはしたくありません。
switch文で分岐もメソッド数が200以上になりそうなので実用的でないし。
0221デフォルトの名無しさん
2005/12/05(月) 07:37:47ttp://www.emit.jp/prog/prog_cpp0.html
0222デフォルトの名無しさん
2005/12/05(月) 08:02:08地震の前兆です
0223デフォルトの名無しさん
2005/12/05(月) 11:47:41class base_1 {
public:
base_1() : data_( 123 ) {}
int get() { return data_; }
int data_;
};
class base : public base_1 {
public:
typedef base_1 base_1_type;
public:
int GET() { return base::base_1_type::get(); }
};
class other { public: int dummy_; };
class derived : public other, public base {
public:
int func1() { return base::base_1::get(); }
int func2() { return base::GET(); }
int func3() { return base::base_1_type::get(); }
};
int main( int argc, char * argv[] )
{
derived D;
printf( "%d\n", D.func1() );
printf( "%d\n", D.func2() );
printf( "%d\n", D.func3() );// おかしい!
}
0224デフォルトの名無しさん
2005/12/05(月) 11:55:22cygwin g++ 3.4.4 で動かしたら 123 が3個表示された。
ただし、先頭に #include <cstdio> を足した。
なんかマイナーなコンパイラ使ってる?
0225223
2005/12/05(月) 11:58:05どうもbase_1のthisポインタがsizeof(other)だけずれるんです。
0226デフォルトの名無しさん
2005/12/05(月) 13:26:120227デフォルトの名無しさん
2005/12/05(月) 13:38:10public:
0228223
2005/12/05(月) 14:12:51自分の環境だけでなかったので、コンパイラの癖みたいなものでしょうか?
いろいろおかしいところはあって、
・func3()で base::get() とか base_1_type::get() だと問題は発生しない。
・たとえばotherとかにメンバ関数get()を持たせると問題は発生しない。
・base内でのtypedefをprivateにしてもコンパイルビルドはできてしまう。
・派生させるクラスの順序によって症状が変わる
もともと、base_1はtemplateだったんですが、単純化するとこうなりました。
template名が長かったのでtypedefしたんですが…
0229デフォルトの名無しさん
2005/12/05(月) 15:10:07http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?stype=1&fields=1&category=11
このページの下のほうにバグレポートなるリンクがある。
0231181
2005/12/05(月) 20:53:07情報はすべてメモしました。
今日はとりあえず、先日見つけたWEBの演習を始めました。
今日はコンストラクタ関数と、そのオーバーロードによる
初期化の具体的やり方がわかりますた。
実際に演習で組むと、頭が良くなったような錯覚に陥りますw
紹介いただいた本は、本屋さんで眺めてから、自分に合うか
見極めようと思います。
0232デフォルトの名無しさん
2005/12/05(月) 21:37:400233デフォルトの名無しさん
2005/12/05(月) 23:12:12fstreamでファイルから読み込みをする際に
区切り文字を設定する事はできないのでしょうか?
csvのファイルを読み込むときはどうしたら良いのかわからなくて…。
スペース区切りがデフォルトですよね?
0234デフォルトの名無しさん
2005/12/05(月) 23:18:34たとえばboost::tokenizer
0235デフォルトの名無しさん
2005/12/06(火) 00:40:220236デフォルトの名無しさん
2005/12/06(火) 01:42:04getlineでできそうでした。
ありがとうございました。
0237181
2005/12/06(火) 23:44:29http://wisdom.sakura.ne.jp/programming/cpp/
ここを全部、読解しました。
昨日から、下の演習をやっています。最初のほうは飛ばして、クラスから
はいっています。
http://www.sist.ac.jp/~suganuma/learn/enshu.htm
・・・ここも探しあてにけっこう時間かけて苦労して見つけました。
0238デフォルトの名無しさん
2005/12/07(水) 00:01:37OOなんて出番なさそうな演習だな。
0239232
2005/12/07(水) 01:11:33>>237
http://wisdom.sakura.ne.jp/programming/cpp/ を読んでみた。
今まで見たC++入門サイトの中では最高の部類だとおもた。よく見つけてきたなぁ。
http://www.sist.ac.jp/~suganuma/learn/enshu.htm も読んでみた。
ちょっとあれだけど・・・。実際C++で良質の演習問題を提供するって難しい。
0240デフォルトの名無しさん
2005/12/07(水) 01:13:05それのCの方を見たことあるが、
一部用語が統一されてなかったりして、
書いてる本人もわかってるのかいなってところがあったが・・・。
0241デフォルトの名無しさん
2005/12/07(水) 01:16:10Rogue Wave
0242デフォルトの名無しさん
2005/12/07(水) 01:19:19>実際C++で良質の演習問題を提供するって難しい。
禿本の演習問題があるじゃん
0243デフォルトの名無しさん
2005/12/07(水) 01:26:260244239
2005/12/07(水) 01:30:28ごまかしはあるけどあからさまな嘘は書いていないので好印象。
レイアウトに気を配って重要なところに自然に目がいくように
配慮されているとこがすごく良いと思った(印刷物だとお金が掛かるのでやりたくても出来ない)。
0245デフォルトの名無しさん
2005/12/07(水) 01:33:120246239
2005/12/07(水) 01:42:02Rogue Wave が tools++ を提供しているところで
エピステーメーが推奨しているってとこまでは知ってるけど・・・
Rogue Wave が日本語の演習問題を出しているのか?
Rogue Wave 有名すぎて調べにくいぞ。
0248デフォルトの名無しさん
2005/12/07(水) 02:37:35問1
自動販売機を分析して、C++で制御プログラムを作成せよ。
問2
エレベータシステムを分析して、C++で制御プログラムを実装せよ。
各 6時間
0249デフォルトの名無しさん
2005/12/07(水) 02:41:46w
0250デフォルトの名無しさん
2005/12/07(水) 04:37:400251デフォルトの名無しさん
2005/12/07(水) 07:49:230252デフォルトの名無しさん
2005/12/07(水) 07:57:14>ただし、綺麗で保守的なプログラムを書きたいのであれば
>適当な位置で変数を宣言するのではなく、ブロックの先頭でまとめて宣言するべきです
こんなこと書いてるよ。
■ このスレッドは過去ログ倉庫に格納されています