08/10/03 17:35:24
>>649
hoge2はconstだと困るんです
653:デフォルトの名無しさん
08/10/03 17:38:02
char hoge2[5]
でstrcpy
654:デフォルトの名無しさん
08/10/03 17:42:35
>>652
なんで困るのか言ってみようか
655:デフォルトの名無しさん
08/10/03 17:42:48
C++ならSTLのstd::string使うとか
656:デフォルトの名無しさん
08/10/03 17:43:37
>>650
それだといけました
>>653
それもありなんですね
>>654
いろいろ書き換えたいんです
657:デフォルトの名無しさん
08/10/03 17:50:41
文字列定数を書き換えてはいけない
必ずstrcpyでコピーしる
658:デフォルトの名無しさん
08/10/03 17:53:18
そもそもなんとなく この宣言を使ってるんですが
char *hoge[5]={"test","test2","test3","test4","test5"};
イメージ的にはどんな感じですか
hoge[0] 文字列testへのポインタ
hoge[1] 文字列test2へのポインタって感じですか?
659:デフォルトの名無しさん
08/10/03 18:24:19
そんな感じ
660:デフォルトの名無しさん
08/10/03 19:13:21
a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、
B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++)
a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
661:デフォルトの名無しさん
08/10/03 19:15:04
>>660
class B の定義より前に class A の宣言だけしてみるとか
class A;
662:661
08/10/03 19:16:28
ごめん >>661 は無しで
663:デフォルトの名無しさん
08/10/03 19:26:27
質問です。
他クラスのメンバ変数にアクセスするにあたって
privateなメンバにgetterを使ってアクセスするのと
publicなメンバを直接参照するのではどちらが速いですか?
CHoge hoge;
int a = hoge.m_publicHoge;
int b = hoge.getHoge();
// CHogeの実装
// const int& getHoge(){ return m_hoge; };
// public: :
// int m_publicHoge;
// private :
// int m_hoge;
664:デフォルトの名無しさん
08/10/03 19:30:51
一応
速度は直接アクセス
安全性はゲッター
だろう一般的に
最適化で速度差無い事もあるけど
普通はゲッター使いなさいと教わるはず
665:デフォルトの名無しさん
08/10/03 19:30:52
>>660
それだけだとうまくいくはずなのでもうエスパーさんしか
アドバイスできないんじゃないかと
エラーの出る最小のコードをどうぞ
666:デフォルトの名無しさん
08/10/03 19:32:06
VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。
私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
667:デフォルトの名無しさん
08/10/03 19:35:11
ほかのプログラムが満遍なくCPUを使っていただけだろ。
668:デフォルトの名無しさん
08/10/03 19:42:44
>>660
インクルードガードでぐぐれ
669:デフォルトの名無しさん
08/10/03 19:52:56
>>665
こんな感じです。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
670:デフォルトの名無しさん
08/10/03 19:54:33
>>669
#include "ca.cpp"
#include "cb.cpp"
これは。。
ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
671:デフォルトの名無しさん
08/10/03 19:55:40
ボーランドのリンカ使い方知らないけど、
それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
672:デフォルトの名無しさん
08/10/03 19:57:11
>>671
makefileみたらそうなってるから >>670 だけでいいんじゃないかな
673:デフォルトの名無しさん
08/10/03 20:22:08
>>670
つまり、main.cppでa.hとb.hをインクルードして、
a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
674:663
08/10/03 20:37:11
>>664
サンクスです。
やはり直接アクセスの方が速いですか。。。
参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。
getter使うにしてもローカルで複数回使う場合
func1( hoge.getHoge(; );
func2( hoge.getHoge() );
func3( hoge.getHoge() );
とするより
int& b = hoge.getHoge();
func1(b);
func2(b);
func3(b);
のようにした方がオーバーヘッドは減りますよね?
675:デフォルトの名無しさん
08/10/03 20:42:29
メンバ関数はインライン関数にできてだな
676:デフォルトの名無しさん
08/10/03 20:43:35
最適化を前提にするなら余計なことはしないほうがよいだろう。
get/setは*.hにインラインで記述するのが基本。
気になるならアセンブリリストを出力したり、実際に測定するといいよ。
677:デフォルトの名無しさん
08/10/03 21:05:57
>>674
intなら参照使わない方が早いんじゃね?
どういう用途か知らないけど
なんにせよ実測するのが一番だな
678:デフォルトの名無しさん
08/10/03 21:23:04
>>674
値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、
一通り操作が終わったら、メンバに書き戻す方が良いかも。
メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定
される点もメリット。
679:673
08/10/03 21:50:44
解決しました。
どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で
形式上でもインクルードしておけ、って事ですね(多分)。
アドバイスくれた方々、ありがとうございました。
680:デフォルトの名無しさん
08/10/03 22:33:10
>>679
> a.cppとb.cppではインクルードガードをかける
ヘッダ内でガードする。
多重インクルードされた結果、重複定義が発生する。
> ヘッダはインクルードガード付け
となっているから理解したのかもしれないけれど。
すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の
ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。
リファクタリングって言葉も調べてみてください。
681:デフォルトの名無しさん
08/10/03 23:09:43
よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
682:デフォルトの名無しさん
08/10/03 23:31:17
エスパーに失敗した。もうちょっと情報頼む。
683:デフォルトの名無しさん
08/10/04 01:04:14
>>681
気分
684:デフォルトの名無しさん
08/10/04 01:22:24
>>681
そういう作りはWin16時代の遺物なので今となっては意味がない
Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を
InitApplication()に記述して、
WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。