C++相談室 part15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGelegantなソースを目指してね。 関連URL>>2-10
v(^・^)v
0153デフォルトの名無しさん
NGNGそうだよ、作れよ、そのぐらい。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG逆切れは勘弁してくれ。
MFC使ってアプリ組むならっつーからCString使えっつってるだけじゃんよ。
そのライブラリが一番近い環境に合わせればいいじゃん。
画像を読み込む時にWin32APIを使うならLPCTSTRを使えば良いし、
CBitmapを使うんならCStringを使えば良いし、
STLを使うんならstd::stringを使えば良いし、
全部自前でやるんならchar const*を使えば良いだけの話だろ。
0156デフォルトの名無しさん
NGNG> そんな事言ったってなるべく標準のものが使いたいじゃないですか気分的に。
そもそも MFC 使ってる時点で「標準」に拘る意味はない。本気でマルチプラットホーム
対応にするなら Mozilla のように MFC 捨て捨てで、もっと下のレイヤーから作り込ま
ないと。
0157デフォルトの名無しさん
NGNG下の階層から作ると依存性が高くなると思うが。
0158デフォルトの名無しさん
NGNGそれは一番よくないと思います!STLの本の冒頭に「貴方は既に他人が作ったコードを自分で作り直して云々、車輪の再発明云々」
ってかいてありましたよ
>>154
イヤッハハ、まあそうおっしゃらずに・・・
でも画像読み込み関数なんて絶対MFCと分離したいと思いませんか
>>155
>MFC使ってアプリ組むならっつーからCString使えっつってるだけじゃんよ。
たしかにそんな気もします。MFC使ってるんだからMFCの流儀にあわせてコーディングする。
これはコレで正しいと思います。MFCがCString用意してるのに無理してstd::stringを
使うというのもヘンかもしれないですね
>>156
それはどうなんでしょうか。。。確かに幸せな世界が来るかも知れません。。
でも凄いマイワールド展開しまくりな上に、凄い手間がかかりそうです。そこまではできないので、
出来る範囲で汎用的なコードを書きたいのです
0159デフォルトの名無しさん
NGNG0160デフォルトの名無しさん
NGNGchar *を渡すのを躊躇ってしまう。同様にしてstd::stringも。
で結局、TCHARかCString・・・
0161デフォルトの名無しさん
NGNG#ifdef _UNICODE で std::string, std::wstring 切り替えれば? 俺は WTL::CString
使うけど。
0162デフォルトの名無しさん
NGNGそしてVC++付属のSTLのバグに悩まされたり、STLPortのコンパイルオプションの違いに翻弄されたりするんだ。
それでも何も考えずに++itrで次の文字に移れるのはめちゃくちゃ幸せだ・・・
0163デフォルトの名無しさん
NGNGpublic:
CFileData(char *filePath);
virtual ~CFileData();
protected:
BYTE *m_pBuff;
:
:
こういうクラスを作っています。コンストラクタでデータファイルを開き、
m_pBuffに格納する仕組みです。
そこで質問なのですが、コンストラクタでデータの読み込みに失敗した場合、
失敗したかどうかはどうやって判定すればいいのでしょうか?
後で、bool IsSuccess()みたいな関数を呼んでやら無いといけないでしょうか?
それとも、コンストラクタでデータを読むという仕様自体が間違っているでしょうか?
アドバイスください。
0164デフォルトの名無しさん
NGNGお前は贅沢だ、贅沢は許さん
0165デフォルトの名無しさん
NGNG例外を飛ばしたり operator bool を定義する
0166デフォルトの名無しさん
NGNG素直に
class CFileData{
public:
CFileData();
virtual ~CFileData();
bool Read(char *filePath);
とでもしておけば?
0168デフォルトの名無しさん
NGNGなにかスマートでいい方法ないですかね
stringにいれてsubstr()でとっていくとか
istreamのget()かgetline()でdelimiterを’,’にして
よんでいくとか方法はいろいろあるんですけど
なかなかうまい方法みつからなくて
0169デフォルトの名無しさん
NGNGやはりWinsockを使用するのでしょうか?
0170デフォルトの名無しさん
NGNGWindows 系のスレに逝って。
0172デフォルトの名無しさん
NGNG{ enum { E = 1 }; }
struct X
{ enum { E = 2 }; };
int f(){ return X::E; }
「あいまいです」とか言われそうなもんなんですが、
エラーも警告もなんにもでないんです。
同じ名前の名前空間とクラスが :: で指定されたとき、
どのように振舞うような仕様なのでしょうか?
ちなみに、gcc3.2 では、 f()==2 になります。
0173デフォルトの名無しさん
NGNGBCC 5.5.1 では
エラー E2238 TestCon.cpp 6: 'X' の宣言が複数見つかった
0175デフォルトの名無しさん
NGNGキーワード struct が省略可能ってことは、やっぱり普通のグローバルになる
のかな。
だとすれば gcc は間違ってると思うけど・・・規格博士降臨キボンヌ。
0176デフォルトの名無しさん
NGNGa namespace name or a class template name must be unique int its declarative region.
3.3.7
A class name or enumeration name can be hidden by the name of an object, function, or enumerator declared in the scape.
7.3.2 -4
A namespace-name 〜 not 〜 same declaretive region.
つまり、クラス名と列挙名はオブジェクトや関数に隠されるけど、ネームスペース名と
テンプレートクラス名は、宣言空間でユニークじゃなくちゃいけないってか。
gccの負け?
0177176
NGNGclass A{}A,B; //OK.
class C{};
C C; //OK.
C D; //Error.
0178デフォルトの名無しさん
NGNGmainが終了すると勝手に解放されますか?
0179デフォルトの名無しさん
NGNG勝手には解放されません。deleteすれ。
new[]で確保したものはdelete[]で。
それがいやなら、スマートポインタでも使ってくれ。
0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNGまともなOSだったら解放される。しかし、delete しないということは
デストラクタも呼ばないわけ? それだとまずいことが多々おきそう。
>>180
これくらいなら環境依存というほどでもないっしょ。
0182デフォルトの名無しさん
NGNG呼ばれた後は、何が起こるか未定義だな。
0183デフォルトの名無しさん
NGNGC++でJavaみたいにWebアプリケーションの開発って出来ます?
仮にできるとしたら、Javaに勝っていますか?
本当にどうしようもない質問でごめん。。。
0184デフォルトの名無しさん
NGNGしょうもないので却下。
0185デフォルトの名無しさん
NGNG「Javaみたいに」とはどんな特徴のことだ?
C++でできるか否かはそれに因る
0186デフォルトの名無しさん
NGNGCGIをWebアプリと呼べるのならできる。
もしくは、JavaをC++で作ってやるとか
JavaのコードをC++で生成するとか(以下略)。
>勝っていますか?
しょうもないので却下。
0187デフォルトの名無しさん
NGNGttp://www.s34.co.jp/cpptechdoc/article/xml/csv2xml/index.html
0188デフォルトの名無しさん
NGNGclass CData;
class CDocument {
CData *m_data;
・・・
こういう風にしてCDocumentのコンストラクタでm_data = new CData;やってます。
でもこれだとdelete忘れたり色々鬱陶しいので、できることなら
#include "CData.h"
class CDocument {
CData m_data;
・・・
こんな風にしたいと思っています。何かいい手はないでしょうか。
0189デフォルトの名無しさん
NGNGそんなあなたにauto_ptr
0190デフォルトの名無しさん
NGNGポインタになってるのがそもそも嫌なんです。deleteできちゃうっていう状況が嫌です。
でも依存関係は減らしたいのです。
例えば標準のstringが気に入らなくて、自分で作ったCMyStringがあるとします。
もうこれはアプリの中にあっちこっちで使われてる上に、今後UNICODEをエンコードしたり、
色々な機能を追加させる予定だとします。
こういう場合どうしたらいいですか。
0191デフォルトの名無しさん
NGNGそんなあなたにconst auto_ptr
0192デフォルトの名無しさん
NGNG0193デフォルトの名無しさん
NGNGなにを聞きたいかがまったく分からん。
CMyString(char *str) {
this->str = charToUnicode(str);
}
って書いてchar型で渡されたらUnicodeに変換して、内部でUnicodeで管理すればいーじゃん。
外部からはどっちで渡されてもOKにしといて。
0194デフォルトの名無しさん
NGNGCharsetの変換とかもできるようになってるんだけどな、C++は。
0196デフォルトの名無しさん
NGNG>>189 >>191
boost::scoped_ptr でも良いぞ。
0197デフォルトの名無しさん
NGNGしかしコンストラクタでnewしたくないめんどくさがり屋にはお勧めできない。
さらに依存関係をほとんど無くすのにJavaが有名だ、
しかしこちらは全てのオブジェクトをnewする必要があるのでますますお勧めできない。
依存関係とめんどくささはトレードオフの関係にあるようだ。
0198デフォルトの名無しさん
NGNGていうか、そういうのって一般的なんですか。あんまりそういうのやってるって聞いたこと無いんですが。
メンバのオブジェクトというオブジェクトを全部scoped_ptrとかで持ったりしたら、
人に見せたときに「うわーなんだこのプログラム!バカがいるYO!」とか言われないですか。
0199デフォルトの名無しさん
NGNG>依存関係を減らすのにpImplイディオムが有名だ、
それは名前から察するにEffective-C++でも紹介されていた、実装クラスとインターフェースクラスを
分離するっていうテクですか。
>しかしコンストラクタでnewしたくないめんどくさがり屋にはお勧めできない。
それもそうですけど、これでもインターフェースクラスに変更があったら再コンパイルですよね。。。
それならauto_ptr使うほうがまだ良い気がします。ファイルの増殖を防げますし。
>さらに依存関係をほとんど無くすのにJavaが有名だ、
ああ、なんかありますよね、、、ゲーム作りたいのでJAVAだと速度が心配です。
>依存関係とめんどくささはトレードオフの関係にあるようだ。
了解しますた。
0200デフォルトの名無しさん
NGNGscoped_ptrのソースを持ってきて、そのコンストラクタを書き換えて自動的にnewするようにすれば君のやりたい事が実現できる。
毎回newを書かなくても、その独自のscoped_ptrを使えば自動的にインスタンスが作られる。
それを馬鹿だと言うやつには経緯を説明して、それでも理解できなければそいつがバカだと笑ってやるがいいよ。
0201デフォルトの名無しさん
NGNGふつーはメンバのオブジェクトを個々に scoped_ptr で持たずに pimpl イディオム
使うけどな。Effective C++ じゃなくて Exceptional C++ ね。
> それもそうですけど、これでもインターフェースクラスに変更があったら再コンパイルですよね。。。
それは仕方ない。
ただ、影響を最小限に留める方法としては、
1. 純粋仮想関数だけからなるインターフェースクラスを分離
2. 実装側は、そのインターフェースを継承して vtbl を埋める
3. クライアントはインターフェースだけを見る
って手がある。
インターフェースを拡張する場合、既存のインターフェースには手を加えず、別のイン
ターフェースを定義して、それを実装側に継承させる。(インターフェースの多重継承
というヤツやね。COM でも良く使われてる)
0202デフォルトの名無しさん
NGNGうわっ、本当だ、画期的だ。それってスゴくないですか!!??
心配なんですが、scoped_ptrみたいなクラスのテンプレート引き数って、includeしてないやつでもOKですよね!?
うーむ。これは新しい。。。演算子オーバーロードしてポインタに見えなくするとか、色々出来そうですね
0203デフォルトの名無しさん
NGNG>インターフェースを拡張する場合、既存のインターフェースには手を加えず、別のイン
>ターフェースを定義して、それを実装側に継承させる。
ははぁ、、、なるほど、、、色んなワザがあるんですねえ。こんな感じでいいんですか。
class CImpClass : public CInterfaceVer1, public CInterfaceVer2 ...
{
};
うーむ
0204デフォルトの名無しさん
NGNGやってみましたけど、テンプレートクラスの中で目当てのオブジェクトをnewできないじゃないですか!
作りたいクラスの名前しか分からないからnew出来ない、そりゃそうか、、、
0205デフォルトの名無しさん
NGNGtemplate< typename T > class ptr_container
{
public:
ptr_container(void) : m_ptr( new T() ){}
~ptr_container(void){ delete m_ptr; }
private:
T* m_ptr;
};
ってできないっけ?
0206デフォルトの名無しさん
NGNGこういうのは無理みたいです
#include "ptr_container.h"
class CData;
class CDocument {
ptr_container<CData> m_data;
};
コンパイルエラーになります。CData.hをインクルードしたらいけますけど、
それだと最初の目的が達成できないです。
0207デフォルトの名無しさん
NGNG俺はできたよ。
普通にポインタ使うときと同じように、しかし初期化する必要なく。
CDocumentの実装ファイルには当然CData.hをインクルードするよ。
0208デフォルトの名無しさん
NGNG無理。new する時点で、そのクラスの定義が見えないと NG なんで。
別のクラスにインスタンス構築を押しつけるって手はある。
template <calss T, class TFactory>
class ptr_container
{
public:
ptr_container() : m_ptr(TFactory::Create());
~ptr_container() : { delete m_ptr; }
private:
T* m_ptr;
};
struct FooFactory
{
static Foo* Create();
};
0209デフォルトの名無しさん
NGNG> CDocumentの実装ファイルには当然CData.hをインクルードするよ。
……スレの流れを読め。
0210デフォルトの名無しさん
NGNG俺はスレの流れを正しく把握してるって
188を読むからに206はCDocumentの実装ファイルにCData.hをインクルードする事はかまわないと言っている。
0211デフォルトの名無しさん
NGNGと書かれて一つのメンバ変数が指されるんですけど
どういうこと?
0212デフォルトの名無しさん
NGNGスマン
0213デフォルトの名無しさん
NGNGごめんなさい、いけました。includeする順番間違ってました。
これマジ凄いですよ、みんな使いましょうよ。
今時これくらいならオーバヘッドだってあんまり気にならないでしょう。
ところでちょっと謎な現象なんですが、
CDocument.cppの中でCData.hを正しい順番でインクルードしないとエラーになるというのは分かります。
で、ためしにCHoge.cppってのを作って、その中ならCDocument.h単体でインクルードしてもエラーにならないのは
どういう事なんでしょうか。なんか勘違いしてますか僕
>>210
はい、CDocument.cppの中でCData.hをインクルードするのはOKです。
でないとCDataを触れないですからね。
0214あ
NGNGc++でXMLを扱おうとしてxerces-cを使っているのですが、
サンプルをコンパイル時に
fatal error C1083: インクルード ファイルがオープンできません。'xercesc/util/PlatformUtils.hpp': No such file or directory
とエラーが発生しました。
設定的な問題だと思うのですがどう対処すればいいのでしょうか?
0215213
NGNGえ〜と混乱してしまいましたけど、
CDocument.cppでCDocument.hをインクルードする時にCData.hもインクルードする必要があるのは、
CDocument.cpp内にCDocumentのコンストラクタの実装があるから。
CHoge.cppでCDocument.hを単体でインクルードしても、CDataを触ったりしない限りCData.hをインクルードしなくてもコンパイルとおる。
という理解で良いでしょうか。
ていうかこれって凄いアイディアじゃないですか。STLに入れて貰えそうじゃないですか
0216デフォルトの名無しさん
NGNGおけ。
でもデフォルトコンストラクタが無いと動かないので208のように使うのが一般的かと。
しかしコンストラクタを省略するのはものぐさなのでC++向きじゃない気も。
LokiのSmartPtrにはそういうポリシーを受け入れる用意があるけど、各自勝手に実装しろってスタンスだし。
0217デフォルトの名無しさん
NGNGptr_containerが「.」をm_ptr->に、「&」をm_ptrに置き換えてくれたりしたら最高なんだけど、そういうのは無理なのかね。
0218デフォルトの名無しさん
NGNG0219172
NGNGgcc がバグってるということで。
http://gcc.gnu.org/cgi-bin/gnatsweb.pl
view #6734
0220デフォルトの名無しさん
NGNG'<Unknown>' にありません。
とかいうエラーメッセージが出るのですけど、
どういうことなんでしょう?
0221デフォルトの名無しさん
NGNGcell computingとは、ブロードバンドに接続された家庭内
や企業内のPCの余剰CPUパワーを統合し、
仮想的なスーパーコンピュータとしての利用を実現する
技術を用いたSI、ネットワークサービスです。
バイオ、物理計算、設計、金融工学、CGレンダリング
などの分野のお客様へ、安価に仮想スーパー
コンピュータパワーを提供することを目的としております。
なお、将来的には収益にあわせてCPUパワーを提供し
てくださる参加者へポイントシステムやデジタルコンテンツ
による利益還元を考えております。
http://www2.cellcomputing.jp/
2ちゃんねるのチームあります。【挑戦しる】
http://members.cellcomputing.jp/services/teams/team.htm?id=ABBE425B-CE11-4DA4-8591-C68DF67DA41A
0222デフォルトの名無しさん
NGNGscoped_ptr 的に使うならptr_container自体に関するコンストラクタとかは
全部不要だろうから、
template< typename T > class ptr_container
{
public:
ptr_container() : m_ptr( new T() ){}
template<typename T1>
ptr_container(const T1& t1) : m_ptr( new T(t1) ){}
template<typename T1, typename T2>
ptr_container(const T1& t1, const T2& t2) : m_ptr( new T(t1,t2) ){}
template<typename T1, typename T2, typename T3>
ptr_container(const T1& t1, const T2& t2, const T3& t3) : m_ptr( new T(t1,t2,t3) ){}
...
と10個くらい並べとくとかいう手がある。constじゃない参照をとる
コンストラクタに対応しようとするといささか美しくない方法が必要だが。
0223デフォルトの名無しさん
NGNG継承しないただのコンポジションと違うところありますか?
派生クラスのメンバオブジェクトのコンストラクタの仕方とか。
0224デフォルトの名無しさん
NGNGよく状況がわからんからコードで示せ
0225233
NGNGclass class0{
public:
int val0;
}
// class0のコンストラクタ
class0::class0(int x){
val0 = x;
}
class class1:public class0{
// メンバオブジェクト
public:
class0 obj0_0,obj0_1;
int val1;
f1();
}
としたときclass1のコンストラクタは
class1::class1(int x1, int x0_0, int x0_1)
:obj0_0(x0_0), obj0_1(x_1){
val1 = x1;
}
とう具合で良いでしょうか?
0226デフォルトの名無しさん
NGNGへえー。それでもコンパイル通るんだね。
>コンストラクタに対応しようとするといささか美しくない方法が必要だが。
ドーやんの、オスィエテよ!
このやり方ってオーバーヘッドが若干ある&初期化が独特って事以外デメリット無いよね?
0227デフォルトの名無しさん
NGNGファイルにするときのリンクの仕方は何か特別のことする必要あるでしょうか?
0228227
NGNGたぶんそのリンクができてないからエラーが出てるのだと思いますが、
どうすれば良いでしょう?
0229デフォルトの名無しさん
NGNGclass1のコンストラクタで、継承元のclass0の初期化子が呼ばれてないから
それだとエラーになるんちゃうか。
0230デフォルトの名無しさん
NGNGしかし趣味でC++を勉強していて、とりあえず
「新C++言語入門<ビギナー編>林晴比古 著」
の内容は一通り理解しているつもり。
こんな俺は、C++を使ってのソフトウェア開発で通用しますか?
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNGせめて、ビギナー編じゃないほうの、上下巻のほうを読んだと言おうや。
0233230
NGNG陰で馬鹿にされている可能性が非常に高いとも言えますね。。。
0234デフォルトの名無しさん
NGNGそこからステップアップしてくつもりなら何も問題ないのでは。
0235デフォルトの名無しさん
NGNGC++Primer読んでたけどこれなかなかよかったよ。
下らない本を何冊も買うより、これ一冊で
基礎をちゃんとやるのがいいかも。
0236デフォルトの名無しさん
NGNGとりあえず、晴比古本はやめとけ。
0237デフォルトの名無しさん
NGNG内容はいいけど、でかすぎて重すぎて読みづらい(涙
0238230
NGNGスレ違いスマソ。
0239次回メルチェは23時
NGNGな粗品ファイルをあげるから、おしえてください。
回答と粗品の請求は↓へお願い。
l*ol*im*an*10@ho*tm*ai*l.*c*om
forループで重い処理をしていても、WndProc()が
機能するような方法をおしえてください。
次のソースで描画の処理はできましたが、例えば、
WM_MOVE はできていません。
LRESULT CALLBACK WndProc(の、
switch (msg) {
case WM_RBUTTONDOWN:
func(hWnd);で↓が起動
0240次回メルチェは23時
NGNGMSG msg;
char str[50];
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
wsprintf(str, "%3d,%3d", i, j);
SetWindowText(hWnd, str);
while (PeekMessage(&msg, hWnd, WM_MOVE, WM_MOVE, PM_REMOVE)) {
SendMessage(hWnd, WM_MOVE, msg.wParam, msg.lParam);//ここ失敗
}
if (PeekMessage(&msg, hWnd, WM_PAINT, WM_PAINT, PM_REMOVE)) {
SendMessage(hWnd, WM_PAINT, msg.wParam, msg.lParam);//これ成功
}
}
}
}
0241Q
NGNG空のWIN32アプリを作ってダイアログを表示させたは良いんですが
他のDOS(みたいなの)の画面上でチャットするソースとくっ付けたら
ダイアログが表示されなくなりました。ありそうな原因を教えてください。
お願いします
0242デフォルトの名無しさん
NGNG0243Q
NGNG何でダイアログが表示されなくなったのか分からない(泣
ネットも そんな馬鹿なQ&Aないし。。
0244デフォルトの名無しさん
NGNGプログラムが終了してもdeleteしないと残っているんでしょうか?
0245デフォルトの名無しさん
NGNGstaticで宣言してたら残る。
自動変数なら消滅。
基本です〜。
0246デフォルトの名無しさん
NGNGUNIXではプロセスごとに確保したスタック、ヒープは
プロセスが終了した時点ですべて開放されます。
Windowsは知りません。
0247245
NGNGmainが終わればstaticでも消滅ですた。。。
0248デフォルトの名無しさん
NGNG0249248
NGNG0250デフォルトの名無しさん
NGNGデストラクタのこと?
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG正確には main が終わった後、プログラムの実装終了前、だな。
■ このスレッドは過去ログ倉庫に格納されています