【標準C++】C++相談室 part39【STL含む】
9 :
デフォルトの名無しさん :05/01/23 16:55:04
 ̄ ̄ ̄ _ , ― 、 ,−' `  ̄ヽ_ ,' ヽ ( `ー'ー'ヽ`ー'ー'ヽ ) ( ノ '''''' '''''':::::::ヽ ) ( . )(●), 、(●)、.:( ) + ( ) ,,ノ(、_, )ヽ、,, .::::( ) <ヨン様が華麗に4get! . ヽ ) `-=ニ=- ' .:::::::|ノ + \ `ニニ´ .:::::/ + ,,.....イ.ヽヽ、ニ__ ーーノ゙-、. : | '; \_____ ノ.| ヽ i
STLつかうと一気に実行ファイルサイズが10倍に?!
>>12 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>13 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
>>15 #include <stdafx.h>
後死ね。
>>16 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
今回のテンプレに割り込み
>>9 計1件
今回のテンプレにマジレス
0件
20 :
デフォルトの名無しさん :05/01/23 17:07:10
こんにちは質問ですが、 Class階層として CFirst -> CSecond -> CThird となっているものがあるとして、 CFirst内ヘッダで public: int a;//aはコンストラクタ内でa=10;として初期化。 virtual void function(); CThird内ソースで、 void function() { int c=a; } そして、 (CFirst*) pF = (CFirst*) pThirdObject; int value = pF->a; とすると、pF->aの値が0x00000000になって、エラーになります。 どうしてなのでしょうか? これは、基底クラスから呼び出した派生クラスメソッド内で、基底クラスのメンバ変数を呼び出すとエラーになるということでしょうか?
追記 (CFirst*) pF = (CFirst*) pThirdObject; のpThirdObject; は、CThird ThirdObject; として作られたオブジェクトのポインタなもの、 pThirdObject = &ThirdObject; です。
C++スレの理想分割構想
環境非依存のC++に関する事,STL…C++相談室
STL以外のtemplate全般(boost,loki,メタプログラミング)…template統合スレ
コンパイラ依存…
>>10 開発環境依存…
>>11
追記 (CFirst*) pF = (CFirst*) pThirdObject; int value = pF->a; は、MFCのCViewクラスから派生されたクラス内のメソッド内でインプリメントされたものです。
環境非依存のC++に関する事,標準C++ライブラリ(STL,stream,locale)
【標準C++】C++相談室【STL含む】
標準C++ライブラリ(STL,stream,locale)以外のライブラリ全部
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)
コンパイラ依存
>>10 開発環境依存
>>11 こうでしょ?
>>20 static_cast<CFirst*>(pThirdObject)だとどうなる?
>>24 じゃあライブラリじゃない生templateの話もこっちのスレ?
環境非依存のC++に関する事,標準C++ライブラリ(STL,stream,locale)
標準C++ライブラリ以外に依存しないtemplateの話
【標準C++】C++相談室【STL含む】
標準C++ライブラリ(STL,stream,locale)以外の環境非依存ライブラリ全部
(lib*やらlokiやらboostやらcrypto++やらBlitz++やらACEやらSDLやら)
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)
コンパイラ依存
>>10 開発環境・実行環境依存(環境依存ライブラリ含むWTLやらMFCやら)
>>8 ,11
30 :
デフォルトの名無しさん :05/01/23 17:39:04
>>20 CThird::function() はいつ呼ばれてるの?
>>20 >(CFirst*) pF = (CFirst*) pThirdObject;
なぜ明示的にキャストをしている?
CFirst* pF = (CFirst*) pThirdObject; です。 今、自己作成のシステムを最初から作り直してます。 すいません。
根本的に分かってないような…
>>32 > CFirst* pF = (CFirst*) pThirdObject;
CFirst* pF = pThirdObject;
で済むのだが・・・
Cしか分からない香具師がC++書いた時に偶に見かけるミスだのう
質問です。 初期化が必要なクラスを複数同時に管理する方法はありませんか? 現在はstd::vectorを使っていますが、初期化と開放をコードに 付け加えるのが面倒なので。 コード例。 class Cstruct{ char* data; public: Cstruct(int n){data =new char[n];} ~Cstruct(){delete[] data;} }; class Cclass{ vector<Cstruct> object; (以下略) }; 要するに、新しいクラスを追加する時に、コンストラクタが 自動的に作動するようなvectorが欲しいのですが。
>>37 Cstructクラスにコピーコンストラクタを作ればいいんじゃね?
つか、作らないとまずいだろう
>>38 コピーコンストラクタ?operator=(Cstruct)のことですか?
コピー禁止にして、なおかつ各Cstructは別々の値が入るようにしたいのですが。
ひょっとして、vector内部ではそれで初期化しているのでしょうか?
(コピー禁止は省略しました。情報不足すみません。)
違うのならば、調べます。
>>40 コピー禁止したクラスは vector には入れらんないよ。
vector<Cstruct*>
>>40 コピーコンストラクタはCstruct(const Cstruct&);みたいなコンストラクタのこと
失礼しました。Cstruct::Cstruct(Cstruct&)の方でしたか。
こちらは知らなかったので、もう一度調べなおします。
ありがとうございました。
>>41 利用側でする、つまり実質何もしなかったので、気付きませんでした。
45 :
デフォルトの名無しさん :05/01/23 21:07:25
void class_b::func( void* pclass_a ) { class_a* ptr = (class_a*)pclass_a; ptr->hoge = 1; ←★ ptr->foo(); ←★ } こんな風にptrにはclass_aのポインタを入れてclass_aのメンバ、メンバ関数にアクセスしてますが、 数が多いと、"ptr->" の部分が冗長で面倒なのです。 スコープがまるでclass_aの中にいるときのように省略する手段などありませんか?
>>47 スイマセン、詳細をお願いします。C++全然知らずに使ってるもので。
class_cをclass_aから継承して作るということでしょうか?
CBitmap* CXSFrm::GetBitmap() { return m_pBitmap; } GetBitmap()=new CBitmap(); error C2106: '=' : 左のオペランドが、左辺値になっていません。 関数の返り値がポインタで、そのポインタをnewすることってできないんですか? やっぱ無理ですか? 初心者質問でスマソ
>>35 > CFirst* pF = (CFirst*) pThirdObject;
pThirdObject;はCThirdObjectだから、キャストしてるんだと思われ。
>>49 CBitmap*& CXSFrm::GetBitmap()
{
return m_pBitmap;
}
GetBitmap() = new CBitmap();
あまりお勧めはしないけど
>>50 pThirdObject;はCThirdObjectだから、キャストしなくてもいいと指摘してるんだと思われ。
しつも〜ん ゲーム開発は主にC言語がメインですが、 C++で開発はしないのでしょうか? 何かデメリットでも? C++で開発できたほうが、楽だと思うんですが。。。
>>53 C++を知らない人が多かったらCを使うんでしょう。
でも、そういうところは全体的に低レベルなところ。
>>53 例外処理やRTTIの実装が重いのがデメリット。
そいつらをコンパイルオプションで無効にすれば問題ない。
最近はコンパイラの実装が洗練されたり、
環境自体がリッチになってきたりといった理由で、
フルのC++でも大丈夫な環境も増えているだろう。
>>55 その後、どうなります?
class_cのインスタンスを作って、class_bに渡してもあまり進展がない気がします。
>>58 おまいさんはカプセル化というものを意識してるかい?
>>59 つまり、こういうことですか?
class class_c : public class_a {
public:
class_b class_b_instance;
};
もしこれでしたら、これはできないんです・・・。多分。
>>58 class_c に新しいメンバ関数を作って、class_b::func ではそれを呼び出せ。
>>53 > ゲーム開発は主にC言語がメインですが、
ダウト。というか、そういう話をどこから仕入れてきたのか気になるな。
>>61 なるほど!そういうことですか。
そのメンバ関数は非常に大きい上に、class_b固有の処理の色が強いので、class_cに含めづらいっす。
ただ、非常に参考になりました。
あと、class_aはアプリケーションのフレームワーク的なものなので、class_cに継承するのはどうなのかなーというところです。 もしかして良くわかってないだけかも知れませんが。
PS2の開発ってC言語だろ? C++で組んでるなんて聞いたことねーぞ。
>>65 聞いたことが無いものは存在しない、か。おめでてーな。
g++もCWもC++コンパイラじゃないか。
69 :
デフォルトの名無しさん :05/01/24 00:27:45
>>66 おめでとう!!!!!!!!!!!
さぁ!うんこトークの時間です!!!!
>>63-64 クラス分けに失敗してる可能性が高いな。
可能なら class_a/class_b の役割を再考したほうがいい。
古くからずっと零細の下請けソフトハウスとかCしか使って無さそうだな
巣へお帰り
>>71 そりゃもう、普段からコードなんてぐだぐだで、しかも、C++なんて高等言語が理解
できるはずないじゃないですかー
ならなんでC++スレに来るんだ?
>>70 それはありますね。デザインパターンなんか1つも知らないですし。
class_a はフレームワークなのでみんなが共通でアクセスしたい情報を集中的に持っていて、
class_p、class_q、class_r がその情報にアクセスしたいときに、一番最初のコードを使ってるんです。
class_p,q,rのインスタンスは、class_aのメンバ変数になってる class_x がnewでインスタンスを生成して
そのポインタだけ保持してる形です。・・・こんなの書いてもわからないですよね・・・。
77 :
デフォルトの名無しさん :05/01/24 00:40:23
ちなみに、class_aから使用頻度の高いものを抜粋して、グローバル変数にして externで共有という最後の奥義を使うべきか使わざるべきか迷うところです。
それってもはやclass_aのメンバ変数がグローバル変数と 変わらないレベルになってるんじゃないの? そこまでひどいならCで書いた方が余計な事書かなくていい分まだマシだよ。
とりあえずデザインパターンどうこうとか言うレベル以前に カプセル化あたりから勉強し直してみたら?
皆さん、初めまして。 CやC++で簡単なゲームくらい作れるようになりたいと最近思っているのですが なんかいい参考書とかないでしょうか?(Webサイトでもいいんですがやっぱり書籍にはかなわないと思っているので・・・) 自分のレベル的にCでプログラムの基本文法をやったくらいでC++は未経験です。 ツールはVisualStudio.netを持っているのでそれを使おうかと思っています。 初心者に毛が生えたような僕に最適な書籍が何かあれば紹介してください。 宜しくお願いします。
「なぜオブジェクト指向で作るのか」を読んでみては。
ゲーハー板に、プログラマーの人がいるんですが、その人が 「C言語の場合、例外処理あたりで問題がおきてるでつ」 というから、 「C言語に例外処理はないよ」 と突っ込んだら、10分間のブランクの後に、 「そうでつた、エラーシーケンスと例外処理とを勘違いしてまつたニヤ。」 と返事きたので失笑した。
みなさん、どうもです。多分自分のやり方に問題がある可能性は高いのですが、
この形を崩すとなると、本当に1から書き直しになるので、現状維持で行ってみます。
>>81 機会があれば読んでみます。
CでもSEHはあるよね?環境依存だけど。
ゲームキャラクターをクラス単位でオブジェクトにして管理したら楽そうだなぁ。 グランツーリスモなんて何百台あるわけだろ。 それはクラスで管理したらスゲー開発楽そうだが。 実際はどんな言語で組んでるんだろ?
そもそも言語仕様として例外が定義されていないだけだから、 エラーシーケンスを例外処理と言おうが構わない。
ゲーム開発でのオブジェクト処理はタスク処理としてアセンブラの時代から根付いているので ゲ制作板でも行って勉強してください。
広義の「例外処理」はC言語でもプログラム中に存在する。 C言語に無いのは、言語に組み込まれた例外処理機構。
>>88 そんな事言ったらきりがない。
基本的に(一般的に)C言語は例外処理が扱えない。
>基本的に(一般的に)C言語は例外処理が扱えない。 C言語ではエラーは全部無視するのか?
try-catch-through いや、throw が使えないってことかな
>>90 言語に組み込まれた例外処理機構がないと、こういうことを言うようになるという例。
>>94 ゴメン、トライキャッチスルーって言いたかっただけ。スロウちゃうんかと。
ああもう明日も会社で鬱だから寝るわ。
ThreadLocal みたいなライブラリってありませんか?
標準C++とSTLにはありません。
>>97 JavaのAPIとかよくわからんが
C++でスレッド使うんなら、Boostライブラリとか・・・
_beginthreadexとか…
それportability0やん
102 :
デフォルトの名無しさん :05/01/24 17:53:12
ポインタとアドレスってわかりません。 「構造体のポインタを渡す」って言われても、ちんぷんかんぷんです。 本を読んでも意味不明です。 どなたかこれに関して俺みたいに相当のアホにでもわかるような 説明できる方はいませんか?
Cスレ逝け
104 :
デフォルトの名無しさん :05/01/24 17:58:36
アドレス(address)は住所だが、転じてメモリがある位置を表す内部の数値を意味する。ポインタ(pointer)は指し示すもの、つまりアドレスそのものか、その入れ物。
#includeがわかりません。 Task.hで class Task{ ....}; Task.cppで定義します。 このTaskクラスを2つの・・・.hファイルで継承して 使いたい時には、それぞれでTask.hをインクルードすれば いいんでしょうか?2重定義みたいじゃないっすかね? ヘッダファイルが分かってないのかな・・・
107 :
デフォルトの名無しさん :05/01/24 18:13:55
>105 二重宣言かどうかはコンパイル単位で決まる。クラス宣言中のメンバ関数定義はinline化されるので気にしない。 二重に#incされるのを避けたいなら、ヘッダーの内部か外部を#ifndef..#define..#endifで囲む必要。
超すばやい返信ありがとうございます。 おかげで無事解決しました! インクルードガードっていうんだぁ・・・ ところで、個人が趣味程度でゲーム作るとかに 分割ファイルしていいんでしょうか?無意味?
109 :
デフォルトの名無しさん :05/01/24 18:40:01
分割コンパイルはモジュール化と再利用性向上とコンパイル時間短縮を促す。大いに分割したまへ。
main.cpp #include "proc.h" main() { proc(); } proc.h void proc() { proc1(); proc2(); proc3(); } proc1.h proc1() { cout << "a"; } proc2.h proc2() { cout << "b"; } proc3.h proc3() { cout << "c"; }
レベル1 全部main()の中に書いてしまう レベル2 関数を使い出す。ただし基本的にグローバル変数 レベル3 auto変数を使い出す レベル4 ポインタを使い出す レベル5 構造体を使い出す。構造体へのポインタも。 ・・・先が長ぇw
>110 もっと分割しろ! 一行一ファイルにしろ
>111 まともなIDEや解説本ならサンプルコードも実行結果も関数の使い方も載ってるけど
114 :
help :05/01/24 23:27:27
あげます。早急に疑問を解きたいです。 改行が多いといわれたので、2回にわけます。 以下、ソースを見せます。(ほんの少しのソースです) [Field.h] #ifndef __INCLUDE_FIELD__ #define __INCLUDE_FIELD__ #include <string> /** * フィールドを表すクラス */ class Field { /** 名前の取得 * @retval 名前 */ public: const char* getName() const; protected: std::string name;///< 内容 }; #endif __INCLUDE_FIELD__
続きです。 [Field.cpp] #include "Field.h" const char* Field::getName() const { return this->name.c_str(); } 以上、 ↓が、 "bcc32 Field.h Field.cpp" にてコンパイルした実行結果です。 エラー E2141 field.h 8: 宣言の構文エラー *** 1 errors in Compile *** field.cpp: 構文のエラーとは、なぜでしょうか。よろしくお願い致します。
ヘッダをコンパイルすんな
ふつーヘッダもコンパイルするだろ
スレ違いな気もしますが質問させて下さい 古い本ですが「ロールプレイングゲーム プログラミング」を入手したものの、 デバックの仕方が全然わからなくて止まっています どなたか教えて下さいませんか 当方超初心者ですorz
あきらめるのがいいとおもうよ
みなさん、ありがとうございます。 bcc32ってヘッダファイルなくていいんですね? というかbcc32の仕組み分かってなかったのかな・・・ nasm?かLsi食べるなんとかってのだと、.hもコンパイルするときファイル列挙しないと だめだったきがしたので、ついやってしまいました。 ありがとうございました・・・感謝
>>122 おーい、勘違いしてるぞ。
field.hはfield.cppがインクルードしている。
つまりコンパイル時にはfield.hの内容はfield.cppに挿入されてんだよ。
>bcc32ってヘッダファイルなくていいんですね?
んなわけねえだろ。
>というかbcc32の仕組み分かってなかったのかな・・・
んなわけねぇ。おまえが#includeの意味を知らなかっただけ。
nasmはアセンブラ。LSI試食版もインクルードファイルをコンパイルすることはありえない。
class TestA { TestB b; }; class TestB : public TestA { }; という具合にTestAを継承したTestBクラスをメンバに持つクラスTestAを作りたい場合どうすればいいですか?
>>125 自分が何をしようとしているのか冷静に考えて味噌
>>125 TestA が持ってる TestB のメンバがポインタでいいのなら、
class B;
class A {
class B * b;
};
class B : public A {};
もしくは参照を使って、
class B;
class A {
A();
class B& b;
};
class B : public A {};
コンパイル通ったから動くんじゃない?(´σД`)ホジホジ
ただ、サブクラスのインスタンスをスーパークラス側で持ちたいってのは、
どう考えても設計ミスなので、オススメはしない。
> ただ、サブクラスのインスタンスをスーパークラス側で持ちたいってのは、 > どう考えても設計ミスなので、オススメはしない。 C++じゃないけど、java.lang.Object#toString はどうなんだ、という、
>>130 あれは、java 自体が java.lang.String を特別扱いしてるところがあるので
例えとしてはどうかと…。「インスタンスを保持」しているわけでもないし。
どう考えても設計ミスだと断言したのは、そういうケースでは
自クラスのインスタンスを保持して polymorphism しないの?って話。
class A {
class A * a;
};
わざわざ「サブクラス」に限定する意図が分からん。
数値を16進数として文字列に格納したいんですが、 stdにはsprintf以外で変換する方法はあるんでしょうか? 今のところCの関数使ってない分sprintf入れると見栄えが 悪くなるんで使いたくない・・・
int a = 1000; std::stringstream ss; ss << std::hex << a; std::cout << ss.str() << std::endl;
#include <iostream> #include <sstream> int main() { int a = 1000; std::cout << dynamic_cast<std::ostringstream&>(std::ostringstream() << std::hex << a).str() << std::endl; }
135 :
デフォルトの名無しさん :05/01/26 22:24:55
>>132 boost::lexical_cast
なるほどこんなのがあるんですね・・・ どうもありがとうございました。
137 :
デフォルトの名無しさん :05/01/27 00:05:22
BOOST紹介はもう要らない。 つまらないからもう逝っていいよ。 っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。 勝手にそんな事ができない場合だってあるだろうに。 BOOSTで用意された機能すらも自分で実装できないようなへたれか?
>>137 boost で実装された機能の劣化コピーをがんばって作って、自分はへたれじゃないと言い聞かせている人ですか?
139 :
デフォルトの名無しさん :05/01/27 00:12:22
>>138 なにいってんのこの人。
貴方が2chでよく書き込みされている池沼さんですか?
140 :
デフォルトの名無しさん :05/01/27 00:15:44
>139 そいつは使えるものは使えってひねくれて言ったんだろ。人違い。いい加減にID見ないとヤるぞ!
141 :
デフォルトの名無しさん :05/01/27 00:17:15
>>140 IDなんて出てないもん! にゃんにゃん
コンソールプログラムでの入力で 13.9 12.5 の様な入力を簡単に配列に代入する方法はありますか?
>>142 それをどういう規則で配列に入れるかによる
>>142 std::vector<int> v;
std::copy(std::istream_oprator<int>(std::cin), std::istream_operator<int>(), std::back_inserter(v));
とか。
試してないから動くかどうかわからん。
あ・・・・ ×std::istream_operator ○std::istream_iterator
>>137 インスコしなくても、*.hpp コピってくればとりあえずは使えるぞ。
regex とかは無理だけど。
>>142 istream_iterator
レスありがとうございます。
>>143 この場合はfloat型の配列です。
>>144 調べてきます
>>137 >っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
>勝手にそんな事ができない場合だってあるだろうに。
できる場合だってあるので
解決法の1つとしてここで提案するのはいいのでは?
もし標準ライブラリの範囲で回答を限定したければ
そういう風に質問すればいいでしょうし
それを未然に防ぐためにスレタイに【標準C++】って入れたんじゃ ないだろうか。俺はどっちでもいいと思っているけど。
そんな理由で【標準C++】を入れろだなんて誰もいってない 厨が勝手につけただけ
class Singleton { public: static Singleton* getInstance(); private: Singleton(); static Singleton mSingleton; }; Singleton Singleton::mSingleton; void main() { } というコードを書いたところ main.obj : error LNK2005: "private: static class Singleton Singleton::mSingleton" (?mSingleton@Singleton@@0V1@A) は既に Singleton.obj で定義されています。 とエラーになります、どこが悪いのでしょうか?
154 :
デフォルトの名無しさん :05/01/27 10:42:00
>153 二重定義のためリンク時エラー。 構築がprivateでいいの?
>>153 Singleton Singleton::mSingleton; をヘッダに書いてるんじゃないか?
>>154 コンストラクタ private にしないと、 new Singleton がエラーにならない。
> っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。 > 勝手にそんな事ができない場合だってあるだろうに。 こっちの主張は一理あるが、 > BOOSTで用意された機能すらも自分で実装できないようなへたれか? こっちは馬鹿丸出しだな
>>155 ヘッダファイルに書いてますがどうしてヘッダファイルに書くと何故駄目なんでしょうか?
>>157 そのヘッダファイルを2つのソースファイルでインクルードしてたら、
Singleton::mSingleton の定義が2つリンクされるだろ?
C/C++には定義は一つでなければならないというルール(One definition rule: ODR)がある。
なるほど、ありがとうございました
std::ifstreamで名前付きパイプのファイル名を指定すると読み込めないんですが、 そういうものですか? (Cのopen() / read()では普通に読めるんですが)
>>160 C++のfopen()/fread()では如何ですか?
環境を書いてませんでした linuxでやってます(kernel 2.4.20/gcc 3.2.2) 。 fopen() / fread()でも読めませんでした。 読めないというか、書き込み側のプログラムを終了させた途端、一気に溜まっていたものが読み出されました。 名前つきパイプのファイルは普通のファイルとは違うので、システムコールのopen()/read()じゃないと、 fifoとしての読み込みは出来ないということでしょうか?
バッファリング方法を変えろ
なるほど、指定した長さを読み込むまでブロックされてました。すみません。 fread()でも普通に読めるようになりました。 が、std::ifstreamでは相変わらず読めません。read()で1バイトずつ読もうとしてますが、 そこで止まったままです。 (書き込み側は同じプログラムです)
最近標準c++の使い方の勉強を始めました。 listとかvectorとか色々便利そうなんですけど、 使い方がいまいちわかりません。 関数とか色々用意されているようですが、 どんな関数があるのか調べる方法はありませんか? 色々ググってみてるんですが、 どうもうまいことひっかかりません。
>>166 テンプレにありましたか・・・申し訳ありませんでした…。
6らへんまで読んで英語で挫折してました・・・・。
英語で挫折しているようなら、あきらめた方がいいよ。
とりあえず Effective C++ More Effective C++ Effective STL を買ってそれを枕がわりにして寝るとよい
レスありがとうございます。 明日にでも本屋行ってきます。 英語も頑張ります。
規格票って何だよ
規格票って言葉は間違い?OKでしょ。 俺は使わないけど。
182 :
デフォルトの名無しさん :05/01/28 12:25:48
>>180 選挙に関係なく、票とは、何かが書いてある紙きれとかいう意味があるよ。
まず「規格」があって、「書」とか「票」とか「HTML」とかの形態をとる、 と考えるのがよいと思いました。
>>180 広辞苑の場合、
1.ふだ。紙片
2.中国で証書・証券、また手紙、紙幣
3.選挙・採決などで意思を表示したふだ
となってるわけだが。ま、いらん恥かいたな
煮詰まってきたので質問させてください。 配列クラスarrayを、次のように定義します: ※エラー処理等の詳細は省略 template <class T> class array { T *data_; int w_, h_; public: array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; }; virtual ~array() { delete[] data_; }; T get(int x, int y) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_]; }; void set(int x, int y, const T& t) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t; }; }; このクラスは2次元配列を1次元配列として実装してあります。 array<int> ia(10, 5); ia.set(5, 3, 10); cout << ia.get(5, 3) << endl; というようにして、値の設定と取得ができます。 これをより簡易な表記ができるよう、[]演算子をオーバーロードしようと思いました。 添字が一つの場合は T& operator[](int p) { return data_[min(w_*h_, max(0, p))]; }; のように書けるのですが、[]演算子への引数が二つ(xとy)あるケースでどう書けばいいかがわかりません。 ia[5][3] または ia[5, 3] のような表記ができるようなコードは、どう書けばいいのでしょうか?
>>186 つMore Effective C++
ただ禿はこういうときは[]なんか使わずに()を使え
って言ってる
189 :
デフォルトの名無しさん :05/01/28 20:00:59
>>186 こんな感じかなぁ
添字の指定順序を逆にするともう少しシンプルになる
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_];};
void set(int x, int y, const T& t) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t;};
struct Proxy {
T *data_;
int w_ , h_, x_;
Proxy (T *data, int w, int h, int x): data_ (data), w_ (w), h_ (h), x_ (x) {}
T &operator[] (int y) {y = min(h_, max(0, y)); return data_[x_+y*w_];}
};
Proxy operator[] (int x) {x = min(w_, max(0, x)); return Proxy (data_, w_, h_, x);}
};
>>186 template<typename T2>
class temporary {
T2* plineData_;
int index_x_, w_, h_;
public:
temporary(T2* x, int index_x, int w, int h) : plineData_(x), index_x_(index_x), w_(w), h_(h) {}
T2 operator[](int y) { return plineData_[index_x_ + y * w_]; }
};
template <class T>
class array {
:
:
// 追加分
temporary<T> operator[](int i) {
temporary<T> tmp(data_, i, w_, h_);
return tmp;
}
};
array::operator[]()でいったん別クラスのオブジェクト生成して、さらにそれのoperator[]()を呼んでいる
arrayのw_, h_の役割を交換するともっとシンプルになりそうな気がするが・・・
192 :
デフォルトの名無しさん :05/01/28 23:39:44
Cではマクロ定義に#defineを使いますが C++ではどうなりますか?そのまま使えますか?
関数に出来るときは関数にする
195 :
デフォルトの名無しさん :05/01/28 23:44:47
使えるけどinline,enum,constを代わりにしてもいい
196 :
デフォルトの名無しさん :05/01/28 23:49:43
197 :
デフォルトの名無しさん :05/01/28 23:54:38
ここで同じ質問を最低10回は見たかもしれない。 つまらん。なぜ過去スレを見ないのか。
見られないからでは? :-)
テンプレートクラス自作できる人は忍耐強いね。 C++2年やってるけど未だにテンプレートが原因で出たエラーメッセージは分かりにくい。
200 :
デフォルトの名無しさん :05/01/29 01:04:47
>>199 > テンプレートクラス
クラステンプレートだ。間違えるな。
クラスのテンプレートなんだよ?そのテンプレートを元にいろんな種類のクラスを作る
ものだ。
201 :
デフォルトの名無しさん :05/01/29 01:32:46
質問です。 class A { protected: void Hoge() {} }; class B : public A { }; class C : public A { public: void Func(B& b) { b.Hoge(); // <- これがエラーになる } }; こんな感じのソースで、 C::Func() の中から、B::Hoge() を呼び出そうとしたのですが コンパイルエラーになってしまいました。(VC6) CはAを継承しているので、A::Hoge()そのものは呼び出せると 思っていたのですがダメなんでしょうか?
ぷぶぃc
あ、VCスレのほうがよかったですか?
205 :
201 :05/01/29 03:29:40
>>204 ありがとうございます。
英語苦手なのですがこんな感じであってますか?
派生クラスのフレンド関数またはメンバ関数が基底クラスのstaticでない
プロテクトメンバを参照するとき、追加のアクセスチェックがclass.accessで
述べられているものより先に適用されます。
(注:この追加のチェックは他のメンバ、例えばstaticなメンバ変数や列挙された
メンバ定数には適用されません)
メンバへのポインタを生成するときを除いて、派生クラス自身(またはそのクラスからの派生クラス)のオブジェクトやポインタ、参照を通してアクセスしなければなりません。
もしそのアクセスがメンバへのポインタを生成することならば、
nested-name-specifier が派生クラスを明示するものとします。
うーん、へなちょこ訳では理解に苦しむ・・・
とりあえず、例を見る限りではできないのがokということみたいですね。。。うむむ。。。
>>205 CはAを継承しているが、Bを継承してはいない。
従って、CからはA::Hoge()は見えるが、B::Hoge()は見えない。
それだけの事だ。
207 :
201 :05/01/29 03:47:07
>>206 すばやい回答ありがとうございます。
でも、
void C::Func(B& b)
{
A& b2 = b;
b2.Hoge();
}
たぶんこれもダメっぽかったんですが・・・CはAを継承してるので
A::Hoge()はよびだせてもよさげなのに・・・納得いきません
>>206 本当か?public Aをpublic Bにしてもエラーは変わらないぞ。
209 :
201 :05/01/29 04:02:38
>>208 C::Func() を 207のように変えてもダメだったというのは確かだと思います。
(今手元にコンパイラがないので記憶頼りのカキコですが。。。)
>public Aをpublic Bにしてもエラーは変わらない
class A;
class B : public A;
class C : public B;
と変更しても、やっぱりC::Func() はエラーになる、ということですか?
うーん、このルールを理解しにくいのは、
おいらの理解しようとする方向がずれてるだけなのかな・・・ムー
>>207 おそらく
>>204 は、(実は今JIS-X3014を読んだわけだが)、protectedメンバは、
例えpublic継承が行われていても、もしくはprotected継承でも、自分自身(this)
に対してそのメンバを参照する事は可能だが、基底クラスあるいは自分より上の
クラスのメンバについてはprotected修飾の方が先に効くって事だろう。
例えば
class A {
protected:
int i;
static int j;
void Hoge() {}
};
class B : public A
{
int k;
};
class C : public B {
public:
void Func(B& b) {
b.Hoge(); // <- これがエラーになる
b.i = 1; // エラー
b.j = 2;
b.k = 3; // エラー
}
};
失礼。ちょっと修正 class A { protected: int i; static int j; void Hoge() {} }; class B : public A { protected: int k; }; class C : public B { public: void Func(B& b) { b.Hoge(); // <- これがエラーになる b.i = 1; // エラー b.j = 2; // staticなのでエラーではない b.k = 3; // エラー } };
もう少しまとめてみよう。 基底クラスAをpublic継承した派生子クラスBをpublic継承した派生孫クラスC のthisポインタからは、AとBのすべてのprotectedメンバ、publicメンバが見える。 しかし、void Func(B& b)のようなメンバ関数の引数bにはthisポインタが適用さ れていないので、派生ではない通常の関数のようなアクセス制限を受ける。 但し、特別な例外があり、派生クラス内もしくは基底クラスでfriend宣言された 関数またはクラスからは、staticメンバーのみこの制限が適用されない。 という事か。
213 :
201 :05/01/29 04:21:38
>>210 例のコードは理解できます(というかそういうルールがあるのを今学んだんですが)。
でも、thisからだけ参照できるというわけではないと思うんですが・・・
以下のようなコードは結構書いた記憶がありますので。。。
class A
{
protected:
void Hoge();
};
class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge()
b.Hoge(); // b を通してのHoge()。ok(のはず・・・)
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・?????
}
};
なんか、アタマが寝てるかもしれないので、今日はいったん落ちます。
アドバイスしてくれた方々、ありがとです。
あ、レスがついてるみたいなので、まだ起きてます。
214 :
201 :05/01/29 04:23:58
>>213 あれ、もしかしてダメかも。コンパイラが手元に無いのが痛い・・・
>>212 ちょっとじっくり読んでみます。すんません・・・
215 :
201 :05/01/29 04:33:04
>>212 なるほど。すっきりしたルールっぽいですね。
でも、やっぱり、thisからしか非静的protectedメンバにアクセスできない
というのがひっかかるので、明日フリーコンパイラでも入れて検証してみます。
いろいろすみませんでした。寝まする・・・
>>215 寝られましたか。
>>212 もまだ間違えてるっぽい。
というのは、
>>213 のソースをコンパイルしたら、b.Hoge()が通るからです。
どうして
>>211 のb.Hoge()がだめで、
>>213 のb.Hoge()はよいのか。まだわかりません。
でも私も頭が寝てきたので寝ます・・・・・
217 :
デフォルトの名無しさん :05/01/29 06:40:31
>>201 protectedメンバにアクセスできるのは
自分自身と同じ型のポインタ(暗黙のthisを含む)か
参照を介したときのみ。
だから
>>213 は
class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge() ヲケ
b.Hoge(); // b を通してのHoge()。 ヲケ
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・????? ダメ
}
};
>>213 class A
{
protected:
void Hoge();
};
class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge() →Aを継承したBクラスから呼ぶからこれはOK
b.Hoge(); // b を通してのHoge()。ok(のはず・・・) →NGだよ! Aクラスでprotected指定してるから
//これがOKだったらメンバカプセル化が出来ないことになる
//そしてどのクラスからでもprotected指定のメンバが見えてしまう
//ことになる
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・????? →エラーだよ! Aクラスでprotected指定だから
}
};
>>219 ダウト
>b.Hoge(); // b を通してのHoge()。ok(のはず・・・) →NGだよ! Aクラスでprotected指定してるから
これはヲケなの。一辺コンパイルしてみ。
//これがOKだったらメンバカプセル化が出来ないことになる
//そしてどのクラスからでもprotected指定のメンバが見えてしまう
//ことになる
きみ、protectedの意味知ってる?
昨晩解決しないまま寝てしまった216です。よく寝ましたがまだ解決しません。 class A { protected: void Hoge() {} }; class B : public A { public: void Func(B& b) { b.Hoge(); // OK } }; int main() { B b; b.Func(b); } が良くて、
class A { protected: void Hoge() {} }; class B : public A { }; class C : public B { public: void Func(B& b) { b.Hoge(); // NG } }; int main() { B b; C c; c.Func(b); } がダメなのは、B& bが、Cと同じ型でないからダメだという理解であってるでしょうか?
>>222 そう。継承関係はあるけどA, B, Cはそれぞれ別のクラスだから他のクラスのprotectedは見えない。
>>223 ありがとうございました。これでようやく頭の中が整理できました。
>>220 横から済みませんが
エラー出るんですが
すみません エラー出てたのb.Hoge(); の方でした 失敬
じゃねa.Hoge();でした
>>221-222 について便乗質問。
>>222 のクラス宣言で、
int main()
{
C c1,c2;
c1.func(c1); //これは
>>221 と同じでOK
c1.func(c2); //ここ
}
が、エラーになるような気がするんだが、記憶違いか?
>>228 そりゃぁ、エラーになるわなぁ。どこにfunc()があるんだ?
>>228 もともと
>>222 はダメなケースのサンプルだぞなもし。
それは無視した上で、
もしc1.func(c1)が通るならc1.func(c2)も当然通る罠。
通らんと思う理由は?
231 :
デフォルトの名無しさん :05/01/29 14:10:57
間違ってC言語スレのほうで聞いてしまいましたので、こちらで聞きます float型をcoutでsetprecisionを使って15桁表示すると、 7桁の制度しかないのに15桁分表示されます 8桁から15桁までの数字はどこを参照して表示しているのでしょうか? また、7桁の制度しかないものを15桁表示しても問題ないのでしょうか?
#include <stdio.h> int main(){ printf("%.30f", 0.1); return 0; }
>>231 もともとfloatに精度なんて期待するな。
それは言い過ぎ
同バイト数の整数よりも有効桁数少ないからねぇ。
同バイト数の整数より有効桁数多かったらビビるよオレ
わらい
さざめき
えいしょう
いのり
ねんじろ!
※ お お っ と ※
フロートなんて使ったこと無い。
float は まいそうされます
C言語だとfloatの立場が悪すぎ。 アセンブラならdoubleよりfloatの方が全然速いのに、 Cで書くと逆になるんだもん。
だからどうbぇしかつかったことありません。 でもなぜロンgどうbぇが無いのか不思議なのですが。
>>246 の翻訳
だからdoubleしか使ったことありません。
でもなぜlong doubleが無いのか不思議なのですが。
>>231 途中でdoubleに拡張されているから
>>248 printfだとそうなるけど、iostreamでもそうなの?
bitsetって個々の要素へのアクセスはboolの配列とどっちが速いですか?
>>251 要素へのアクセス法にもよると思うけどbitsetが速いんじゃない?
リードアクセス bool[]: メモリ位置の算出→メモリからのロード→決定 bitset<>: メモリ位置の算出→メモリからのロード→ビット位置によるマスク→決定 ライトアクセス bool[]: メモリ位置の算出→データのライト bitset<>: メモリ位置の算出→データのロード→ビット位置によるマスク→データのライト bool[] のほうが速いんじゃないだろうか。
オレもbool[]の方が速いんじゃねーかと思った がvector<bool>と比べるんならbitsetの方がはやいんじゃねーかな
ランダムアクセスするならどっちも同じじゃねーかな
アクセス法がbitsetのanyみたいな操作だったら bitsetが速いんじゃないかな? ちょっと取り込んでるので誰か測定をよろしく
>>256 質問には「個々の要素へのアクセス」と書いてあるのだ。
httpプロトコルでダウンロードを行えて、 LinuxとWindows間でportableなライブラリって何が有名ですか?
レスありがとうございました。More Effective C++買って読んでみました。 Proxy Classというテクニックがあるんですねえ。勉強になりました。
バイナリファイルを読み出して書き出すという単純なプログラムを製作しているのですが なぜか特定のバイトを読み飛ばして出力してしまうのです。 いかにソースを書きます(Borland C++ Builderにてコンパイル) #include <iostream> #include <fstream> #include <sstream> using namespace std; void main(){ ifstream in("bb.swf"); ofstream out("out.txt"); char c;int index = 0; while(in >> c){ if(index == 16){out << endl;index = 0;} index ++; stringstream dusts; dusts << hex; dusts.width(2); dusts << static_cast<int>(static_cast<unsigned char>(c)) << " "; out << dusts.str() ; } in.close(); } そのような仕様でもあるのでしょうか
>>261 まずバイナリモードで開いていない。
ifstream in("bb.swf", ios_base::binary);
あと確かoperator >>は空白文字を読み飛ばす仕様だったはず。メンバのget()を使え。
さらに言えばいったんdustsに出力しなくても直接outに吐けば良いと思うのだが。
こういう処理だと素直にcstdioのfopen()/fread() or fgetc()の方が楽だと思うなぁ。
ファイル入出力の処理を書く度に、標準C++の限界を感じる
>>266 そうですねぇ、例えばtxtファイルで、数字がスペース以外で区切られている物を
数値へパースする時に、Cなら一発だなぁ…とか良く思います。いや使えば良いんだけど。
iostreamなんてキモイのはほとんど使ったこと無い。 漢は黙って#include <stdio.h>
269 :
デフォルトの名無しさん :05/01/30 14:34:23
>>268 漢なら他人が作ったライブラリすらも使わずにつくれや。
>>269 車輪の再生産をするやつぁタダのアフォ。漢ではない。
>>271 そんな変態的な漢ならば意味を理解したいとは思わない。
>>269 標準ライブラリやシステムコールのライブラリ抜きに
標準入出力書くのは、かなり困難な上に移植性ゼロではないか。
C++でJavaで言うsuperを実現するにはどう書いたら良いでしょうか
>>267 cstdioインクルードファイルがCだとでも?
まぁ、ぶっちゃけCだな
278 :
デフォルトの名無しさん :05/01/30 15:29:31
>>270 アホな奴だな。
現代の自動車のタイヤは平安時代の牛車の車輪と同じか?
>>271 オマエガナー
バカは漢ではない。文(既存の資産の活用)武(自分でガシガシ書く)両道してこそ漢。
280 :
デフォルトの名無しさん :05/01/30 15:33:55
>>279 既存の資産の活用を蓑に着て勉強を疎かにする大学生ですか?(藁
>>278 無駄についてる機能を性能と勘違いする池沼はこれだから困っちゃうよ。
282 :
デフォルトの名無しさん :05/01/30 15:38:29
>>279 青木敦さんのセミナーでも受けてこい。
ちょっとはマシになるかもしれないから。
283 :
デフォルトの名無しさん :05/01/30 15:45:16
>>281 おいおい、なにが無駄についている機能だって?ww
もしかして必死に検索なんかしちゃったりしてるのかな
287 :
デフォルトの名無しさん :05/01/30 16:06:51
>>286 なんとも苦々しい反論だなww
まぁ、どちらが妄想癖を持っているか、他の人は解かっていると思うが。
288 :
デフォルトの名無しさん :05/01/30 16:08:11
おまけに有名な人物の名すら知らない無知と来てる。 もう説得力もなにもあったものじゃないよ。
>>287-288 iostreamじゃないと出来ないことを言ってみろよ池沼
現代の自動車のタイヤなんだろ?w
290 :
デフォルトの名無しさん :05/01/30 16:14:34
>>289 ははwwww
こいつは真性か?!
>>269-289 の流れではiostreamの話は既に終わってる事だということにまだ気づいて
いない。
読解力も無いのか…お前は哀れだな。
ああ、マジで池沼だ。相手の意思も確認せずに勝手に終了にしてるし。 それともこれは降参の意思表示なんだろうか・・・。
292 :
デフォルトの名無しさん :05/01/30 16:20:24
さて、次の話題にいこうか。
293 :
デフォルトの名無しさん :05/01/30 16:21:42
>>291 なんだ、まだいたの?
もう説得力無いんだからさ。
レスすんなよ。な?
自演乙
>>295 stdioではiostreamの代わりにはならないという
>>278 大して代わらねーよという俺
C言語の前に日本語がマスターできてないage厨(=
>>296 ?)も逃走したようなので、
次の話題どうぞ↓
> 大して代わらねーよという俺 俺って言われてもだれかわかんねーよ。 「たいして変わらない」ということは、同じではないことは知ってるんだよな。 その違いが大きいか小さいかは人やプログラムによって違うのが当たり前。 自分と違う答えを認めることができない奴は池沼と言われてもしかたがない。
>>301 俺は自演などしない。お前と違って自信があるからな。
それと、お前のmail欄は sage じゃなくて age だろ? age厨君。
>>300 スマンな。休日だから許してね
次の話題どうぞ。↓
305 :
デフォルトの名無しさん :05/01/30 16:50:43
みんな…ごめんね。 実は僕様チャン、学校でいじめられて、ついカッとなって、2chに八つ当たりでレス つけちゃったんだ。 ごめんなさい…
バカはすっこんでろ
その本の名前さ、『C++が糞言語になった理由』のほうが良くない?
理由を述べよ
情報処理技術者試験受けるなら何が良い?
監査
>>309 たかが言語をそんなにこわがる必要は無いと思いますが :-P
なんでstringってbeginとendはあるのにfrontとbackが無いの? ビヤーソの気まぐれ? frontは別にいらんけどbackは有った方が便利でない? s[s.size()-1]よりはs.back()の方が便利でしょ?
>>314 それ、s.size() == 0のときにアウトですけど。
で、s.size() == 0のときにs.back()はどうなって欲しい?
s.back() == s.end()になるんだったらどっちみち使い難いし、例外吐くのも違う気がするでしょ?
だから敢えて実装しなかったんでない?
0がいいです
vectorの末尾に要素をたくさん一気に追加したい場合、 vec.insert(vec.end(), datastart, dataend); copy(datastart, dataend, back_inserter(vec)); どちらが効率がいいですか?
現在、情報処理2種を持っています。 1種受けようとしたらなくなっていました。 次に情報処理技術者試験受けるなら何が良いでしょうか?
>>317 std::back_inserterは内部でpush_backを呼んでるから、
insertの方が最適化の余地が大きいとはいえると思う。
効率気にするならreserveを試してみたらどうだろう。
つーか、やってみてベンチとったほうがはやそうだが。 結局コンパイラとライブラリの実装によるんじゃね?
insert の方が早いに決まってるだろ
>>317 sourceがrandom access iteratorの場合にはinsertが領域確保を
1度で行っている可能性があるから、insertの方がマシそう。
323 :
デフォルトの名無しさん :05/01/31 18:16:13
std::vector<int> vec; std::vector<int>::iterator it,itend; vec.push_back(0); vec.push_back(1); itend=vec.end(); for(it=vec.begin();it<itend;it++) { vec.erase(it); } 要素が全部消えるときに落ちてしまいます。 何がいけないのか教えてください。 環境はVS.net2002です。 お願いします。
>>323 vectorは要素を追加したり削除するとそれまでのイテレータは無効になる。
>>323 erase(it)の後はitが無効になるから、
it = erase(it);
とすると良い。
それから、eraseによってendが変化するかも知れないのでので、
itendも無効になる可能性がある。
よって、
for(it=vec.begin(); it != vec.end(); ++it)
{
it = vec.erase(it);
}
>>323 erase したら it 使ったらアカンよ。
vec.clear();
vec.erase(vec.begin(), vec.end());
327 :
デフォルトの名無しさん :05/01/31 18:47:56
323です。 皆さんありがとうございました。
>>315 何いってんの?
vectorでもlistでもs.size() == 0の時アウトだろ。でも実装はされてる。
330 :
デフォルトの名無しさん :05/01/31 21:49:16
配列→vectorへの変換はどうすれば良いでしょうか? 例えば、 int a[50]; を vector<int> b; のbに入れるための最も効率的な方法は何ですか?
>>330 b.resize(50);
memcpy(&b[0], a, sizeof(int)*50);
podならinsert(end()…)でも勝手にmemcpyしてくれるんじゃないんだろうか。
>>332 insertじゃ元のが消えないからassignな。
みんな意地悪だねぇ
>>330 int a[50]; vector<int> b;
b.assign(a, a + sizeof(a) / sizeof(a[0]));
または
b.assign(a, a + 50);
335 :
デフォルトの名無しさん :05/01/31 22:42:38
>>331-334 教えてくださってどうもありがとうございます。
b.assign(a, a + 50);
が一番自然な気がしました。
これが思い付かなかったのですorg
>>335 effective stl読んだ方がいいかと
337 :
デフォルトの名無しさん :05/01/31 22:51:07
>>336 一応持っているのですが、第16項にそれらしいことが書いてありますね。
どちらかというと第5項かな?
339 :
デフォルトの名無しさん :05/01/31 23:04:59
>>338 なるほど。
実装上はイテレータがポインタは同じものである、ということを知った上で
第5項を読めば良いわけですね。
初心者にご丁寧にしていただきありがとうございました。
「実装上は」じゃないぞ、むしろ「使用上は」だ
>>340 どういうこと?
イテレータの実装にポインタ使ってるんだろ。
今後イテレータがポインタじゃなくなっても文句は言えないってことだな
つーか今でもイテレータがポインタじゃない実装はある。
345 :
デフォルトの名無しさん :05/02/01 00:38:42
listとvectorでは前者の方が要素の追加・削除を頻繁に行う場合には速いと聞いたんですが、 両者それぞれのオブジェクトでpush_backとpop_backをたくさん繰り返して時間を計測してみると、 明らかにvectorの方が速いようなんですが、これはどういうことなんですか?
リストの途中へのinsertや途中要素のeraseはlistの方が早い 末尾への追加削除はvectorの方が早い
347 :
デフォルトの名無しさん :05/02/01 00:44:07
そりゃオデレータ
スレ違いであればすいません。 あるクラスのメンバ関数で定義したスレッド処理関数を、_beginthreadex関数などで呼び出すことはできないのでしょうか? VC++6.0でコンパイル時、error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 というエラーが出てしまいます。 具体的には以下のようになります。 class ClassA{ HANDLE hThread; /* スレッドハンドル */ WORD dwThreadID; /* スレッドID */ UINT WINAPI ThreadFunc( void *Param ) /* スレッド処理関数 */ { ・・・ }; public: void ThreadStart() /* スレッド開始用関数 */ { ・・・ hThread = (void*)_beginthreadex( NULL, 0, &ThreadFunc, /* ここがマズイようです */ NULL, 0, (unsigned *)&dwThreadID ); ・・・ }; ちなみに、このスレッド処理関数をクラスの外(グローバル)で定義した場合は、問題なくコンパイルでき実行できます。
>>349 ThreadFuncをstaticにするか、beginthreadexを諦めてboost::threadでも使え
unsinged __stdcall DummyFunc(void* Param) { return reinterpret_cast<ClassA*>(Param)->ThreadFunc(Param); } void ClassA::ThreadStart() { hThread = (HANDLE)_bebinthreadex(NULL, 0, &DummyFunc, (void*)this, ...); } メンバ関数ポインタを直接コールバック関数として渡すことは出来ない。
352 :
デフォルトの名無しさん :05/02/01 03:15:39
boostのfunctionみたいに、 function<void (const T &)> f; は function1<void, const T &> f; function<void (int, int)> g; は function2<void, int, int> g; というように、templateの数に応じて別のクラスに置き換える方法ってどうやるの?
マクロ
359 :
デフォルトの名無しさん :05/02/01 16:02:36
ofstreamで追記オープンできませんか?
できます
ググッたらios::appですた。有難うございました。
362 :
デフォルトの名無しさん :05/02/01 17:05:29
"Newmat" (C++ matrix library)では複素エルミート行列の対角化までできますか? 知っている方、教えてください。お願いします。
363 :
デフォルトの名無しさん :05/02/01 17:16:40
364 :
デフォルトの名無しさん :05/02/02 10:37:51
ofstreamにマルチスレッドでカキコしても大丈夫でつか?
ofstreamの実装によるんじゃないのかな
366 :
デフォルトの名無しさん :05/02/02 11:53:06
368 :
デフォルトの名無しさん :05/02/02 11:58:42
スレッドの概念が標準ライブラリに無かった気がするのでだめなんじゃない?
370 :
デフォルトの名無しさん :05/02/02 13:37:05
>>369 標準ライブラリのデフォはスレッドセーフ。
スレッドセーフいって言ってる香具師はソースはどこなの?
どっちなんだ〜〜
例えばVC++7.1ならヘルプの[Thread Safty in the Standard C++ Library]という項目に説明がある。 自分が使ってる処理系のマニュアル読むか、ソース辿れ。
#include <iostream> #include <boost/thread.hpp> void f() { for (;;) std::cout << "ぬるぽ" << std::endl; } void g() { for (;;) std::cout << "ガッ" << std::endl; } int main() { boost::thread th1(&f); boost::thread th2(&g); th1.join(); th2.join(); return 0; } VC7.1 結果:激しくsynchronized
ofstreamかよorz
マジレス。標準C++にスレッドの概念は存在しない。と言うことで 激しく実装依存。つまりスレ違い。
質問があります。 private継承というのは、継承元クラスでpublic/protectedだったメンバが、継承先では privateメンバとなる継承だと勉強しました。 ところが実際にコードを書いてみると、private継承をした場合に、 継承先のメンバ関数から、継承元のpublic/protectedだったメンバにアクセスできるのです。 これはどういうことなのでしょうか、教えてください・・・。 環境は、VC++.NET2003です。
>>379 オマイさんの中で何がどう矛盾してるんだ?
継承先ではprivateにちゃんとなってる。
何が疑問なんだよ
>>379 考えてみて笑ってもらいたいんだが、「private継承をした場合に、継承先の
メンバ関数から、継承元のpublic/protectedだったメンバにアクセスでき」
なかったとしたら、派生元のクラスはどうやって使われることになるんだい?
>>381 何で、親から親のPrivateを覗けるんだ?失礼だろう、
friendの使い方をまちがっとる、友達は親だけの関係だよ、
>>380 継承元でprivateだったメンバには、継承先からはアクセスできないと思っているのですが、、、
(a)継承元でprivateで、継承先でprivate
(b)継承元でpublicで、継承先でprivate
の2つのメンバがあって、(a)はアクセスできず、(b)はアクセスできるのは変だなと。
>>381 そのことも頭をよぎったのですが、まだ自分の知らない謎の機能で何とかなるのかなと思ってました。
こいつアホ?
>>383 君が「習った」と言っているのは外から見たaccessibilityの話だよ。
>>383 class Foo {
public: int Num;
};
class Bar : private Foo {
public: double x;
};
class Hage : protected Bar { };
class Hoge : public Bar {
public:
void Set(int n, double d) {
x = d; //protectedなのでOK
Num = n; //privateなのでエラー
}
};
int main() {
Bar b;
b.x = 1; //これも当然エラーになる。Numも同様。
}
>>385 外から見たaccessibilityと、中から見たaccessibilityがあるのですか!
ありがとうございました、なんとなく分かりかけてきました。
>>386 > b.x = 1; //これも当然エラーになる
b.xは、外から見たaccessibilityはpublicなので、エラーにはならないのでは?
>>387 ごめん。b.xは通る。脳内ではHogeのつもりだった。
>>376 VC7.1で混ざったぞ。どうしてくれる。
390 :
デフォルトの名無しさん :05/02/02 17:30:02
グローバル変数のstd::vectorをマルチスレッドのコールバック関数内で push_backしたいのですが、スレッドセーフでありません。 LONGならInterlockedとかがありますが、std::vectorの場合は どうすればスレッドセーフになりますか? std::vector<int> g_vec; ・・・ HRESULT WINAPI MsgHandler(・・・) { int i; ・・・ g_vec.push_back(i); ・・・ } ご助言お願いします。
>>376 ぬるぽ
ガッ
ガッ
ぬるぽ
ぬるぽガッ
ガッ
ぬるぽ
ガッぬるぽ
・
・
・
VC7.1だとこんな感じで改行が連続したりするのでロックしないと駄目
>>392 と同じレベルのバカ多すぎ
google
クリティカルセッション…324件
クリティカルセクション…856件
おい、本書いてる香具師が間違えてるぞ…
> 『Java謎+落とし穴徹底解明』の256ページに
> "クリティカルセッション(critical session)"と書かれていますが、
> "クリティカルセクション(critical section)"が正しいのでは?
そうですね。Sunの文書で、たとえばJava tutorialを見ても、
critical section になっています。
http://java.sun.com/docs/books/tutorial/essential/threads/multithreaded.html もう正直に告白してしまいますが、私はごく最近まで、これは
cirtical session だと思い込んでいました。
ちょっと前、某掲示板で「クリティカルセクション」と書いてあるのに
気付いてGoogleしてみたら、「critical section」の方がヒット数が
多い。
実は「クリティカルセッション」がこの意味で使われているページも
結構あったりしますが、今回改めて確認したところ、やはりどう見ても
critical sectionが正解ですね。
正誤表に入れておきます。
まったく、思い込みというのは恐ろしいものです。ご指摘ありがとう
ございました。
>>394 オマイな、クリティカルセッションを真顔で言う香具師がいると本気で信じてんのかと
>>388 了解しました!ありがとうございました。
#include <fstream> #include <boost/thread.hpp> #include <boost/ref.hpp> #include <boost/bind.hpp> void f(std::ofstream& ofs, int count) { for (int i = 0;i < count; ++i) ofs << "ぬるぽ" << std::endl; } void g(std::ofstream& ofs, int count) { for (int i = 0;i < count; ++i) ofs << "ガッ" << std::endl; } int main() { std::ofstream ofs("a.txt"); boost::thread th1(boost::bind(&f, boost::ref(ofs), 100000)); boost::thread th2(boost::bind(&g, boost::ref(ofs), 100000)); th1.join(); th2.join(); ofs.close(); return 0; } VC7.1 結果:??? operator<<はアトミックってこと?
それも実装依存だから帰っていいよ
なんだboostって標準C++にそんな関数ないぞ
なんだクリティカルセクションって標準C++にそんな関数ないぞ
なんだスレッドって標準C++にそんな概念ないぞ
馬鹿か?C++に標準は無いぞw
標準 C++ ISO C++ 標準規格で指定されている C++ 言語。
ただし大多数は日本在住と思われるなのでJIS X3014も可。
COMはありですか? VC6 でMSXML使ってます。 XML形式の書き出しは何とかできたんだけど、出力が1行になっちゃいます。 複数行に出力されるようなフラグとかあるんですか? 現状 <?xml 略?> <root><a><b>text</b></a></root> 理想 <?xml 略?> <root> タブ1個<a> タブ2個<b>text</b> タブ1個</a> </root>
なしです
409 :
デフォルトの名無しさん :05/02/03 00:38:23
ファイルを検索する場合、Win32ではFindFirstFileとか使うけどコレだとLinuxでコンパイルできない。 C++標準ライブラリではファイル検索はサポートされているのでしょうか? #つまりC++標準ライブラリで移植性が得られるのでしょうか
410 :
デフォルトの名無しさん :05/02/03 00:42:56
>>409 いいえ。
ファイルシステム関連は環境依存です。
なぜなら、実行環境がファイルシステムを持たない場合も考えられるからです。
クマー
412 :
デフォルトの名無しさん :05/02/03 00:46:37
×なぜなら ○また
ナシカヨ。どこかスレあれば誘導plz
>>415 さんく。行ってくる
std::pairがコピーコンストラクタは書いてあるのに、代入演算子は書いてないのはなぜですか?
>>417 各メンバのoperator=を呼ぶコードをコンパイラが勝手に作ってくれるから。
419 :
デフォルトの名無しさん :05/02/03 13:37:34
メンバがpublicだからですね!!!
>>418 >>419 コピーコンストラクタが書いてある理由は何でしょうか?
試しにコピーコンストラクタとテンプレート版コピーコンストラクタ?を消してみて、
pair<int, ini> pair1(0,0);
pair<int, int> pair2(pair1);
とやってみたところ、問題なく動いてるように見えるのですが・・
421 :
デフォルトの名無しさん :05/02/03 14:46:48
>>420 > 問題なく動いてるように見えるのですが・・
本当に?嘘付いたら10000回殴って針を1000本飲んでもらうよ?
>>420 コピーコンストラクタがないと、デフォルトコンストラクタ→operator=と呼ばれて無駄ができるからだろ、多分。
(・∀・)
pair<char*, char*> さあコピーコンストラクタ消して使いまくってくれ
template <typename T> class C { public: explicit T(T const & source) : ptr(boost::addressof(p)) {} T const & operator=(T const & source) { this->ptr = boost::addressof(source); return *this->ptr; } private: T const * ptr; }; int a; C<int> ca(a); a += 2; とかやったら、C<T> に operator+= やらがないって怒られるわけだが、 これってどうにかして回避できない? 基本形は特殊化で対応すればいいけれど、T が operator+ を持ってた場合とかは どう対応すればいいんでせう?
>>426 うまくいえないんだけど、なんだかひどく間違っているような気がする
>>421 そ、そこまで言われると自信ないです。
>>425 ポインタの場合、同じ領域を2つのpairが持つことになってまずいということでしょうか?
でもpairのコピーコンストラクタって、
pair(const pair& p)
: first(p.first), second(p.second)
{ ; }
これだけなんですよね。
これでは、書かない場合と同じだと思うのですが、私の理解が間違っているのでしょうか?
コピー・コンストラクタを明示的に書くことで、 コンストラクタのない、あるいはprivate/protectedになっていて呼び出せないクラスが 要素になることを防止する、というのはどうだろう?
>>428 ちなみに vc7.1 についてる stl だと、
std::pair のコピーコンストラクタはコンパイラ自動生成のものですよ。
>>429 なるほど。
>>430 環境によって違うんですね。
ちなみにbcc5.5でした。
あまり気にしなくて良さそうですね。
皆様ありがとうございました。
425の意味がわからない。
pair<char*, char*>("うるせーよ", "糞ども");
438 :
デフォルトの名無しさん :05/02/04 05:06:53
無名namespaceとstaticはどういう風に使い分けたらいいですか?
使い分けるも何も無名namespaceだけでいいだろ。
>>438 ファイルローカルと言う意味なら、基本は無名namespace。
内部リンケージであることが重要ならばstatic。
>440 なんでそんな使い分けが必要?
442 :
デフォルトの名無しさん :05/02/04 09:30:55
あげ
髭がなくなってる・・・ ていうか若い!
逆コンパイルってどうやるんだ?
>>438 無名namespaseにするのが原則。
staticを関数・クラス内の静的変数・関数の指定の役割だけにするために無名namespaseが作られたのだから。
クラスのメンバ変数の値によって、返値の型を変えるにはどうすればいいの?
>>446 無理。
代わりにvoid *を引数に取るとか、テンプレートにした上でtypeidで照合するとかをやりな。
すると、演算子のオーバーロードで返値を変える方法はないということになるな。鬱だ
template+特殊化で大体のところはできると思うが。
template <typename T> class A { // 詳細省略 bool b_; public: _???_ operator=(const T &_) { if (b_) return (T型オブジェクトへの参照); else return (S型オブジェクト実体); }; }; 演算子のオーバーロードを行うとき、メンバ変数i_の値に応じて 返値の型を変えたい(参照かポインタか実体かも)。 templateの特殊化だと、Tの型に応じて(template<> class A<int>など) オーバーロードしたメソッド内での挙動を変えることができるという認識なんだけど こういう、変数値に応じて返値の型が変わる場合にも使えるの?
i_じゃなくてb_にしたんだった。 一週間くらい悩んでいるので意味不明なことをほざいてるかもしれません
MSXMLが MSX ML に見えて(・∀・)と思った MS XMLね。
vectorクラスについて質問です。 前置き: file1にはテキストが80行 file2にはテキストが60行 file3にはテキストが30行 処理: ファイルのテキストを1行ずつ読み込んでstringのvectorに追加。 読み込み終わったらそのデータに3行新たなテキストを追加し、 file1_1として出力。file2,3も同様にこれを行なう。 この処理をやろうとすると、 file2_1にfile1の内容が一緒に追加されてしまうのです。 つまりfile2_1の内容が --- file1の内容 file2の内容 追加テキスト --- になってしまうのです。 ループごとにclear()をし、追加にはpush_back()を使っています。 なぜこうなってしまうのでしょう?
454 :
デフォルトの名無しさん :05/02/04 18:20:13
>>453 streamをcloseしてないとか。
ごめんなさい。
オブジェクトの初期化をし忘れているという
単純なミスでした。解決しました。
>>454 >>455 本当にごめんなさい。ありがとうございました。
457 :
デフォルトの名無しさん :05/02/04 20:07:17
おーい、だれかアドバイスください。 44歳のおったんだが、プログラム大好きです。 仕事ではコボラーだったが、VB、Java、C、C++を 自学した。 でもって、C++をこれから先専門にやろうと思って IT企業の中途採用を訪ね歩くが、44歳からでは 無理でしょうと冷たい。 それで、独立してやろうと思うが、一人で受けら れるようなC++の仕事ってどんなのがある。 なんでもいいからヒントになるようなこと教えてください。
無い、言語指定するやつは要らない。というか、 仕事に従って言語選べるやつじゃないと使えない。
459 :
デフォルトの名無しさん :05/02/04 20:18:45
>>457 あんたが使い物になるならうちの会社で面倒見てやる。
雇用でも契約でもいいぞ。だが、言語知識しかアピールできないなら門前払いだ。
44歳なら44歳なりのアピールの仕方があるだろ?
>464 NEET乙
466 :
デフォルトの名無しさん :05/02/05 00:09:27
>>465 俺超エリート中学生。お前なら俺の子分にしてやってもいいぞ。
>>450 動的に切り替えるのは無理だし,operator=のオーバーロードもあいまいなので無理。
どういうことがしたいのかもっと具体的に例をあげて言ってみ。
>470VIPPER乙wwwwwwwwwっうぇwwwwwwwwww
c++は構造体の間接関数呼び出し、馬鹿っぽい
馬鹿っぽい日本語ですね
>>450 そのboolをテンプレート引数にして特殊化する、ってのはだめ?
>>474 コンパイル時に決定するならいいけど、動的には無理だお。
476 :
デフォルトの名無しさん :05/02/05 12:42:31
> 基底クラスのデストラクタは、public かつ virtual であるか、 > あるいは、protected かつ非 virtual であるべき。 ってどういうことですか?
>>476 デストラクタ virtual
で具ぐれ。
死ぬほど出てくるから。
>>441 現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、
大きな違いがリンケージであるから、です。
>>477 死ぬほど出てきました。
デストラクタが virtual でない基底クラスのポインタが
派生クラスを指す時に delete するとやばいから、
デストラクタを virtual にしてそんな時も安心にするか、
もともと delete 禁止にしておけってことだったんですね。
ありがとうございました。
ファイルローカルという概念は初耳だな。
君がやり直した方がいいんじゃないか?(▽
こんにちは。 namespace名の一文字目は大文字か小文字かどちらがいいでしょうか?
485 :
デフォルトの名無しさん :05/02/05 18:17:26
>>484 クラスの命名で大文字を使っているなら、大文字で良いと思う。
JavaやD風に全部小文字
>>485 レスサンクスです、クラスは大文字なので、そろえた方がいいですよね。
>>486 JavaやDは小文字なのですか、サンクスです。
>>484 頼むから、大文字Cで始めるのだけはやめてくれ。
#CWindowPosって名前のnamespaceを作った香具師がいるんだ。
##恐らく元はクラスのつもりだったのだろう。
先頭大文字だと打ちにくいんだよな…
>>488 ハンガリアン恐るべし……
490 :
デフォルトの名無しさん :05/02/05 18:59:23
ハンガリアン記法だとNか?
>>490 Microsoft のライブラリでも、さすがに namespace まではハンガリアンしてない。
代わりに using namespace しちゃってるから意味ないが(例: WTL)
>490 nsHoge ジャマイカ
キモ過ぎる MSってまだハンガリアンなの?
.NETは違うよ。
とりあえず別クラスにして逃げました>返値の型 スマートじゃないけど……。 別案件が一段落したらまた考え直します(´д`)
> 演算子のオーバーロードを行うとき、メンバ変数i_の値に応じて > 返値の型を変えたい(参照かポインタか実体かも)。 なんでそんなことをせねばならない状況になったのか詳しく
誤爆?
もうね、こんなに拡張するくらいなら、boost って言語を作ればいいんだよ。 とは、口が裂けてもいえない。
激しく誤爆スマソ...
>>496 車輪の再発明をやろうとしてました。
↑の方かtemplateスレのどこかにも過去の発明者のpdfが上がってましたが
いわゆる「propertyクラステンプレート」です。
コンストラクタで(propertyを使用する)クラスのインスタンスへのポインタと
get/set/[]/[][]/[][][]……のメソッドへのポインタをそれぞれ受けておき
operator T()のオーバーロードでgetメソッドを、
operator=(const T&)のオーバーロードでsetメソッドを、
T& operator[]のオーバーロードで[]指定を、
proxyクラス(
>>186-191 とMore Effective C++/テクニック)を使って[][]指定を
それぞれ実装しようとしました。
ところが、operator[]はデータメンバへの参照を返し、
その参照に対しget/set等を適用するわけですが
[][]の場合は一度proxyクラスを返し、
そのproxyクラスでデータメンバへの参照を返すことになります。
ひとつのpropertyクラスで[]と[][]を併用する場合、
メンバ変数(あるいはtemplateのtypenameのtypeid)の値に応じて
operator[]の返値の型を、T&かproxyクラスかを変える必要があります。
書いてて返値の型もtemplateにすればいいという気がしてきた……。
これか。
http://pc5.2ch.net/test/read.cgi/tech/1101384692/192 でも、このプロパティって、例えば
class person
{
public:
// ...
property<std::string> name;
};
int main(void)
{
person p("Name");
std::cout << p.name << std::endl;
return 0;
}
とかやると、p.name に operator<< が無いって怒られない?
こういう局面だけ p.name.get() すればいいんだろうけど、
p.name にアクセスする手法が一通りじゃないってのがすごく気持ち悪いんだけど…。
>>501 そのpdfとは実装がだいぶ違うけれど自分のコードでは
template <typename T>
ostream& operator<< (ostream &os, property<T>& t)
{
return os << T(t);
};
のように、propertyに指定した型のoperator<<を利用しています。
>478 >現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、 は理解しているつもりなのですが >大きな違いがリンケージであるから、です。 具体的にどういう違いが出てくるのかが良く分からないので 良い例があったら挙げてもらえないでしょうか?
>>502 CRTP 使って、property<T>::operator OP() を T::operator OP() に委譲できないかな。
>>503 namespace { void external() {} }
static void internal() {}
template< void (&Function)() >
void call_twice() { Function(); Function(); }
int main()
{
call_twice< external >();
call_twice< internal >();
}
506 :
デフォルトの名無しさん :05/02/08 00:12:35
正直、管理職の名に甘えて、プログラムのひとつも作れない上司に こびへつらうのって馬鹿らしい。
昔は藻前なんかより余程作れたんだろ。
>>506 は、たぶん、
そんな上司に仕える自分の能力の無さを嘆いているんだと思う
>505 非型テンプレート引数には外部リンケージを持つものしか指定できないので その違いが出ることは理解できるのですが, その例を見てもやはり無名名前空間だけで事足りるような気がします. 440で指摘されるような使い分けがなぜ必要なのかがやはり分かりません. 内部リンケージであることが積極的に必要な状況が知りたいです.
template <class T> void f(T) {} int n; f(static_cast<int&>(n)); ↑ようにキャストしても T が参照型とならないのは何故なんでしょうか? あと、 class C { public: C() {} C(const C&) { std::cout << "copy-ctor" << std::endl; } }; template <class T> void f(T t) { std::cout << &t << std::endl; } int main() { C c; std::cout << &c << std::endl; f<C&>(c); f(boost::cref(c)); return 0; } これで boost::cref は参照でわたっているにもかかわらずアドレスが 違うようなのですが、何故なのでしょうか? VC7.1
C のライブラリを C++ で書いてます。 完全に C のライブラリを隠蔽してしまいたいのですが、mylib/types.h で typedef int my_char_t; みたいなことをされています。 C++ 側のヘッダで my_char_t を使うには mylib/types.h を隠蔽してしまうしか 無いのでしょうか? 構造体みたいに extern "C" { my_char_t; } みたいな事はできない?
>>515 そのままC++側でもtypedef int my_char_t;って書けばいいだけじゃないのか?
>>516 それしかないんですね。了解しました。
ありがとうございます。
518 :
デフォルトの名無しさん :05/02/08 20:37:05
こういうことしたいんだけど、何か良い手はないものか 他によりよい手がなきゃ仕方ないけど、なるべく virtual は使いたくない template <typename wanker, typename bore> struct dipshit { void jerk(); }; template <typename wanker> inline void dipshit<wanker, int>::jerk() { } template <typename wanker> inline void dipshit<wanker, char*>::jerk() { // differs from int when char* }
>>515 > C のライブラリを C++ で書いてます。
> 完全に C のライブラリを隠蔽してしまいたいのですが、
????
何をしてるって?
>>518 部分特殊化?
template <typename wanker, typename bore>
struct dipshit
{
void jerk();
};
template <typename wanker>
struct dipshit<wanker, int>
{
void jerk() { /* int ver */ }
};
template <typename wanker>
struct dipshit<wanker, char*>
{
void jerk() { /* char* ver */ }
};
521 :
コマンドラインオプションの処理 :05/02/08 21:57:29
GNU Common C++ を使っていらっしゃる方おられますか?
http://www.gnu.org/software/commoncpp/ コマンドラインオプションのパースに便利らしいクラスライブラリが
含まれているのですが、まともなドキュメントがなく使い方が分かりません。
もし他にコマンドラインオプションの処理に便利なクラスライブラリがあったら
それを使うことも検討しています。皆さん、コマンドラインオプションの
処理ってどうやってらっしゃいます?やはり独自のパーサを作ってますか?
522 :
デフォルトの名無しさん :05/02/08 22:00:55
>>520 レスthx
main()
{
dipshit<int, int> a;
a.jerk();
// a.airhead();
}
小出しになって申し訳ないがこれもしたい
523 :
デフォルトの名無しさん :05/02/08 22:01:28
こういうことね template <typename wanker, typename bore> struct dipshit { void jerk(); void airhead() { } };
template <typename wanker, typename bore> struct dipshit_base { void airhead() { } }; template <typename wanker, typename bore> struct dipshit : public dipshit_base<wanker,bore> { void jerk(); }; template <typename wanker> struct dipshit<wanker, int> : public dipshit_base<wanker,bore> { void jerk() { /* int ver */ } }; template <typename wanker> struct dipshit<wanker, char*> : public dipshit_base<wanker,bore> { void jerk() { /* char* ver */ } };
526 :
デフォルトの名無しさん :05/02/08 22:22:06
527 :
デフォルトの名無しさん :05/02/08 22:22:55
部分特殊化は class からせよってことだよな
>514 ありがとうございます.Cとの後方互換性ということをすっかり失念してました. そこにある2番目の理由はいまいちピンと来ないですが.
529 :
デフォルトの名無しさん :05/02/11 15:21:38
MyFacet* facet = new MyFacet; std::locale loc( std::locale::classic(), facet ); この場合 *facet を削除するのは loc になりますが、loc の生成時に例外が発生した 場合は誰が *facet を削除しなければいけないのでしょうか?
boost::shared_ptr のデストラクタ時にユーザーが指定した関数 を実行するやつって auto_ptr 版ないの? デストラクタで勝手に呼び出すためだけにshared_ptr使うのは 必要以上に重いから使いたくないんだけど
> boost::shared_ptr のデストラクタ時にユーザーが指定した関数 > を実行するやつって auto_ptr 版ないの? 何言ってるか分からん……。 > デストラクタで勝手に呼び出すためだけにshared_ptr ??(´Д`) boost::scoped_ptr のことか?
536 :
デフォルトの名無しさん :05/02/11 18:43:40
>> 529 VC++ 7.1 のソースを見ると std::locale のコンストラクタで例外が起きたときは ファセットを削除する処理をしていないようなので std::auto_ptr<MyFacet> facet(new MyFacet); std::locale loc( std::locale::classic(), facet.get() ); facet.release(); // このメソッドは例外が発生しない でメモリリークは起きないと思います。
>>534 ドキュメントと実装を見る限り、どうやらこの move_ptr で
目的を達成できそうです。感謝。
しかしなんでこれが boost にまだ入ってないんだろう…便利なのに
538 :
デフォルトの名無しさん :05/02/11 20:08:17
class Sprite{...}; typedef std::multimap<float,Sprite*> SPRITES; typedef std::vector<SPRITES> LAYER; class SpriteManager{ LAYER m_Layers; void DrawSprites(); ...}; として描画をやっているのですけど、スプライトが3000個位あると 30FPS位になってしまいます。 一応クリッピングしてるのですが、重い・・・ std::multimapやstd::vectorは繰り返し処理に耐えられない位 重いものなのでしょうか? newあるいはmallocにした方が速いんでしょうか? 質問が2つになってしまって済みません。
>>538 float を double にするだけで多少は早くならない?
C/C++ 上での float はウンコだよ。
確かに float は無駄なだけ
>>539 DirectXでFLOAT多用しているから速いものだと思ってました・・・
書き損じましたが、typedef std::multimap<float,Sprite*> SPRITESの
floatはZオーダーというかdepth値です。
depthをキーとしてレイヤー1個を描画したら次のレイヤーを上書きする
という感じでやっています。
・・・depthをキーとして[スプライトを順番に描画して]レイヤー1個を・・・
で、そのZオーダーは小数である必然があるの?
>>543 あ、!それだ。有難うございます。
何で思いつかなかったのかと小一時間説教して・・・
Zオーダーの範囲が0〜255とか〜1023ぐらいならlistの配列が最速だけどな
コンソールでキーをfloatとintの奴を2つ作って試してみたけど insertのソートに時間を大幅に食って 参照自体の時間はあまり変わりませんでした。
>>546 まさか最適化してないとかじゃないだろうな。
たかだか要素3000個でmultimapがどうにかなるとも思えないんだけど。 DirectXでしょ? まずは描画方面から疑ってみれ。他スレで。
今簡単なライブラリ作ってるんですが、 こういうのって include するだけで使えるように 実装を全てヘッダファイルに書いた方が良いのでしょうか?
ケースバイケース
自分だけで使うならご自由に、 他人も使うなら定石に従って作る
定石って?
ヘッダファイルincludeするだけって出来るの? 全部inlineにするとか?
555 :
デフォルトの名無しさん :05/02/13 12:53:39
>>554 それだと static データメンバがどーしよーもなくなる
こんな理由で使うのを勧めたくはないが、使うなら template だな
>>555 int f() {}
f();
とかは
template <int> f() {}
f<0>();
とか?激しく汚いな…
boost とかはこの辺どうなってんだろ
>>556 そのテクニックはstlportで使われてた。
template <int __Inst = 0> class...
みたいに。
ちなみにその例は、f<0>をラップするinline非template関数を使えば
それなりに使えるようになると思う。
>boost とかはこの辺どうなってんだろ
boostの大部分は最初からtemplateだから問題ない。
そうじゃないところは普通のライブラリ(配布はソースで)。
>ちなみにその例は、f<0>をラップするinline非template関数を使えば >それなりに使えるようになると思う。 あーホントだ。頭が固いせいか思いつかなかった。 確かにinlineでラップすりゃ全然問題ないですね。 stlportで使われてるってことは結構有名なのかな? 何にせよすごい勉強になった。トンクス
559 :
デフォルトの名無しさん :05/02/13 14:16:12
struct a { //static float b; static float& b() { static float c; return c; } };
くだ質で申し訳ないです std::vector のシーケンシャルアクセスを行う場合 iterator による走査と添字による走査とではどちらかが速度的に有利になるんでしょうか? 添字の方がソース書く上では楽だけど,若干不利な気がしてます…
ヽ(;´Д`)ノぁゎゎ… 化けた文字列が名前欄に残ってたせいでトリップができちゃった
>>560 最適化によっては全く同じコードになることもある。
それを気にするよりも、他に気を遣うべきかと。
自分でループを書くならどっちも変わらないんじゃないかな。 for_eachを使うと内部実装に適した走査が行われる、かもしれない、 てなことがどっかに書いてあった気がする。 どっちみちvecotorなら関係ないかも。
ループに必要な変数を考える。 iterator の場合は current,end のふたつ。 添え字の場合は top,index,num のみっつ。 というわけで iterator のほうが有利といえるだろう。 極端な例じゃないと実際に差は出ないだろうけどな。
ローカルクラスなファンクタって STL 等の関数に渡せないんですか? 例えば int func() { struct Sorter : std::...{ bool operator()(..., ...) const { ... } }; std::sort(.begin(), .end(), Sorter()); } ってやるとエラーが出るんですが…(VC7.1) 何かいい方法はないでしょうか?(boost::lambda以外で)
できないからlambdaがあるんです!
だせえよな
C++のメモリ確保の方法について質問です。 例えば、UNICODEの文字列を格納するクラスustringを以下のように作ったとします。 class ustring{ wchar_t string; public: toSjis(); }; sjisを吐くときに、 ustring str=L"日本語"; cout << str.toSjis(); といった書き方をしたいのですが、 1)toSjis()内でchar*ポインタをmallocで確保して返値にしてもtoSjis()メソッドが終了後は値は保証されませんよね? 2)char* mbcsというフィールドを作って、mallocすればオブジェクトがある限りはメモリは確保されますが、 呼び出し後、必要なくなってもメモリは確保されたままですよね? メモリを解放するstr.freeMbcs()メソッドも作って、str.toSjis()の後に呼び出すとかするのでしょうか? JAVAだとオブジェクトをnewして返値にすればよかったのですが、C++ではどう書くのが定石なんでしょう?
573 :
デフォルトの名無しさん :05/02/17 13:03:22
>>572 C++ならnew/deleteを使うか、std::wstringを使うかしてください。
574 :
デフォルトの名無しさん :05/02/17 13:04:17
>>572 一番のオススメはstd::wstringかな。
575 :
デフォルトの名無しさん :05/02/17 13:45:11
>>572 std::auto_ptrに入れて返してoperator<<をオーバーロードすればいいんじゃない?
まったく関係ないけど、wstring 関係で質問。 任意のエンコーディングの文字列を wstring や wchar_t * に変換するのって どうやればできる?
577 :
デフォルトの名無しさん :05/02/17 14:24:36
>>576 キーワード
std::locale::global(std::locale("japanese"))
std::wstring wstr
std::wcin << wstr
wstr.c_str()
std::string
narrow(const std::wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
std::string result = buffer;
delete[] buffer;
return result;
}
std::wstring
widen(const std::string& input) {
wchar_t* buffer = new wchar_t[input.size() + 1];
mbstowcs(buffer, input.c_str(), input.size());
std::wstring result = buffer;
delete[] buffer;
return result;
}
たとえば、'A'0x41 なら 0x0041にすればASCIIからウニコードになる。 規則性があるならそれに従うだろ。
579 :
デフォルトの名無しさん :05/02/17 14:25:58
静的メンバ関数を複数のクラスで継承した場合、継承したクラス毎にstatic関数が用意されるの? それも何回継承してもstatic関数は一つだけ?
いや、そうじゃなくて……。 たとえば、LC_ALL=ja_JP.eucJP の時に、Shift_JIS の char 配列を wstring に変換するにはどうすればいいのかな?と。
あるclass Aのインスタンスを生成するとき、 A a; // デフォルトコンストラクタがある場合 A a(10); // デフォルトコンストラクタがない場合 A *a = new A; delete a; 等としますが、このうち最後のようにnew演算子を使用しなければならないのは どういう条件のときですか?
585 :
デフォルトの名無しさん :05/02/17 15:07:49
586 :
デフォルトの名無しさん :05/02/17 15:10:15
>>582 wchar_tを使うのであれば、文字列を扱うときは始めから一貫してwchar_tを使うようにしないと無駄な処理をしなくてはいけなくなる。
>>583 コンストラクタがpublicでないとき。
>>586 内部的には wchar_t で良いのだけれど、入力や出力の時にね…。
char 配列で持って、iconv しかないのかな。
590 :
v(^・^)v :05/02/17 16:31:12
ウソじゃないよ
>>583 その場でインスタンスを作りたくないとか、自分では作りたくなくて、
ポインタとして保持したいとき。
コンストラクタがどうとかは一切関係ない。
>>592 コンストラクタがpublicでないけどoperator newがpublicになっているクラスのことも考えてみろ。
>>591 FINAL *DRAFT* だからイイんじゃないの?
>>593 コンストラクタがpublicじゃないとnewできないよ
これはロシア人? もう何年も公開しっぱなしだよな 漢だ ISOはケチだな
んなこたーない。 class hoge { hoge(){} friend hoge* moge(); }; hoge* moge(){return new hoge;}
>>595 new 限定で生成させるときの常套手段なんだが、知らないの?
newで生成したインスタンスの場合は、どこかでdeleteしなければならない。
newで生成していない場合は、スコープが外れた後適度なタイミングでデストラクタが呼ばれる。
{
A a;
...
} // OK, インスタンスaのデストラクタは自動で呼ばれる
{
A *p = new A;
...
} // NG, pが指すインスタンスは消滅しないので、delete p;が必要
■new使用したいとき
1. その場でインスタンスを作りたくない
2. ポリモルフィズムを利用したい
3. スコープ外でもインスタンスを残したい
という感じですか?
>>598 new限定で生成させなければならないようなケースってどういうときですか?
4. C++BuilderでVCL等Delphi型クラスを生成するとき
602 :
デフォルトの名無しさん :05/02/17 17:42:09
>>597 friend 使ったら、private もなにも関係ないじゃん。
>>593 placement new じゃない new も OK なの?知らなかった。
解決しました 不親切なアドバイスに感謝します
C++ Primer読んだ人いますか? 俺は買ったものの、でかすぎて読んでない orz
>>609 3を買ったけど同じくあんまり読んでないorz
C++ Primerのいいところは細かいところまで書いてある辞書的なところだが
悪いところは辞書的なくせに章毎の最初から読まないとサンプルソースがわかりにくいところだと思う。
ところでEffective C++を読んでて
AWOV=Abstract w/o Virtualsってのがでてきたんだけど、w/oって何ですか?
without
douitashimashite
ruby!
615 :
デフォルトの名無しさん :05/02/21 14:21:14
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/index.shtml 「C++はなぜ人気がないのか」
に書かれてある、テンプレートの記述に関してなんですが
> C++では「vector」などと宣言したコレクションにはPersonクラスのオブジェクトが
> 直接格納されるのに対し,Javaでは以前のコレクションと同様にオブジェクトへの参照が格納される。
> このため,メモリー使用量が減ったりシーケンシャル・アクセスが高速になるといった効果は期待できない。
というのがわかりません。
直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
シーケンシャル・アクセスが高速になるのでしょうか?
コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。
>>616 物理的にメモリ上で連続してればそれだけCPUのキャッシュにヒットする確率が高くなる。
最近のCPUではいかにキャッシュミスを減らすかが高速化の鍵なのでクリティカルな状況では絶望的な差になりかねない。
>>615 > 直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
> シーケンシャル・アクセスが高速になるのでしょうか?
> コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。
直接格納だとオブジェクトだけ格納すればいいから。
オブジェクトへのポインタが要らないので、その分のメモリも要らない。
ポインタでなくオブジェクトそのものを配列に確保できると、オブジェクトが一続きの
メモリ領域に置いてあることが保証できるので、シーケンシャルアクセスするのは簡単。
ポインタだとあちこちの番地に飛ばなければならないことがあって遅い。
教えて下さい。 クラスAを継承したクラスBがあります。 クラスAのメンバにクラスBの型の変数を指定してもいいのですか?
>>618 文法的には可能だけど、設計的にはわりとうんこだと思うよ(ケース倍ケースではあるが)
>>615 javaの場合
hoge* vector[100];
ができても
hoge vector[100];
ができない。
代入処理ではコピーコンストラクタが呼ばれないぶん前者が早いが、
読み出しではポインタをたどらなきゃいけないうえに実体がメモリのあちこちに点在しているので遅い。
623 :
デフォルトの名無しさん :05/02/21 22:36:21
stlとboostを習いたいんですが、まずどの本を読めば良いですか? それぞれ一冊ずつ推薦してください。
modern c++ design(マジレス)
626 :
デフォルトの名無しさん :05/02/21 23:31:01
622 のような話が苦手で「隠蔽」したい人のために作られた C++ のサブセットがあるのは構わない 問題は禿がいみじくも言っていたように「言語は、それを使う人が何を考えることができるのかを決めてしまう」ことである テンプレートという素晴らしい進歩の目先の困難に負けて逆行した DQN 言語が俺は嫌い 後でいくら訂正しても馬の糞に生クリームでトッピングするようなもので根にあるものは変わっちゃいない
627 :
デフォルトの名無しさん :05/02/21 23:35:10
RISC に VM (プ
>>624 Effective STLは習い始めにまず読む本じゃないだろ
>>623 個人的にオススメは「STL標準テンプレートライブラリによるC++プログラミング 第2版」かな。
これ読んで、「C++標準ライブラリチュートリアル&リファレンス」と「Effective STL」読んだらSTLは完璧だと思う。
Boostに関しては公式サイトにあるドキュメント読みんしゃい。
boost はドキュメントが充実してる品 分かりやすい例もあるし。 Boost本を買う必要は全然無い
630 :
デフォルトの名無しさん :05/02/22 01:48:36
派生クラスのオブジェクトは基底クラスの参照に渡せると聞いたので、 以下のコードを書いてBCCでコンパイルしようとしたら、 エラーが出てうまくいかなかったんだが、どうしてよ? #include <iostream> #include <string> using namespace std; class DataA{ int a; string b; public: DataA(int a,string b){ this->a=a; this->b=b; } }; class DataB:DataA{ float c; public: DataB(int a,string b,int c):DataA(a,b){ this->c=c; } }; void func(DataA&); int main(void){ DataB b(3,"hoge",3.4); func(b); return 0; } void func(DataA& data){ cout<<"test"<<endl; }
632 :
デフォルトの名無しさん :05/02/22 01:50:40
>>631 警告 W8032 派生と参照.cpp 24: 1 番目のパラメータ(func(CDataA &))のために一時変数を使用する(関数 main() )
エラー E2064 派生と参照.cpp 24: 'CDataA &' は 'CDataB' では初期化できない(関数 main() )
エラー E2340 派生と参照.cpp 24: 1 番目のパラメータは CDataA & 型として定義されているので CDataB 型は渡せない(関数 main() )
警告 W8057 派生と参照.cpp 30: パラメータ 'data' は一度も使用されない(関数 func(CDataA &) )
*** 2 errors in Compile ***
>>630 - class DataB:DataA{
+ class DataB:public DataA{
ありがとう。 すまん、うっかり忘れてた……。
だな。private継承(デフォルト)はa-kind-ofではなくなるので、メンバのアクセスレベルが 基底クラスとは異なってきてちまいまちゅ。
>>636 そう思うなら君の「胡散臭くない」private継承の意味をここに書いてみろ。
これだからOOP初心者ってのは困る。
638 :
デフォルトの名無しさん :05/02/22 02:32:30
派生クラスのオブジェクトを渡した基底クラスの参照からは、派生クラスにのみある関数は呼べないのか?
>>638 dynamic_castが成功すれば呼べる。もうちっと勉強せい。
C++って想像以上に奥が深いな……。
>>641 結果と理由という話をしてるんじゃない。
結論だけを言いたまえ。同じ事だろ。
それに仮想関数がprivate継承でまともに使えるのかい。
現場に携わった経験がない頭でっかちはこれだから・・・・・・・
>>642 > 結論だけを言いたまえ。同じ事だろ。
同じことを
>>635 にも言ってやれよ。
> それに仮想関数がprivate継承でまともに使えるのかい。
private継承に限って仮想関数が使えなくなる理由でもあるのか?
あんたの言う「まともに」っていうのがごく狭い意味なら、心当たりはあるが。
自分の知らないことは存在しないっていう思考は楽で幸せだよな。
hemamuはDQN。 LOOPiT時代、京大中退だと嘘をついていた。 たいしたスキルのない厨房だな、ありゃ。
>>644 C/VC以外の言語は無知に等しいしな。
「出来る」事と 「やっていい」事は 等価ではありません
>>643 >private継承に限って仮想関数が使えなくなる理由でもあるのか?
怒りに任せてあまりでたらめな事を書くんじゃないよ。private継承したクラスで
仮想関数をオーバーライドしようとしたら、デフォルトで基底クラスの仮想関数
は隠蔽されてしまうぞ。
もう、発言すればするほど君の無知が晒されるだけ。恥ずかしいから、どっか
他の所に行って一人でやってて下さい。
wav→wma ってことで悩んでおります。 どこかにソース落ちてませんかね?
裏で WM8EUTIL.EXE 走らせたら?
「vector」つう単語はどこから来たんだ? 数学や物理でいう「ベクトル」とは全然違うよな?
>>651 >数学や物理でいう「ベクトル」とは全然違うよな?
ほんのちょっと似てると思わんか?
vectorにA one-dimensional array(1次元配列)という意味があるからじゃ?
NULLをdeleteすると弊害ありますか?
何も起こらないと決められています
>>655 ありがとう。これでタイプ数減らせるわ。
657 :
デフォルトの名無しさん :05/02/22 21:23:26
>>647 アクセス指定子はオーバーライドのセマンティクスに影響しない
>>657 能書きはいいから、使い方の例を一つ書いてみろよ。何の役に立つというんだ?
>>657 「オーバライドは継承のアクセスレベルによって意味が変化する」だろ。
public継承でない継承で仮想関数を使う例はマ━(゜∀゜)━( ゜∀)━( ゜)━( )━(゜ )━(∀゜ )━(゜∀゜)━ダ????
660 :
デフォルトの名無しさん :05/02/22 21:55:51
>>659 ダウンキャストはオーバーライドに至る以前の別な問題だろうがアフォ
>>660 だから、誰もダウンキャストして使うと言ってないだろ。アホ
糞レスでいちいちageんな。目障りだし。
663 :
デフォルトの名無しさん :05/02/22 22:05:50
>>663 ふんふん、dynamic_castで派生クラスへのポインタまたはリファレンスを基底クラスの
それに変換して、それとprivate継承はどんな関係が?
当然private継承はis-a関係ではないから、下のプログラムのdynamic_castは失敗する。
#include <iostream>
class Base {
public:
virtual void f() const { std::cout << "Base" << std::endl; }
};
class Derived : private Base {
public:
void f() const { std::cout << "Derived" << std::endl; }
};
int main()
{
Base* bp;
Derived* dp = new Derived;
bp = dynamic_cast<Base*>(dp);
if (bp)
bp->f();
else
std::cout << "dynamic_cast失敗" << std::endl;
}
>>659 class Base
{
public:
virtual void foo() const { cout << "Base::foo()\n"; }
};
class Derived : private Base
{
public:
void foo() const { cout << "Derived::foo()\n"; }
static void test()
{
const auto_ptr<Base> test(new Derived);
test->foo();
}
};
ただし、上のプログラムに dp->f(); を加えた場合、f()は仮想関数としてオーバライドされる。静的にリンクされる事はない。
667 :
デフォルトの名無しさん :05/02/22 22:19:14
>>664 オーバーライドできたか否かと何の関係が?
>>624 >>625 >>628 Effective STL―STLを効果的に使いこなす50の鉄則
Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術
STL―標準テンプレートライブラリによるC++プログラミング 第2版
C++標準ライブラリチュートリアル&リファレンス
お前らありがとう。上の4冊買わせていただきました。
17000円ぐらいしたが、な、泣かないぞ。
高い金出した分は読んで取り戻す!
>>667 オーバライドは出来るが、一般的に言う多相化原則は働かない。
それにしても
>>665 のような変態的な書き方は初めて見たなあ。こういう書き方を
すれば、private継承でもポリモーフィズムが働くんだ。
Template Methodもprivate継承でできるようだけど。 #include <iostream> class A{ public: void work(){ foo(); bar(); } virtual void foo()=0; virtual void bar()=0; }; class B : private A{ public: void doo(){ work(); } virtual void foo(){ std::cout<<"foo\n"; } virtual void bar(){ std::cout<<"bar\n"; } }; int main(){ B b; b.doo(); return 0; }
うわーこれ通る。気持ち悪い。 class Base { public: virtual void f() const { std::cout << "Base" << std::endl; } }; class Derived : private Base { public: void f() const { std::cout << "Derived" << std::endl; } void h() { Base* bp = new Derived; bp->f(); Base* bp2 = new Base; bp2->f(); delete bp2; delete bp; } }; int main() { Derived d; d.h(); }
しまった、Base のデストラクタが仮想じゃなかった。恥ずかしい。
ちなみに、
>>665 みたいな使い方はあまりないとは思いますが、
friend を使って特定のクラス、関数内でのみ
ポリモーフィズムを使うという話はどこかで見た気がします。
class Base
{
public:
virtual void foo() const { cout << "Base::foo()\n"; }
virtual ~Base() {}
};
class Derived : Base
{
public:
void foo() const { cout << "Derived::foo()\n"; }
friend void bar();
};
void hoge(const Base& base)
{
base.foo();
}
void bar()
{
Derived d;
hoge(d);
}
>>675 なるほど、クラス内部でfriend宣言する事により、内部のスコープがそのまま
bar()にも適用可能、と。
677 :
デフォルトの名無しさん :05/02/22 22:59:39
>>669 struct a { virtual void b() = 0; };
struct b : private a { static a* c() { return new b; } };
main()
{
a* d = b::c();
d->b();
}
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
>>677 うっせハゲ。
ポール・アンダーソン+ゲイル・アンダーソン著
最新ANSI C++オブジェクト指向プログラミング11.7 非公開派生 P616に書いてあったんだYO!
文句言うならこいつらに言え。
680 :
デフォルトの名無しさん :05/02/22 23:11:04
>>680 これならいいだろ。
struct a {
virtual void b() = 0;
virtual ~a() {}
};
struct x : private a {
static a* c() { return new x; }
void b() { std::cout << "Derived" << std::endl; }
~x() {}
};
int main()
{
a* d = x::c();
d->b();
delete d;
}
private継承を使うより、包含を使った方が良い例がおおいけどな。
しかし目から鱗が落ちたな。すっかり考え違いをしていたよ。 外部からは非公開になるものの、クラス内部ではprivate:以外のメンバは そのまま使えるって事を忘れていた。もちろんもう一度継承すると、今度は 全く見えなくなってしまうが。
>>678 このスレで「ハゲ」は褒め言葉なんじゃないの?
>>684 実際、C++やってたら頭が禿げそうだよ・・・
先生がどの時期に禿げ始めたのかによって 禿げるポイントが決まってくる
>>687 よくわかった。正直スマンカッタ。感情的になっていたのは俺の方でした。
689 :
デフォルトの名無しさん :05/02/23 06:07:54
構造体の継承に関する質問です。 構造体Parentとそれを継承したChildについて、 C++の場合は struct Child: public Parent { int child_data; }; という感じで書くわけですが、これをCの方法で typedef struct _Child { struct Parent parent; int child_data; }Child; と書いたとき、両者のメモリフィールドは同じになるのでしょうか。 gccで両フィールドをsizeofではかったところ同じでしたが、 必ず同じだという保証はありますか?
690 :
689 :05/02/23 06:11:09
gtk+というGUIライブラリを使っているのですが、 これはCで作られており、構造体の継承を後者のような形で行っています。 この場合Childのインスタンスを生成した後、Parentのメンバにアクセスするには child.parent.parent_dataのように書く必要があり、非常に煩雑なわけです。 前者のC++の継承だと、child.parent_dataのように親クラスのメンバに直接アクセスでき、便利なわけです。 ただこのようなインフォーマルな方法がはたして保証されるかどうか心配なのです。
>>689 保証はない。
Parent& p = child.parent;
ぐらいでがんばれ。
gtk+ のことは良く知らないけど、
Child を扱うコードがC++だけなら、
C++スタイルの継承が使えるんじゃないか?
>>689 > typedef struct _Child
ここは _ を外して struct Child で頼む。
まず _C〜 が予約された名前であることと、
あと struct Child; で前方宣言できるように、ってことで。
どうもありがとうございます。 C++からプログラミングを始めたので、Cはどうも苦手なんですよ。 それでC++風に書けないものかと思ったわけで。
つーかgtk+をC++で使いたいなら素直にgtkmm使ってりゃいいだけだと思うんだが。
>>694 gtkmmを使うとライブラリなどへの依存性が強すぎて配布が難しいと思う。
もっと気軽に使えるC++ラッパーってないのかな… 自分で作るぐらいならGTK+をそのまま使うし…。
>>693 オブジェクト指向を理解していればどんな言語でもプログラミングできると思うが。
できると面倒臭さは別物
面倒臭さを面白臭さと読んだ俺にはできないと思う。
701 :
デフォルトの名無しさん :05/02/24 11:35:37
class T{...}; T t; delete t; これは大丈夫ですか
全然ダメ
あ、delete &t; でした
全然ダメ
どうしてもdeleteしたいんです
できません
>>706 ぶは、人工無能吹いた
この書き込みは僕じゃないですよ
木構造のクラスをルート側のノードをdeleteすると再帰的に
葉方向のノードもdeleteされるように書いたんですが
その時にふと疑問に思ったんです
hoge.h inline void hoge { class local { public: local() { 前処理 } ~local() { 後処理 } }; local raii; return 処理; } のようなことをやっていたんですが、これだと hoge.h を 複数の翻訳単位で include したときにリンクエラーが 出てしまいます。何かいい回避方法はありませんでしょうか?
inline とれ
分割コンパイルでググれ
フォルダを開くダイアログの事で質問です。 開くフォルダを指定しない状態ではうまくいったのですが(どこかのホームページから書き写した)、 開くフォルダを指定しようとすると、コールバック関数の呼び出し部分でエラーが出て困っています。 bi.lpfn = BrowseCallbackProc;←BFFCALLBACK型に変換できないと言われます。 bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;これでもダメでした。 なんか方法があるのでしょうか。
>>712 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
です
スレ違い
>>714 試してみたところ、ローカルクラス自体は複数回定義されないのですが
ローカルクラスのコン(デ)ストラクタ、が複数回定義されているようです。
>>701 がしたいのはこういうの?
struct T
{
void* operator new(size_t,void* p)
{
return p;
}
};
T t;
t.~T();
new (&t)T;
>>717 いえ、単にnewで生成してないインスタンスをdeleteできるかってことです
局所変数のコンストラクタとデストラクタの処理でしょ。 自明
class T{...}; void anyFunction() { { T t; // ここから必要 ...; ...; } // この先不要 ...; ...; }
>>718 newで生成していないインスタンスは、スコープから外れたあと、
適度なタイミングでデストラクタが呼ばれ死ぬ。
・引数で与えられる一時オブジェクトは関数から抜けるとき
・return valueで与えられる一時オブジェクトは、その呼び出し文が終わるとき
・ブロックの中で構築されたインスタンスは、ブロックが終了するとき
それぞれ消滅する。明示的にdeleteする必要はない。
> 木構造のクラスをルート側のノードをdeleteすると再帰的に
> 葉方向のノードもdeleteされるように書いたんですが
new/deleteを使うなら、ルート側のノードに、子ノードへのポインタlistを持っておく:
list<cnode *> children;
cnode* add_child() {
cnode* child = new cnode();
children.push_back(child);
return child;
}
ルートノードのデストラクタで、子ノードをdeleteする:
~cnode() {
for (list<cnode *>::iterator it = chilren.begin(); it != children.end(); ++it)
delete *it;
}
みたいにするのかな。生ポインタが危険なら、shared_ptrなどを検討。
予想される追加質問: 以下のような場合は? void anyFunction() { T t1; ...; T t2; ...; ...; // ここで t1 を消したい ...; // ここで t2 を消したい } 予想される回答: ・new/delete すればええやん ・T にデストラクタ相当のメソッドを追加して、不必要になったらそれを呼ぶ
>>709 hogeがクラスのメソッドだったら、ローカルクラスをネストクラスに
すれば問題が回避出来るみたい。
class Hoge
{
class nest {
public:
nest() { /*前処理*/ }
~nest() { /*後処理*/ }
};
public:
void hoge
{
nest raii;
return 処理;
}
}; // Hoge
今のままだと、localを外に出すしかないのかなぁ?
名前がかぶりそうだったら、namespaceに閉じ込めるとかして...
継承とdelete周りの質問です。 クラスAとそれを継承したBがあるのですが、Bは頻繁に生成・削除されるため、 operator newとoperator deleteを書き換えようと思いました。 他にも頻繁に生成・削除されるクラスがあるために共通化したMemoryPoolクラスを 作成し、それを継承したクラスはこのメモリプールを用いてメモリを確保するようにしています。 大体下のような感じです。 template<typename T> class MemoryPool{ void* operator new(size_t){〜〜}; void operator delete(void*){〜〜}; }; class A{〜〜}; class B : public A , public MemoryPool<B>{〜〜}; ここで、Bのインスタンスを生成するときにはnew BとするのでMemoryPool::operator newが 呼ばれるのですが、その後ポインタをA*に代入してdeleteするとAのoperator delete(当然 何も作成してないのでデフォルトのoperator delete)が呼ばれてしまいます。 ここでMemoryPool::operator deleteによってメモリを解放させたいのですが、 何かいい方法はあるのでしょうか? operator deleteが仮想関数として定義できないのが原因なら、 virtual void A::Delete(){ delete this;} void B::Delete(){ ~B(); operator delete(this);} みたいに仮想関数内でdeleteしてしまおうかと考えているのですが、delete thisが不安です。 よろしくお願いします。
オブジェクトを複数個作れます。配列のように扱ったり?
727 :
デフォルトの名無しさん :05/02/24 21:21:24
オブジェクトを複数個作れます?配列のように扱ったりできますか?
配列のようにという意味次第だな。
ん?俺? MemoryPoolは static T m_Array[10]; みたいに先に10個分ぐらいメモリを取っておいて、operator newでは 使われていないやつへのポインタを返す仕様になってます。
delete this; ってMFCとかCOMでは普通に使ってるけど、言語的にはどうなんだろうね? 実装依存だったりするのかな?
>1にあったC++ FAQ Liteを見るとそれ以降thisを使わない(当然メンバ関数も呼ばない) んならよさそうな感じだったんですよね>delete this
delete thisってできないと結構不便な気がしなくもない。
>>716 それにinlineつければいいんじゃないの
734 :
デフォルトの名無しさん :05/02/24 23:14:40
>>730 イベントとか FIFO で管理するんならありだろ
>>725 ttp://www.kuzbass.ru/docs/isocpp/special.html#class.free 12.5 -4- に、 virtual デストラクタを持つ型のポインタに対して delete した場合には、
派生先の operator delete が有効になるようなルールが書いてある。
おそらくこのルールのために、 gcc では
通常の破棄処理を行うだけのデストラクタと、
最後に operator delete を呼ぶデストラクタの2つがコード生成される。
A の operator delete が呼ばれると言うことは、
デストラクタに virtual が付いてないか、
::delete b; してるか、コンパイラのバグか
ってところじゃなかろうか。
お、うまく行った。 もともとデストラクタをAもBもMemoryPoolも定義してないのが原因でした。 Aに仮想デストラクタを作成したところ、B内のMemoryPoolのoperator deleteが 呼ばれました。 ちなみに環境はVC++6。 どうもありがとうございました。 もっと勉強しないといかんな・・・
ちょっと初心者的な質問なんですけど、 スレッドを作成する場合 DWORD dwID; CreateThread(NULL,0,Threadfnc,??,0,&dwID); void WINAPI Threadfnc(Void) { ・・・ } ↑の簡単な作成プログラムがあったとします。 Threadfncの引数をvoidにしたい場合CreateThreadの引数??には どんな引数を書けばいいのでしょうか? 宜しくお願いします。
739です。 書き方に間違いがあったので訂正します。 ちょっと初心者的な質問なんですけど、 スレッドを作成する場合 DWORD dwID; CreateThread(NULL,0,Threadfnc,??,0,&dwID); DWORD WINAPI ThreadFunc(LPVOID) { ・・・ } ↑の簡単な作成プログラムがあったとします。 Threadfncの引数をvoidにしたい場合CreateThreadの引数??には どんな引数を書けばいいのでしょうか? 宜しくお願いします。
voidは値じゃないので渡せません
CreateThread の引数に渡す関数の引数は void じゃありません。
744 :
デフォルトの名無しさん :05/02/25 12:37:00
質問です。次のようなクラスがあったとします。 class Class{ long a; long b; }; このとき、&a+4は必ずbのアドレスと等しくなるという保証はありますか? とある構造体をクラスに取り込みたいのですが、 メンバがメモリ内でどのように配置されているのかが分からないのです。
>>744 ない。
って言うか、激しく間違った方向を向いている。
>>744 余りにあほくさいが、&bなら&a+1だろ。
すいません、char*のキャスト書くの忘れてました。
もう少し詳しく教えて欲しいのですが。 構造体なら、続けて書いた二つのメンバは、メモリ上でも連続してますよね。 クラスの場合連続しない理由とかってあるんでしょうか。 たとえばCPUによってはメモリアロケーションの最適化のため、 char型でも4バイト領域を使ったりすることがあるらしいのですが、そういうことですか?
>>747 それ以前の問題。
メモリ内の配置なんて気にする必要はない。
どうもありがとうございます。 そこを読んで勉強します。
>>744 メモリ内での配置を意識したプログラミングをして、コンパイラのオプションや
リビジョンの違いごとに問題が無いかを検証する手間をかけるくらいなら、
配置を意識しないプログラミングをする方がずっと効率がよい。
まさしくその、違いを吸収する部分のプログラミングをしているんです。
激しく間違えてる気がする
ちなみにC++ではstructとclassの違いは、 無指定の場合publicになるかprivateになるかということだけ。
>>744 悪いこと言わないから、もうちょっと冷静に考え直せ。
詳しく状況を書いてくれたら、オジサンが設計してあげるから。
君はとんでもない勘違いをしていると思うよ。
異なるシステムでバイナリデータ交換する時以外、 変数の物理的配置なんぞ意識しちゃいけないよ。 そのための高級言語だろうが。
>>744 class Class{
long a;
long b;
};
と
struct Struct{
long a;
long b;
};
なら
Class A;
Struct B;
A.a = B.a;
A.b = B.b;
OK?
>>751 こういう人にそういうサイトを紹介すると
「理解できてないけどなんか動くモノは作れる」タイプの人間になってしまうのではないか、と
最近新人教育に携わっている者としては不安でしかたがありません。
指定したウインドウハンドルをアクティブにするにはどの関数を 使ったらよろしいでしょうか?
スレ違い
>>761 スレタイ読めよ。標準C++って書いてあるだろ。
確かに、キワドイ事をしてナントカ動いているプログラムを作成し、それがスゴイことだと勘違いされると困りますね。 余計な親切だったかしら? でも、探そうと思えば誰でも探しだせる情報ですし、それを薬とするか毒とするかは本人次第ってことで...
ちょいと教えて欲しいのだが。 stlの<algorithm>のfindは便利でよく使うのだが、後ろから探してくれるようなのは無いんだろうか。 reverse_copyしてからfindするのも、findを繰り返すのも無駄な気がしてね。
>>766 find(reverse_iterator〜
>>767 おー、面白い。reverse_iteratorを渡すと、ちゃんとreverse_iteratorが返ってくるのね。
#当たり前なんだけどさ。
名前は知ってたけど、こりゃ便利だわ。<reverse_iterator
THX!
>>768 名前が名前だからとっくに調査済み。でもありがと。
ちょっと質問。 「タンパク質」を急いで書いたとき、間違えて 「タンパタ質」って書いちゃったことってあるよね?
>>771 んな事ないけど、ヘモグロビンをホモグロビンと書いたことはある…
タンパク質を急いで書いたら蛋白質になっちゃった。 #誰だ勝手に学習させたのは。
いや、タンパク質を間違うとしたら腕白膣だろ。
よく、お笑いの2人組みが足踏みして、 アラタケタイ! アラタケタイ! って言ってるけど、どういう意味?
アルアルタンケンタイ! アルアルタンケンタイ! って言っているんだろ。
ぼけろや
>>775 「俺、アラン・ケイとしたい!」がなまったもの。
>>778 アラン・ケイだけに雑談(small talk)したい、なんてな。
・・・すまん。どうしても言いたかったんだ・・・。
上手いけどそれオヤジギャグなのよね…
781 :
デフォルトの名無しさん :05/02/26 22:06:47
pictureBoxのclickイベントがありますよね。 クリックした場所の座標を調べる方法ってあるのでしょうか?
>>781 標準C++だけではそんなこと出来ません。
質問です。 vptr の初期化はコンストラクタで行われると聞きました。 しかし、グローバルオブジェクトに関しては 仮想関数のアドレスはリンク時に静的に確定できるような気がします。 何故このような仕様になっていないのでしょうか? わけあってグローバルコンストラクタが使用できない環境(.ctorがない)での開発を行っているのですが、 この場合、仮想関数を含むクラスのオブジェクトを グローバルに置くこと (もちろんコンストラクタが呼ばれないことは承知した上で) は禁止しなくてはならないのでしょうか?
スレ間違えました…。すいませんでした。
788 :
デフォルトの名無しさん :05/02/26 22:22:29
グローバルコンストラクタってのがよくわからんが、 こういうことか? struct base { virtual ~base() {}; virtual void foo() = 0; }; struct derived : base { void foo() {} }; base* p; void top() { /* ... */ } main() { p = new derived; top(); delete p; }
>788 やはり、自前で初期化するしかないということですね。 下のように、クラスをインターフェースとして使いたかったのですが、 このときの A a; B b; の vptr くらいは ロード時ではなくリンク時に静的に初期化されていてもよいのではないか?と思ったのです。 class Interface { public: virtual void f() = 0; }; class A : public Interface { public: void f() { /* 処理 A */ } }; class B : public Interface { public: void f() { /* 処理 B */ } }; class Character { Interface *interface ; public: Character( Interface *p ) { interface = p ; } void f() { interface->f(); } }; A a ; B b ; int main() { Character Tom( &a ), Jerry( &b ) ; Tom.f() ; Jerry.f() ; }
C++のソースを解析してUMLのクラス図を吐いてくれるフリーのツールってありませんか? (できればWindowsはCygwinで。なければLinuxでも可。) Doxygenでクラスの継承関係とかの図は出るんですが、図の中にメンバ関数一覧 とかの表記は入らないので。 VS.NET Ent+Visioだとできそうな感じなんですけどね…
791 :
デフォルトの名無しさん :05/02/26 23:07:27
>>790 フリーじゃないが
VC6+Rose
VC6+Visio
はできるよ。
>>789 その例のAクラスのオブジェクトは
基本クラスであるInterfaceクラスのコンストラクタ呼び出し
この時にIntefaceクラスの仮想関数テーブルへのポインタがvptrセットされる。
↓
Aクラスのオブジェクト初期化
この時にAクラスの仮想関数テーブルへのポインタがvptrにセットされる。
と辿る。だからリンク時に設定されない。
コンストラクタ/デストラクタ呼び出し中にvptrが書き換わるというのは あんまり知られてないのかねぇ?
>>789 A &getA(){
static A a;
return a;
}
B &getB(){
static B b;
return b;
}
int main() {
Character Tom( &getA() ), Jerry( &getB() ) ;
Tom.f() ;
Jerry.f() ;
}
とかすればいいんじゃないの?
>>792 あっ!そうか・・・
つまり、ベースクラスのコンストラクタの中で
vptr を参照するような処理が行われる場合に問題が生じるということですね。
>>794 なるほど。
こうすると最初に getA() を呼んだ時に初めてAのコンストラクタが呼ばれるのですね。
勉強になりました。
今まで、『静的に確定できるものを実行時に代入しているなんて、なんて無駄なコードを吐くんだ…』と思っていたのですが、
これで納得できました。
ありがとうございます。
メンバ関数をコールバックとして使用したいんだけど 使用する場合static宣言しないと使えないの?
そう。
>>796 非staticメンバ関数はthisポインタを受け取るため、宣言の見た目と型が違う。
staticにしてそのまま使えるならそれでもいいし、
型を合わせる為だけの関数を間にはさんでもいい。
コールバックを受け取る側もいじれるんなら、
C++的には仮想関数を使ったほうがいいだろう。
vector<classA *> aa for(vector<classA *>::iterator it = aa.begin(); it != aa.end(); ++it) { // it->foo() ? } vector配列がポインタの時にクラスのメンバにアクセスするにはどうしたらいいですか?
>>796 .* とか ->* とか使う手もあるなー。
まあ、コールバック呼び出し側をいじれないことには
どうにもならんわけだが・・・。
>>801 おぉ、ありがとうございました!
あほなことにit->->foo()って試してました orz
つい最近似たような話があったと思ったら
>>349 -あたりか。
804 :
デフォルトの名無しさん :05/02/27 22:39:36
コールバック関数がらみの話は定期的に出るな。
806 :
デフォルトの名無しさん :05/02/28 03:31:53
むかつくから v(^・^)v←これを攻撃するAA誰か作って
質問です。 ifstreamの走査位置を一定数戻すときってどうやるんですか? std::ifstream ifs; char buf[1024]; <--------色々ある。------ ifs >> buf; int len=strlen(buf); ifs.seekg(- len); これでいけると思ったんですが、ステータスをgood()でみるとfalseになってしまいます。 どなたかご存知の方いらっしゃいませんか?
>>807 ifs.seekg( -len, ios_base::cur );
811 :
デフォルトの名無しさん :05/03/01 13:47:54
クラスを継承した子が親クラスの関数をオーバーライドした時など、 親クラスの関数を使う場合はParent::method() のように名前の解決をしますが、Javaのsuperみたいな演算子はないのでしょうか?
ちわ。JAVA畑から来ました。 スレッドについてなんだけど、 クラスのメソッドをスレッドにする場合はどうしたら良いのだしょうか。 class Hoge { unsigned __stdcall thm(void *lpx) ;/*実装省略*/ } ; Hoge::Hoge() { (HANDLE)_beginthreadex(NULL, 0, thm, NULL, 0, &th); } これだと「3番目の引数のthmがねぇよ。」とか怒られるんだけども。
とりあえず過去ログぐらい読め?
質問です、friendに関してですが……… 例えば、class Aとclass Bがあり、class A内にてclass Bをfriend classと指定したとします。 class Bを継承してclass Cとした場合、class Cからclass Aのprivateあるいはprotectedメンバへのアクセスは可能なのでしょうか?
>>815 不可能。friend関係は継承されません。
せめてこのスレだけでもいい。FAQすぎる話だ。
まあ、過去ログ読めとか、FAQ読めとかってのは あいさつみたいなものだからスルーで結構だよ。
これは許されますか? class A { public: bool m_b; A(){m_b=true;} virtual ~A(){m_b=false;} void Func(); }; A a; class B { public: B(){;} virtual ~B(){if(a.m_b)a.Func();} }; B b; int main(){return 0:}
同じ翻訳単位ならコンストラクタは a->b の順 デストラクタは b->a の順だ。何がしたいか知らんが何も問題はない
WM_MOUSEWHEELのwParamの上位ワードは移動量ですが、 移動量が正の場合は次のどちらなのでしょうか? 1.マウスホイールを上に(奥に)回した場合 2.マウスホイールを下に(手前に)回した場合 直感的には1だと思うのですが、自信が無く…
自分でどっちなのか確かめればいいと言うことすら 分からないのか? スレタイも読めないのか? お前バカ?
>>822 header.h--------------------
class A{...};
class B{...};
SourceAB.cpp----------------
#include "header.h"
A a;
B b;
SourceBA.cpp----------------
#include "header.h"
B b;
A a;
----------------------------------
どちらのソースでも問題ないですか?
>>821 > A a;
> class B {
> virtual ~B(){if(a.m_b)a.Func();}
> };
そんなソース書くな。文法が許しても俺が許さん。問題ありまくり。何がしたいんだ!
>>821 Bが静的メンバとしてAを持つようにしたら駄目か?
829 :
デフォルトの名無しさん :05/03/01 22:31:49
嫌です
830 :
デフォルトの名無しさん :05/03/02 02:26:04
struct S { friend void f(); }; void g() { f(); } このコードがエラーになったらびっくりしませんか?
>>831 俺は830じゃないが、
friend は friend で指定しているターゲットの宣言を
兼ねることができちゃうぞ。
835 :
デフォルトの名無しさん :05/03/02 12:44:54
delete this; って可能ですか
超スペシャルFAQですね(^^)
どちらかといえば可能ですか
来週からC++に取り組むことになりました。 今までVBしかやったことないのに・・。
日記はNTEMacsにでも書いてろ
標準C++ではNULLの定義って規定されているのでしょうか? まずNULL自体が存在することは決められていますか? そしてそれは0あるいは(void *)0のどちらかに必ず決まっていますか?
>>840 0
C++ではvoid *→何か *の変換はキャストが必要になるから(void *)0は有り得ない。
そうですか。じゃあ #define NULL 0 は標準C++で保証されてるんですね。 でも無効ポインタについては0を使うのがセオリーですか? それともNULLでもいいのかな(保証されてるなら)。 プログラマがポインタであることを意図してるのがわかる分 NULLでもいいような気もするのですが。 でも例の関数のオーバーロードの問題で、ポインタを渡すのか0を渡すのかで 動きが変わるとなると、NULLをキャストしなきゃいけないってのも 変ですよね。そもそもそういうオーバーロード設計がいけないのでしょうが。
>>840 一応 <cstdldef>にあるけど。>>NULL
これは、Cとの互換のために残されているので
C++のソースでは使うべきではない。
どうしても使いたかったら const int NULL = 0;
ありがとうございました。 特にどうしてもNULLがいいというわけではないので 0で統一することにします。
NULLがオールゼロビットでない環境でも 0がポインタとともに使われると適切な値に 変換されることが保証されている。 C++ では NULL なんか使わない。
数値のしての0と紛らわしいからNULLを使ってるっていう俺は異端なのか
使いたい奴は使えばいいんじゃないか?
int *p = (int *)0; 型が合えば代入できるしポインタのつもりという主張もできますよね。 こんなことしないでしょうけど。
前にこんなの考えたど、BCCじゃプリコンパイル済みヘッダを作れないって言われたから使っていない。 const class { public: template <typename T> operator T *() {return 0;} } NULL;
851 :
デフォルトの名無しさん :05/03/02 16:37:34
テキストファイルから1行を取り出すために、 std::vector<char> arrLine; arrLine.reserve(1024); int c; while (((c = fgetc(fp)) != EOF) && (c != '\n')) arrLine.push_back(c); と書いたら上司に”大体1行なんて1024文字あれば足りる”だろうから fgets(pLine, 1024, fp) にしろと言われました。 みなさんどう思われますか?
なぜにC言語の入出力関数をつかうのれすか?
std::ifstream ifs; std::string s; std::getline(ifs, s);
854 :
デフォルトの名無しさん :05/03/02 18:59:36
長さに制限がある文字列を使いたい。 最大サイズをオーバーしたらエラーを返すか、例外を投げるみたいな。 std::stringをラップしたりして、自作しなきゃかなあ
サイズ調べりゃええのと違う?
>>842 正確には「整数の型」とだけ定義されていて、int とは決まってない。処理系に
よっては0L かも。
あと gcc だと拡張機能で「任意の型のヌルポインタには暗黙の変換ができるが、
整数型には変換できない」という特殊な予約語 __null があって、
#define NULL __null
されてる。
ヌルリンチョ
ぬるぽ
>>854 std::stringに限らず、size()メソッドを持ち、代入や追加のできるコンテナすべてに使えるよう
template <typename T> class size_constrainみたいにすると汎用性ありそう。そんな妄想。
>>851 おまいのコードもおまいのコードだが、そいつもガッしてしまえ。
>>854 basic_istream::getline
ってか、
stringに読み込んで文字数検査で何が不都合なんだ?
こんばんわ。 夜分すいません。 ヘッダーファイルで、クラスの定義の前に、「class CExamine;」 というものがあるんですが、これは何を意味してるんでしょうか? class 〜;というのは、何を意味してるのでしょうか?
>>862 前方宣言(Forward declaration)
864 :
デフォルトの名無しさん :05/03/03 01:19:32
((void*)0) から関数ポインタには暗黙の変換が効かないから、 NULLの定義に ((void*)0) が許されているCでは 関数ポインタにNULLは使っちゃいけないんだ。(初期化、代入、比較ぜんぶ) これを知ってからはスッパリNULLは使わなくなったね。
>>863 さん
ご返答助かります。
ありがとうございました。
ううううううんk
>>866 上司が部下のレベル向上のためにお題を出したと見るべきだろう。
無理にC++のSTLコンテナを使って背伸びしようとした初心者をたしなめることが目的。
つか、 「1行が1024バイトを超えたときのパフォーマンスを考慮してないクソコードだ。」 って言いたいのを遠まわしに諭しただけだろ。 親心のある上司に感謝しないと駄目だぞ。 相手によっては助言どころか見捨てられることだってあるのだから。
>>851 個人的にゃぁそんなコード書きたかねぇけど、
仕事として書くコードならありだと思うぞ。
1024バイトって制限がまず問題ならない状況なら
仕様として割り切ってコードをシンプルに保つのも悪くはない選択。
コードがシンプルであるほど一般的にバグも少なくなるもんだし、
複雑なバグも発生し難くなる。
開発業務って「時間との戦い」って面が結構あるし、簡素に済ます
ことが許される場面ではそうすべきだと思うぞ。
>>870 ならなおさらgetlineでいいんじゃ・・・
簡素に済ますのなら、そもそもスタックバッファでfgets()使っておくだろ。
>>851 要求される仕様によるな。
> テキストファイルから1行を取り出すために、
だけが目的なら、お前も上司も回線切って首吊ったほうがよい
>>873 なんで上司まで道づれなんだ。
上司の指示の何が問題なのかね?
>>874 仕様に無い制限を実装の都合で作ってるわけで。
876 :
デフォルトの名無しさん :05/03/03 09:08:26
>>875 1024文字で読み込めないファイルをあくまで正常なフォーマットのファイルとして
処理しようとすること自体がおかしいとは思わんのか?
悪意あるファイルが外部から送り込まれて、プロセスにメモリを浪費させる目的があったとしたら、
まんまと乗せられたことになるだろ。
一部の馬鹿がSTLの動的配列の恩恵を無差別に利用しようとすると、後で他の者が迷惑する。
stringって、サイズの予約とかして再割り当てを排除する ことってできないん?いずれにせよ、Cの入出力使う必要 あるの?
>>877 =
>>875 自分のレベルの低さを素直に認めるべきだろう。
経験の浅さ・思慮の浅さが露骨にネットに晒されてるだけだぞ。
1024バイトで不安なら2048バイトにすればいいじゃない。 マリー‥アントワネット
>>878 逆だよ。
C++の入出力使う必要あるの?
という設問を常に念頭に置くべきだ。
散々Windowsのハンドルをちゃんと自力で削除しているくせに、
ファイルハンドルだけは管理できないような不思議な人は存在しない。
私もfgets()で済ませることが多いなぁ。 但し、設定ファイルのように前方にのみ意味がある場合であって、1行を完全に読み取る必要がある場合は使わないけど。
行という概念がある時点で(ry
>>879 仕様に1行の長さについての制限は無いが、1行をバッファに読み込みたい。
バッファの動的確保は(悪意ある入力を考慮して)危険と判断。
そこで、
1. 長さについての制限が仕様に欠けていることを指摘する。
2. 1024くらいで安心だと思うから固定で取る。
経験豊富で思慮深いプログラマの選択は 2 である、と言うわけか?
ところでvectorの型にvectorを指定して、要素のvector個々に 最適な初期容量を割り当てたいとき、個々にreserveするしか ないのでしょうか。
>>885 「個々に最適」である必要があるなら、そうでしょうね。
>>884 当然だ。本格的に頭悪いのか、お前?
1行が1024バイトを超えるテキストファイルを想定する機会などない。
それはもはやバイナリファイルとして別の扱いをする必要がある。
fgets()で取得した生の文字列は、そのまま潤沢なCライブラリの恩恵を受けられる。
コンテナに入れるならその文字列編集後にヒープバッファに入れるなりすればいい。
>>884 は実務経験何年よ?
恥ずかしいぞ、お前。
1024という数字は何か意味があるのでしょうか?
1024=0x0400
>>884 の支持政党は民主党・社民党・共産党のいずれかだなw
>>890 0x0400に何の意味があるのれすか?
セキュリティホールになりそうなコードは書かない方が良いよ……
>>893 確かにSTLやiostreamが安全だという誤解がセキュリティホールになりそうだな。
あれは便利なだけであって安全ではない。
素直に、危険と隣り合わせなことを実感できるC関数を使うべきだろう。
MSVCなら/GSオプションを使うことで、
スタックバッファオーバラン検出時に例外発生させてくれる。
STLなどが提供する機能はバッファオーバランが起きてもヒープ領域なので検出対象外。
そうなるとSTLって結局初心者向けみたいな感じで、 使いどころないみたいな感じになってくるね。 玄人はほとんどCの機能使うってことなの?
896 :
デフォルトの名無しさん :05/03/03 11:57:02
doubleやintをstringに変換したいのですが、どうしたらよいのでしょうか? string x,y; double a; x="aaa"; a=10; y=x+string(a); というのはできないのでしょうか?
グローバル関数のswap関数を使うには 何をincludeすればよかったんでしたっけ?
>>897 template <class T> swap(T l, T r) { T temp = l; l = r; r = temp; };
>> 897 std::swapなら、algorithm グローバルなswapってあった? # どこぞのヘッダで、using std::swap してあるのかな?
ええとですね、同一コンテナ同士のスワップ関数で、 メンバ関数じゃなくてグローバル(?)な関数があるようなんです。 「標準ライブラリ チュートリアル&リファレンス」によると。 コンテナの要素をコピーせずにすむコストがかからないものの ようですが。
ポインタでswapすればいいじゃん
ええと、どちらかというと解決方法というより、 リファレンスにのってたあの関数を使うには どのヘッダファイルが必要なのかなぁ・・と。 とりあえずvectorとalgorithmはインクルードしたの ですがswap(c1, c2)で呼び出しても、そんなものは無い というエラーがでます。ちなみにc1とc2はどちらも同じ型の vectorです。
だから <algorithm> に std::swap があるっつの
>>894 >STLやiostreamが
ぉぃ。
>>895 いんや。楽出来るところでは楽がしたい。が、
「ここはキッチリ作らないといけない」/「ここは適当に」ってのが
判断できるようじゃないといけない…んだろうなぁ。
>>905 … void swap(…
じゃないとだめだな
inline じゃないし、参照で受け取ってない。 全然ダメ
参照ということは、一時変数は渡せないんだね。 そういや一時変数のアドレスなんて取り出せないんだっけか。 一時変数の参照もなんかあったようななかったような。
>参照ということは、一時変数は渡せないんだね。 またまたご冗談を。
BCCでは出来るけど警告が出る。
あかんぞ。bccだけど、 int i=7; swap(i, int(3)); これできないよね?
const じゃないと規格じゃ許されてない。 swapの場合一次変数なんか渡しても意味内から参照で受け取るべき
const の一時変数ってどうやってつくんの?
>>915 変換が必要な変数、定数、リテラルは const な参照にしか渡せないという意味
void func(int const & i) {} func(int(1)); はオーケーだけど、 void func(int & i) {} func(int(1)); は駄目ってことか。
>>913 本当だ。これが警告付きで出来たもんだからリテラルも平気なのかと思っていた。
template<class T> inline void swap(T& l, T& r) {T temp = l; l = r; r = temp;}
int hoge();
int main() {
int i = 7;
swap(i, hoge());
return 0;
}
も前ら禿本くらい嫁 189ページにちゃんと書いてるぞ
920 :
デフォルトの名無しさん :05/03/03 17:20:20
とてつもなく不満な事があるんだが聞いてくれよ。 クラスを作ったんですよ。Hogeってクラス。 それを継承してクラスSageってのを作ったんですよ。 コードを書いてるうちに、基底クラスしか扱わない場所が出てきたんで クラスHogeのポインタにSageのポインタを入れたんですよ。 で、そのまま delete phoge; とか書いちゃったんですよ。 そしたら派生クラスのデストラクタが呼ばれないじゃないですか。 何で、デストラクタの属性は、virtualがデフォルトじゃねーんだ!! 派生する可能性があるのは当たり前だろ!デフォでvirtual属性にしとけ! それぐらいのオーバヘッドは許してやれよ! だからC言語はややこしいって言われるんだよ!ばーか、ばーか。
派生する可能性がないことも多いと思う。
>>921 でもさ、派生する可能性が無くても、virtualは邪魔にならんだろ?
>>922 邪魔だよ。オブジェクトコンポジションをするたびにサイズが大きくなるなんてやってられない。
こんなあからさまな釣りに… おまいらも暇ですね。
>>923 関係ない話を割り込むが、オブジェクトコンポジションってそんなに多用するか?
うるせぇ、ばーか。
>>927 使うだろ。継承より見た目に解りやすい。
俺は多重継承大好きっ子だ
オブジェクトコンポジションって何?
>>932 ダイヤモンド継承をさらに発展させた、六角継承を発案したが不評
さらに発展させた亀甲模様継承を発案したが、まず俺が混乱している
>>931 あー、いろんなクラスのインスタンスをメンバに持って、ブラックボックスを積み上げていく方法だ
>>923 そんなサイズでかくなるの?知らんかった
詳しく教えてくれ
ここの連中は、最派生クラスしか使わない連中なのか・・・?
A B C /\ /\ /\ D E F G | | | | H .I. J K \/ \/ \/ L M N /\ /\ /\ O P Q R \ | × | / S T \/ U
939 :
デフォルトの名無しさん :05/03/03 19:51:19
ダライアスかと思った
多重継承なんてまんどくさくて使えるかよ。市ね
ATL つかってればありがたみも分かる。
オーバーヘッドが嫌なら最初からC++なんて使わなきゃいいのに。
946 :
デフォルトの名無しさん :05/03/03 21:09:20
質問です。本のサンプルプログラムなんですけど、 classのpublic内に、 std::size_t how_many_numbers( ) const { return count; } ってのが、もとから入っていて、それをコンパイルすると、 error C2039: 'size_t' : is not a member of 'std' って出てくるんですけど、これって何が起こっているか分かりますか?
C++はCみたいだけど楽ができるから使ってるんだよね。
>>946 君が必要な#includeをしてないだけ
949 :
デフォルトの名無しさん :05/03/03 21:26:06
950 :
デフォルトの名無しさん :05/03/03 21:34:29
>>948 #include<iostream> #include <cstdlib> cstdlib は必要なの分かってて一応してるんですけど・・・。
>>946 多分、コンパイルオプションか何かで
std 名前空間が無効化されてて size_t が
グローバルに定義されてると思うんだけど。
あるいは名前空間ができる前のヘッダ使っているとか?
952 :
デフォルトの名無しさん :05/03/03 21:51:44
>>951 名前空間っていつ出来たのですか? これは2001年に発行されたものなのですが…。 解決策ってありますか?
953 :
デフォルトの名無しさん :05/03/03 21:53:11
訂正 これは2001年に発行されたものなのですが…。 じゃなくて Microsoft Visiual C++ 6.0使ってます。古いですか?
955 :
デフォルトの名無しさん :05/03/03 22:00:00
ありがとうございます。 このコンパイラでは、どうしようもないってことですよね?
VC6用のサービスパックあててる?
957 :
デフォルトの名無しさん :05/03/03 22:28:47
あてないと動かないもん ♪だからもっと動いて もっともっと もっともっと
958 :
デフォルトの名無しさん :05/03/03 22:40:28
>>887 > 1行が1024バイトを超えるテキストファイルを想定する機会などない。
> それはもはやバイナリファイルとして別の扱いをする必要がある。
BBSのログファイルもバイナリファイルですかぁ?
959 :
デフォルトの名無しさん :05/03/03 22:45:46
このエラーって、どう対処すれば良いか分かりますか? コードはあってて、言われたとおりに動かすと、こうなったんですけど・・・。 LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/washing.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.
960 :
デフォルトの名無しさん :05/03/03 22:46:29
961 :
デフォルトの名無しさん :05/03/03 22:47:39
俺がメモ帳を使って個人的に書いてる文章も、 40字×13行分(これで1040バイト)くらいなら改行無しで進むことはよくあるな。 俺はいつの間にか、拡張子がtxtなバイナリファイルを作ってたのか。 2chのdatは改行を<br>タグに置き換えてるから、一レスが一行だよね。 制限の甘い板だと1024バイトいくかもな。 先日13KBくらいある書き込みを某所でしたが、あのBBSのログはどんな仕様なんだろ。
963 :
デフォルトの名無しさん :05/03/03 23:15:13
main 関数を含んだcpp file、インプリメントの cpp file と header fileがあるんだけど、 mainを含んだファイルで using namespace main_savitch_8A; using namespace std; #include "washing.h" ってやってもリンク関係のエラーがでる。 どうすればいいかわかりますか?
デリミタ区切りの1ブロックデータを読み込む際に、 1回のgetline()・fgets()しか使わないのならテキストだろう。 複数回、getline()・fgets()関数を使って1ブロックを読み出すのなら、 それはもはやバイナリファイルとしてのファイル処理。 たまたまデリミタが'\n'だっただけ。
一行が1024を超えるとバイナリファイル扱いって、ドアホか。 >827 は、あんな時間に書き込みしてるとこからみてもニート君だろうなぁ。
966 :
デフォルトの名無しさん :05/03/03 23:23:22
827 :デフォルトの名無しさん :05/03/01 21:11:33
>>825 それでコンパイルが通るならOKだよ。
>>966 コンパイルとおらないからダメってことじゃねぇの?
968 :
デフォルトの名無しさん :05/03/03 23:27:43
いや、965がさあ、
>>965 ・文章を理解できない。
・不合理な脳内補完をしてしまう。
・ファイル読込処理の経験が浅い。
君はどれなんだ?
>>969 そういうキミは
・ニート君
・しったか君
どっちなの?両方?
972 :
デフォルトの名無しさん :05/03/03 23:35:10
973 :
デフォルトの名無しさん :05/03/03 23:37:25
-cをつけろ。
974 :
デフォルトの名無しさん :05/03/03 23:39:54
とりあえず、
>>887 にテキストファイルを扱うコード書かせると
とんでもないことになるのだけはわかった。
>>887 と仕事する際、1行が1024byte超のテキストファイルが登場する可能性がある時は
ちゃんとバイナリファイルって言っとかないとな。
だれだって昔はニートだった。
>>974 >>887 は正論じゃないかねぇ。
長すぎりゃ複数回fgets()呼べば良いだけだし。
>>974 の会社ではpush_back()やappend()が禁止されているの?
↑わかってねぇw
どの辺がわかってないの?
980 :
v(^・^)v :05/03/03 23:53:32
じ・す・れ
981 :
v(^・^)v :05/03/03 23:54:17
1行のサイズがわからないからfgets()は使えない。
よって
>>887 は間違っている。
ということでFA?
上司と称するヤシはfgets()を一回だけ使えとは言っていないようにも見えるが・・・。
ほとんどの場合1行が1024バイト以下であることは事実だろ。
fgets()で使う固定バッファサイズが1024以下でもなんら問題ないのも事実だろ。
必要に応じて複数回fgets()呼べばいいのも事実だろ。
結局、
>>974 は何が言いたいんだ?
んじゃあ、getline使えってことで終了。
986 :
デフォルトの名無しさん :05/03/04 00:42:19
>>984 > ほとんどの場合1行が1024バイト以下であることは事実だろ。
>>887 は「想定する機会などない」と言ってるわけだがw
お前は想定する機会が無いと思うの? あるの思うの? どっちよ。
>>986 無いと思う。
「1行の長さは制限ないんでよろしく。」などと言われたことは一度もない。
俺の場合は全くそういう機会がなかった。
何を正常な書式のファイルとみなすかはアプリ次第・作者次第。
>>962 のケースのような場合であれば、
なおのこと最大数制限ルールがしっかり行われるはずだ。
989 :
デフォルトの名無しさん :05/03/04 01:01:04
さすが自民党支持者は馬鹿だな。
990 :
デフォルトの名無しさん :05/03/04 01:01:46
誰か次スレ!!
992 :
デフォルトの名無しさん :05/03/04 01:06:18
>>989 お前、どうやら本当に野党支持者だったみたいだなw
無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
995 :
デフォルトの名無しさん :05/03/04 01:10:12
つうか、野党支持してようが、与党支持してようが関係無いだろ。バカか。
さて、埋めますか。
>>995 違うよw
空論好きかどうかで判断してただけ。
>>997 お前、どうやら本当に学会員だったみたいだなw
無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
999 :
デフォルトの名無しさん :05/03/04 01:15:18
↓1000ゲットおめでとう
1000 :
デフォルトの名無しさん :05/03/04 01:15:52
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。