C++相談室 Part3
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNGC++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
STLport
http://www.stlport.org/
Boost C++ Libraries
http://www.boost.org/
0004デフォルトの名無しさん
NGNGFILE構造体とfstreamとどっちを使ってますか?
0005デフォルトの名無しさん
NGNGまず、どうして、そういうことを気にするのかを聞きたい。
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG>なんすか!、コレ!(怒
なんすか!、コレ!(怒
0010デフォルトの名無しさん
NGNG意味フメイで怖いんですけど!?
0011デフォルトの名無しさん
NGNGに似てる?ムカツク!>>1
0012デフォルトの名無しさん
NGNGやっぱりこれがないと。
0013デフォルトの名無しさん
NGNG(C++)
ノ∪ヽ
0014デフォルトの名無しさん
NGNG( * )
ノ∪ヽ
0015デフォルトの名無しさん
NGNG(∩∩)
0016デフォルトの名無しさん
NGNGv(^・^)v
γ⌒" ̄ `Y" ̄`⌒ヽ
/´ 、 ¥ ノ `ヽ.
/ ,-ュ人` -‐´;`ー イ` ェ-、 ヽ
l 「 } i 彡 i ミ/ { `ノ
` `ー' .} { `ー'´/ ̄ ̄\
/ \|| | グシャ |
/ /`ヽ、 i |i \ _/
/ ノ l| | i| //
\ `ヽ | || /
\ \ l|| l|i | ,, '⌒Y
ノ _>‘、|l |・i/ノ , ノ >>1
<.,,_/~,-・i |゚;・li。i,・'(__,.J
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGv( ^・^)v < こういう生き物です。
U U \_____________
0019デフォルトの名無しさん
NGNGv( ^・^)v < ミカン星人に近づいたかな?
)) )) \_____________
0020デフォルトの名無しさん
NGNG< ガオガオシテナイーヨ
v( ^・^)v └───/|────
\.\______//
\ 観鈴ちん /
∪∪ ̄∪∪
0021デフォルトの名無しさん
NGNG理由は無いけど、同じ事が出来る手段が2つあるから。
パフォーマンスとかポータビリティとかについてはどうなんだろ?
テキストファイルだとfstreamが便利そう
バイナリファイルだとFILEの方が書きやすそう
という漏れの認識はおかしい?
っていうかどうして荒らされてるの?
0022デフォルトの名無しさん
NGNGC++らしい方使っとけ。
0023デフォルトの名無しさん
NGNGVCだと、FILEの方が、かなり軽いね。
0024デフォルトの名無しさん
NGNGv( *^・^*)v < >>22 FILEに決まってんだろ。
)) )) \_____________
0025デフォルトの名無しさん
NGNG静的メンバ関数をclassの宣言外にだそうとする(2)と、
>error C2352: 静的でないメンバ関数の中で呼び出しが正しくありません。
なんて言われてしまいます。
静的メンバ関数は、外にだしちゃダメなのですか?
-----(1)
class mydat {
static int num ;
public:
static int foo(){ return num } ;
} ;
-----(2)
class hoo {
static int num ;
public:
static int foo();
} ;
static int hoo::foo()
{
return num ;
}
0026デフォルトの名無しさん
NGNG指定された関数は静的なメンバ関数ではありませんでしたが、static メンバ関数内で呼び出されています。
次にこのエラーの例を示します。
class X
{
public:
static void func1();
void func2();
static void func3()
{
func1(); // OK, 静的な関数 func1 を呼び出しています
func2(); // エラー, 非静的関数 func2 を呼び出しています
}
};
0027デフォルトの名無しさん
NGNG'identifier' : 'static' をファイル スコープでのメンバ関数の定義に使うことはできません。
static メンバ関数がファイル スコープで定義されています。static メンバ関数は、外部リンケージで宣言しなければなりません。
この誤りは、Microsoft の拡張機能を使っているとき (/Ze オプション指定) には警告となり、Microsoft の拡張機能を無効にしているとき (/Za オプション指定) はエラーとなります。
次にこのエラーの例を示します。
class C
{
static void func();
};
static void C::func(){}; // エラー
0028デフォルトの名無しさん
NGNGclass hoo {
static int num ;
public:
static int foo();
} ;
int hoo::foo()
{
return num ;
}
int hoo::num;
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG下位クラスでoverrideする
003230
NGNGC++勉強したてでよくわからんのです。
純粋仮想関数って、なにもないのと同じじゃないかって思うんです。
枠だけ作って、中は下位クラスで作ろうってことなら、
初めから上位に関係なく下位で作ればすむなんて思ったんです。
なんかメリットは、あるんですか?
0033デフォルトの名無しさん
NGNGpolymorph
0034デフォルトの名無しさん
NGNGよくあるAnimal、Cat、Dogの例で説明すると、CatやDogクラスの
オブジェクトをAnimalのインタフェースを使って呼び出したいが、
Animalは抽象的過ぎて実際の処理をまかせられないので、インタ
フェースだけを定義しておく。
こんな時にC++では純粋仮想クラスを使います。
っていうか、GoF本とか読んだほうがいいかも。
0035デフォルトの名無しさん
NGNGclass Animal {
public:
virtual int get_ashi() = 0 ;
}
class Neko : public Animal {
public:
int get_ashi() { return 4 ; }
}
class Tako : public Animal {
public:
int get_ashi() { return 10 ; }
}
class Ototake : public Animal {
public:
int get_ashi() { return 0 ; }
}
と。
0036デフォルトの名無しさん
NGNG純粋仮想クラスにはしないことが多いんですが、なんか副作用とか出てきたりするもんなんでしょうか。
0037デフォルトの名無しさん
NGNGサブクラスで override を忘れたときに、コンパイラが文句をいってくれない。
個人でやってる分にはどうでもいいけど、複数人で行うプロジェクトの場合には、
「これは絶対にサブクラスで上書きしろ」と主張するために、純粋仮想メソッドに
しておくのが吉。
それに、そもそも「デフォルトの振る舞い」が想定できないケースもある。実装継
承ではなくインターフェース継承を重視するようになると、よくある。
0038デフォルトの名無しさん
NGNGオーバーヘッドが掛かり遅くなる
0039デフォルトの名無しさん
NGNG> string line_buf;
> ifstream file("text.txt");
> getline(file, line_buf);
> こんなクソコード書いていいのは初心者のうちだけだぞ!
がクソな理由を教えてください。今ちょうどこんなの書いてたので……
0040デフォルトの名無しさん
NGNGえっ?
たしかにインスタンス構築時に vptr を 2 回(親クラスのコンストラクタで一回、子クラス
のコンストラクタで一回)埋めるオーバーヘッドはかかるけど、仮想メソッド呼び出しにか
かるコストは同じだと思うが。
0041デフォルトの名無しさん
NGNG>たしかにインスタンス構築時に vptr を 2 回(親クラスのコンストラクタで一回、子クラス
>のコンストラクタで一回)埋めるオーバーヘッドはかかる
これだけで十分遅くなる&メモリを無駄に使う気がするけど? そういうことじゃなくて?
もっとも、コンパイラ依存だろうけど。無理して継承関係を採用するのをやめてテンプ
レートにすれば抽象クラスにするよりもっとうまくやってくれるかもしれない。
0042デフォルトの名無しさん
NGNGクラスを継承すれば、純粋仮想関数があってもなくても
複数回のvptrのセットが行われるんで、純粋仮想関数が
必要な理由にはならんでしょ?
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGtemplate だとコンパイル時に型が決まっていしまうから多態できないじゃない。Generic Programming
と OO は対立するよりは、むしろ直交する概念でしょう。
それと VC++ 限定ですが __declspec(novtable) という拡張指定があります。これをつけたクラスは
コンストラクタ/デストラクタから vtbl 初期化用のコードが削除されます。
0045デフォルトの名無しさん
NGNGdat = new int[100];
てすると
delete [] dat;
しなっきゃいけないのに
int dat[100];
だとなんでデリートしなくていいのですか?
0046デフォルトの名無しさん
NGNG004745
NGNGサンクス
ってもsatcckってなんだかわからんから
勉強してきます
push,popとかってやつ?んなわけないか。。。
0048デフォルトの名無しさん
NGNGスコープ
004945
NGNGスコープっていうと変数の通用範囲ですよね??
スタックにつまれた変数はそのプログラマぐが終わると
かってに開放されて
動的に確保した奴はされないとか???
0050デフォルトの名無しさん
NGNG> スタックにつまれた変数はそのプログラマぐが終わると
スタックにつまれた変数はスコープを出ると
だけどな。
005145
NGNGなるほど。。。。
勉強になりました
なんかすごく基本的なことなんだろうけど
目からうろこです
はずかちっ!
0052デフォルトの名無しさん
NGNGスタック上のオブジェクトについても同様だ。もしdeleteしなければ
ならんと仮定すると、std::string なんて使いものにならんと思わん?
(わらい
0053デフォルトの名無しさん
NGNGdelete d [];
ってできないにょ?
0054デフォルトの名無しさん
NGNGコンパイル通らないんですけど。
delete[] d; できるか?という意味ならできない。
005551
NGNGstd::stringってのがわからないので。。。
なにぶんCc++はじめて二日な門で。。。
勉強してきます!
0056デフォルトの名無しさん
NGNGどうやってスコープを抜けたことを判断してるのか謎だった。
あれは実行時に動的に判断してるんだと思い込んでたから。
動的?んなわきゃねー、と言えるのは今だからこそである。
005752
NGNGがんばれ。
0058デフォルトの名無しさん
NGNGVBやPerlには戻れるかもな(藁
Javaには…戻る方が賢明だったりしてw
005939
NGNG0060デフォルトの名無しさん
NGNG念頭に置くようにしよーね
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNG0063デフォルトの名無しさん
NGNGstd::string input_data1;
std::string input_data2;
char buf[1024];
std::string input_data3;
strcpy(buf, input_data1.c_str());
strcat(buf, ",");
strcat(buf, input_data2.c_str());
input_data3 = buf;
とかやられて鬱確定。
0064デフォルトの名無しさん
NGNG0065デフォルトの名無しさん
NGNG>>64
死ね
0067デフォルトの名無しさん
NGNG教えてもらえませんか
http://www.geocities.com/sr77798/Istoapp.def.txt
一夜づけでkeybd_eventについて研究したのですが
さっぱりわかりませんでした。パラメーター1に
アスキーコードが混ざってることはわかったんですが
keybd_event以外に調べるものがあるのなら教えてください。
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNGのコードの
<float*>はキャストでしょうか?
C++をコードを読んで勉強しているのですが、
参考書をよんでもちょっと調べられませんでした
0070デフォルトの名無しさん
NGNGhttp://www.microsoft.com/japan/developer/library/dsmsdn/deep05182000.htm
http://www.microsoft.com/japan/developer/library/dsmsdn/deep06012000.htm
を読むことを推奨する。
0071デフォルトの名無しさん
NGNGを使ってしまいました
どういうキャストなんでしょうか?
「根本的に別の方に変換する」と書いてありますが
0072デフォルトの名無しさん
NGNG「プログラミング言語C++」は読んだ?
reinterpret_cast はビットパターンを変えずにデータを再解釈するキャストだと思っておけば、
だいたい合ってる。C では型を変える (int -> float とか) タイプのキャストと型再解釈のキャ
ストは両方とも同じ構文を使っていたけど、違いを明確にするために reinterpret_cast が規定
されてる。
0073デフォルトの名無しさん
NGNGとりあえずは。
0074デフォルトの名無しさん
NGNG>reinterpret_cast はビットパターンを変えずにデータを再解釈するキャスト
ビットパターンを変えるキャストって?
0075デフォルトの名無しさん
NGNG0076デフォルトの名無しさん
NGNG>72
どうもです
shortをfloatで扱うと,各演算(+-*/%)はどうなるのでしょうか?
ちなみにプログラムは以下のうような感じです
BOOL CClip::Transform( short* pnBuf, long cSampBuf )
{
CCriticalSection cs( &m_csState );
float* pfBuf = reinterpret_cast<float*>(pnBuf);
for(int i=0;i<cSampBuf * m_wfx.nChannels; i++)
{
if(pfBuf[i] > m_p.fClipLevel)pfBuf[i]=m_p.fClipLevel;
else if(pfBuf[i] < -m_p.fClipLevel)pfBuf[i]=-m_p.fClipLevel;
}
return TRUE;
}
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNG32bit かどうかは処理系依存だし、float* と short* の内部表現が違うかもしれない……という
話は置いといて、
unsigned char *buf;
int *np = reinterpret_cast<short*>(buf);
としたときに *buf, *np が異なるコードを生成することは良いよね? buf を int へのポインタ
として扱うために必要になるのが reinterpret_cast。これをやらんとコンパイル時エラーになる。
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNGという事は、本来floatの値が、shortとして流れて来て
ここでfloatとして計算していると言う事かもしれません
いろいろなご意見どうもありがとうございました
008279
NGNG処理系依存だがな
0083デフォルトの名無しさん
NGNG単精度浮動小数点は、ふつうは (IEEE の規格に従ってる場合は) 32bit ですって。
おそらく、件のプログラムは pBuf が指しているメモリ領域に、場合によって short やら float やら
各種のデータを詰め込んでるのだと思う。読み出す部分だけではなく、書き込んでる部分も読んで
みては?
0084デフォルトの名無しさん
NGNG内部表現や実装はC++という言語規格とは関係ありません。実装が言語を
規定するのではなく、言語が実装を規定するのです。
0085デフォルトの名無しさん
NGNGごめん、言ってることがよく分からん。
reinterpret_cast に関しては実装を踏まえた上で使わないと意味がないと思うが、どうよ?
0086デフォルトの名無しさん
NGNGなるほど
そう言う事かもしれません
書き込む部分探してみます
というかCOMになってて、他からデータ渡される気がします
float32bitですね(^_^;
0087デフォルトの名無しさん
NGNG言語規格は、実装に絶望的なほど影響される。
実装のために削除された提案が多数ある。
0088a
NGNG自分でゲームとかいろんなソフト作れるようになったらカッコいいなと思い
C++プログラミングVol.1 H・Mダイテル+P・Jダイテル著を買ってきました。
この本の評価はどの程度なんでしょう?
0089サポートパンク
NGNG0090a
NGNGCの方が簡単なのすかね?
0091デフォルトの名無しさん
NGNGttp://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html
0092デフォルトの名無しさん
NGNG悪くないと思うが、それ読んだあとできちんと「プログラミング言語C++」
も読むこと
0093サポートパンク
NGNGBCCみたいにコンソールプログラミング
って出来ますか?
0094デフォルトの名無しさん
NGNGC:\Program Files\Microsoft Visual Studio.NET\common7\tools\vsvars32.bat
に環境変数の設定バッチがあるから
あとは好きなように。
cl : C/C++コンパイラ
nmake : makeユーティリティー
csc : C#コンパイラ (おまけ)
0095age
NGNGいい本だが初心者にはきびしいかも
0096デフォルトの名無しさん
NGNGでなければ今の時代無意味だよ。
本当はC++をやってからCやJava、C#をやるのがお勧めだが(というの
はそれらの言語は大体C++の古いバージョンやサブセット/微少な拡張
として手間をかけずに理解できるので)、最近の状況からすると、
JavaやC#をやってから必要になったらC++なんてのも悪くないかも
しれない。アメリカの大学だと最初はJavaってところが増えている
ようだから。
CをやってからC++だと、変な癖が付く恐れがあるので、既存のCの
参考書を売ろうという出版社や古い教育者の謀略に乗らない方が
良いと思われ。
0097デフォルトの名無しさん
NGNG初心者な質問なのですが
「CをやってからC++」というパターンでつく可能性のある
変な癖って具体的にどういう感じなんでしょう。
私はそのパターンで勉強してしまったので
実際もしそういう癖があるなら直したいのですが…。
0098デフォルトの名無しさん
NGNG「107」って?
C++の参考書の著者にはCくらい先にやっとけと言う者とやらんでよろしいと
言う者の2通り真っ二つに分かれているので、かなり異論が出そうだが。
ま主観的な問題なんでどっちが正解という話でもない。Stroustrupは後者。
- Cプリプロセッサの多用
- グローバル/スタティック-変数/関数、関数ポインタの多用
- Cスタイル文字列ならびにCスタイル文字列関数の多用
- ローカルオブジェクトの先頭宣言
- 異様に長いメンバ関数(とデータメンバの準グローバル変数化)
- private/protected/publicの不適切な使い分け/実装継承の多用
- 別スレのOO不要/C万能/GNOMEサイコー/UNIXマンセー論者の種になる(藁)
なんで濫用が問題かというと、別に禁止されているわけではない
ので少しくらいやっても良い。Cライブラリの文字列関数だって中身
はアセンブリだからそれなりに速い。
他のオブジェクト指向言語では禁止されている物が、C++の場合たま
たま許容されているところを悪用できる点が問題になる。煙草を吸う
ような開放感があるのかもしれない。周囲には少々迷惑をかけるけども。
ただし、他とも協調するための制度もそれなりに備わっている。
C++はリアリティを持った、自由な大人のための言語だから好きだ。
0099デフォルトの名無しさん
NGNG「自由な大人」が二人集まると,お互いの自由が相手を束縛することに
気がつく。そこで喧嘩せずに目標を達成するためにルールを作る。
ルールのある言語を使って協調するか
協調するためにルールを作るか。
結局、最後に行き着くところは同じさ。
0100デフォルトの名無しさん
NGNG0101
NGNG0102デフォルトの名無しさん
NGNGブロックから指定されたブロックまでの経路の全通りを作り出す
プログラムを作っています.これを作るアルゴリズム難しくてで
きません.どうしたらよいのでしょうか?
0103デフォルトの名無しさん
NGNGC++ builderのコマンドライン版でないということは、無料のGUI開発
環境でなきゃ駄目ってこと? 探せばそれなりにあると思うけど。
0104デフォルトの名無しさん
NGNGひろゆきもそろそろ管理人としての姿勢を見直すべき
珍走団がひろゆきに土下座をさせたのは、荒らしの責任を取らせたのではなく
あくまでも、ひろゆきの電話での態度について落とし前をつけたまで
日本生命やINSIのように、安全を確信できる相手には、イキガッテみて、
珍走団のように理屈の通じない相手には遜って土下座までするようでは
あまりにもカッコワルイ
0105デフォルトの名無しさん
NGNG>ルールのある言語を使って協調するか
>協調するためにルールを作るか。
>結局、最後に行き着くところは同じさ。
本当に同じか?
ルールを毎回一から作るより、再利用する方が効率的だよね!
0106デフォルトの名無しさん
NGNGC言語だと配列の上限ルールが居る。から、プリプロセッサに頼る。
0107デフォルトの名無しさん
NGNG絵に描いたような...
0110デフォルトの名無しさん
NGNG作ろうと思っているのですが
linuxとwindowsで違いますか?
0112デフォルトの名無しさん
NGNG最短距離だよね?
●○○○○○
○○○○○○
○○○◎○○
○○○○○●
黒丸から黒丸まで行くとすると、(◎は障害物)
→5回
↓3回の全ての組み合わせから
◎の通る、組み合わせを引けばいいのでは?
5×3の全通りの配列を作って、右=1、下=2みたいな感じで。
11111222
11112122
11112212
・・・
・・・
こっから、最初の5個を見て、右3下2のを取り除く。
11111222→11111→OK
11112122→11112→OK
・・・
・・・
11122112→11122→だめ
・・・
ってなところじゃね?
問題自体が違ったらすまん
0113デフォルトの名無しさん
NGNG初心者にも分かりやすい入門書 ありますか?
ホントにアホみたいな質問でスマソ
0114102
NGNGすいません。最短距離ではないのです。
一度とおったブロックは通過しないのですが、
●○○○○○○
○○○○○○○
○○○○○○○
○○◎○○●○
○○○○○○○
○○○○○○○
障害物を回避するときに
↓4回、→5回、↑一回って経路も必要なのです。
0115デフォルトの名無しさん
NGNG入門書よりも、作りたいと思う物が無いならやっても無駄。
0116デフォルトの名無しさん
NGNGキーワードは再帰。スレ違いだから、続きは宿題スレなどで頼む。
0117気になる新刊情報
NGNGMore Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
発売予定日は 2001/11/23 です。
価格: ¥4,121
んでこれ。上の入れて5冊全部入っとる・・。
C++ In-Depth Box Set
価格: ¥17,076
発売予定日は 2001/12/07 です。
コードきれいなってるのかな。
Bundle of Algorithms in C++, Parts 1-5: Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms
Robert Sedgewick (著)
価格: ¥8,832
発売予定日は 2001/12/28 です。
0118デフォルトの名無しさん
NGNGとりあえず勉強したいんです、
色々応用の利くような気がして・・・
0119デフォルトの名無しさん
NGNGどう記述したらよいのでしょうか?
0120デフォルトの名無しさん
NGNG0121119
NGNGありがとうございます。
その方法は知りませんでしたが、私がやろうとしているのは
staticではないconst arrayの初期化です。
要素も大量にあるので、すべて記述するのには抵抗があります。
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNGメンバ変数だと mutable が使えるかもね。(場合によりけりだが)
あと Immutable パターンなんてのもある
http://www.hyuki.com/dp/dpinfo.html#Immutable
0124119
NGNGfor(int i=size-1; i>=0; i--) { const_cast<int*>(table)[i] = INITIAL; }
こういうことですね?ありがとうございました。
0126デフォルトの名無しさん
NGNGconst変数つくれないの?
0127デフォルトの名無しさん
NGNG全然作れるが何か?
0128デフォルトの名無しさん
NGNGつくれるよ。初期設定もコンストラクタで簡単にできる。
上のはconst配列の初期設定の話だが別の話か?
0129デフォルトの名無しさん
NGNGコンストラクタでやらなきゃいけないとか?
class A{
public:
const int a=8;
}
ってやるとエラーが出る
0130名無しさん++
NGNG> 値を決めるのを コンストラクタでやらなきゃいけないとか?
そうです。
> 9.2 Class members
> 4 A member declarator can contain a constant initializer only if it declares a static member (9.4) of integral
> or enumeration type, see 9.4.2.
というわけで、次の選択肢からお好きなものをどうぞ。
1. コンストラクタで初期化する。(実体が複数必要な場合)
2. 変数を static にする。(実体が一つ必要な場合)
3. enum にする。(実体は不要で、値だけあれば良い場合)
なお 2 に関して、規格では
class A {
static const int a = 8;
};
という書き方が許されていますが、残念ながらこれは VC ではコンパイルできません。宣言と定義を
分離して、次のように書き換えてください。
class A {
static const int a;
};
const int A::a = 8;
0131デフォルトの名無しさん
NGNG0132デフォルトの名無しさん
NGNG0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNG私は使ったことはありませんが Win32 では CodeWarrier の評判が良いようです。Modern C++ Design
というテンプレートの限界に挑んでるような書籍があるのですが、これのサンプルコードは
- CodeWarrier Pro 6.0
- Comeau C++ 4.2.38
- KAI C++
でテストした、とのこと。
0135デフォルトの名無しさん
NGNGthx!
CodeWarrierかぁ。見直したぜ。
VCもgccも便利だから手放せないけど、もうちょっとテンプレート周りはなんとかならないものか。
0136デフォルトの名無しさん
NGNGこれでもできるよ
---aaa.h---
class A{
public:
A();
~A();
const int a;
}
---aaa.cpp---
#include "aaa.h"
const int a = 8;
A::A() { ... }
A::~A() { ... }
つまりコンストラクタじゃなくても初期化できるよって事
0137136
NGNG思いっきりがいしゅつでした
しかもstatic付け忘れてるし討つだし膿
0138PG
NGNG純粋仮想関数の関数定義は、ANSI/ISOではどういう扱いに
なってるんでしょうか?
gcc だとコンパイルが通って、定義した関数が普通に呼べてます。
0139デフォルトの名無しさん
NGNG意図が良くわからないので、
- サンプルコード
- それが、どう動作するべきだと思うのか? 実際にはどう動作しているのか。
を書いてもらえませんか?
0140PG
NGNGコピペではないので、誤字脱字は勘弁して下さい。
class abst
{
virtual void pvf()=0;
};
void abst::pvf() {}
class deriv : public abst
{
void f() {abst::pvf();} // 呼べる
};
私自身は、どう動作してもいいと思うのですが、
ANSI/ISO での、純粋仮想関数呼び出し時の扱いを押さえて
おきたいと思い、書き込みました。
0141名無しさん++
NGNG純粋仮想関数は宣言だけでなく定義もできたのですね。初めて知りました。
> 10.4 Abstract classes
> 2 (略) A pure virtual function need be defined only if explicitly called with the qualifiedid
> syntax (5.1).
規格書には上記のように書いてあるので、純粋仮想関数を定義した上で、クラス名を明示して呼び
出すことは想定されているようです。
別のスレッドでも書きましたが ANSI C++ の規格書は英語の PDF 版でよければ $18 で購入できます。
こういう事態に備えて、一つ手元においておくと便利かと。
ISO/IEC 14882
Programming languages -- C++
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
0142デフォルトの名無しさん
NGNGコード実際書いてなんの役に立つの。
0143デフォルトの名無しさん
NGNG0144デフォルトの名無しさん
NGNG0145デフォルトの名無しさん
NGNGそのPDFとhttp://www.kuzbass.ru/docs/isocpp/
の内容は異なるのでしょうか?
0146デフォルトの名無しさん
NGNG異ならないよ
まPDF版もってても損はないがコピぺできないようにプロテクトされてないかい
0147デフォルトの名無しさん
NGNG0148デフォルトの名無しさん
NGNGオレもミスって純粋仮想の関数内容書いたことある。
派生クラスでは普通にオーバライドできて動作的に問題は無かった。
だからなかなか気づかなかった。コンパイラはVCとgcc
0149148
NGNGむしろコンパイルエラーにしてほしい・・・。
0150デフォルトの名無しさん
NGNG派生クラスで独自に定義してほしいけど、ディフォルトの実装は用意しておきたい
ときに使います。
ディフォルト実装はprotectedなメンバにしておいてもいいけど、余計なメンバ関数が
増えてイヤな人とかは、定義のある純粋仮想関数を使ったりします。
0151デフォルトの名無しさん
NGNG定義のある純粋仮想をオーバーライドした場合と
普通の仮想関数をオーバーライドした場合で
違いはあるの?
0152デフォルトの名無しさん
NGNGオーバーライドした場合に違いはない
ただ、定義があったとしても純粋仮想関数を持ったクラスの派生クラスは、
明示的にオーバーライドしないと抽象クラスになる
0153デフォルトの名無しさん
NGNGない。オーバーライド「しなければならない」か「しなくてもいい」かの違いだけ。
0155151
NGNGくいちがってないでしょ。
>>153はちょっと言葉が足りないけど。
性格には、インスタンス化するならば「しなければならない」
つまり、オーバライドしなければ抽象クラスになる。
だよね?
0156デフォルトの名無しさん
NGNGこんなエラーでてしまいます
Base.h
class Base{
〜〜
};
Der1.h
class Der1 : public Base{
〜〜
};
Der2,h
class Der2.h : public Base{
〜〜
};
main.cpp
#include "Der1.h"
#inlucde "Der2.h"
Base.h(7) : error C2011: 'Base' : 'class' で示される型としてすでに
定義されています。
どうしたらいいでしょう?
0157デフォルトの名無しさん
NGNG#ifndef か #if !defined つかいなはれ。
0158デフォルトの名無しさん
NGNG#include "Base.h"
#include "Der1.h"
#inlucde "Der2.h"
でいいだろ。
だがそれ以前に、本当に継承しなきゃいかんのかと、聞きたい。
問いつめたい。
0159デフォルトの名無しさん
NGNGなんで?
0161デフォルトの名無しさん
NGNGこんな風に各ヘッダにおまじないしておけば、一度読み込まれたヘッダが
二度読み込まれることがなくなり、再定義errorを防げるんだよ〜。>>157
(INC_BASEとかの名称はお好きなものを)
Base.h
#ifndef INC_BASE
#define INC_BASE
class Base{
〜〜
};
#endif
0162デフォルトの名無しさん
NGNG0163デフォルトの名無しさん
NGNG適当な名前でインクルードガードをつけると、あとでハマルことがあるので注意ね。昔 "Types.h" と
"DLib/Types.h" が両方 _H_TYPES_ というインクルードガード使ってたことが(元々別のプロジェクト
から持ってきたファイルだから、仕方ないんだが)。
私はファイル名と GUID からインクルードガードの文字列を作るプログラムを書いて、使ってます。
0164デフォルトの名無しさん
NGNGK&R嫁。
K&R読んで理解スレ。
0165デフォルトの名無しさん
NGNGC++ スレで K&R 読め、というのは初めて見たが(w
0166デフォルトの名無しさん
NGNGマジデスカ?
0167163
NGNG164 が何を憤ってるのか良く分からんが(_H_TYPES_ なんてつけたの俺じゃないぞ) _ で始まる名前は
使わんほうが良いというのは正しい。ANSI C++ の規格書から抜粋ね。
17.4.3.1.2 Global names
1 Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
letter (2.11) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
0168デフォルトの名無しさん
NGNG__はまるきりだめで
M_aとかも駄目なんですね。
テンプレート仮引数とかも分けたいと思うから
悩み増えます。本当はSGI風のまねたかった。
0169デフォルトの名無しさん
NGNG0170166
NGNGうわ、、、ちょっとビツクリ
_fooみたいなグローバルな名前はダメそうだと思っていたんだけど、
_Foo とか hoge__hoge みたいのはあらゆるところでダメ(であってる?)
ていうのは初耳・・・
で、これってマクロにも当てはまるの?
0171デフォルトの名無しさん
NGNG> で、これってマクロにも当てはまるの?
当てはまるでしょ。
たとえば cygwin だ <errno.h> に関数 __errno() の宣言が書いてあります。もし、ユーザが
#define __errno 1
なんてマクロを定義して <errno.h> を include すると、宣言部分でエラーになりますよね。
それに、標準ヘッダのコードガードとかち合う可能性もありますし。
0173デフォルトの名無しさん
NGNG勉強になりました
3つも方法を教えていただきありがとうございました
0174デフォルトの名無しさん
NGNGおまえは誰だ!?
0175デフォルトの名無しさん
NGNG126の亀さんと思われ
0176名無しサソ
NGNG外のクラスのメンバにアクセスしたいのですが、
class A{
int a
class B{
void b();
}
}
void A::B::b()
{
A::a = 2;
}
でb内でaにアクセスしようとしたら、
「スタティック メンバ関数内の不正なデータ メンバへの参照です」
と言われて、怒られてしまいます(コンパイラはVC6)。
この場合、A::aにアクセスする方法はあるんでしょうか?
0177名無しサソ
NGNG0178デフォルトの名無しさん
NGNGclass A
{
public:
static int a;
class B
{
public:
void b();
};
};
int A::a;
void A::B::b()
{
A::a =2;
};
0179補足178
NGNGたんにstaticメンバ定義方法が間違って板だけ。
0180178
NGNGstaticにしたくないのなら、たとえばこんな方法。
class A
{
public:
int a;
class B
{
public:
void b(A& arg);
};
};
void A::B::b(A& arg)
{
arg.a = 2;
};
0181デフォルトの名無しさん
NGNGA::A() : B(this) { }
ってやるの?
たしか、この位置でthis使っちゃいけないはずだけど
0182デフォルトの名無しさん
NGNGんー、どーもやりたいことが良くわかんないけど
クラスBは何のためにネストしてるの?
AはメンバとしてBを持ってないの?
0183181
NGNGただ、文法的に間違いだと思ったから突っ込んだだけ
0184デフォルトの名無しさん
NGNGまちがってないよ、コンパイルできたし。
>>180で定義されてる void A::B::b(A& arg)をコンストラクタと
勘違いしてない?
0185デフォルトの名無しさん
NGNGたとえばMain関数でAをインスタンス化してもBのインスタンスは
どこにもできない。別途作る必要がある。
だから>>176の意図をもっと聞かないと、どうしたいのか良く分からない。
0186エディタを作ってます
NGNGc=getch()のループでキー入力を取得しているのですが、
altとctrlとescが入ってきません。
こういった特殊なキーを入力するにはどういった関数を使えばいいのでしょうか?
コンソールなので、メッセージ処理以外の方法で教えて下さい。
0187デフォルトの名無しさん
NGNGこっちでやりましょう。
http://pc.2ch.net/test/read.cgi/tech/1003418249/
0188shige
NGNG0189login:Penguin
NGNG> JISのC++の規格ってないの?
あるよ。http://www.jsa.or.jpで買いな。一度見たければ赤坂へ行け。
>>145
> そのPDFとhttp://www.kuzbass.ru/docs/isocpp/
> の内容は異なるのでしょうか?
違う。そのURLのはfinal draftだから、最後の修正が反映されてない。
ISOの著作権が発生する直前の版。この版はPDF, PS, HTML, TEXTが揃っている。
0190189
NGNG0191名無しサソ
NGNG>185
スマソ。書き忘れです。
class A{
int a
class B{
void b();
}
B *b;
}
と言う感じで、Bのポインタを持たせて、Aのコンストラクタが
呼ばれた時点でnewしようとしています。クラスBは継承された
描画関数で、Aは物体です。で、Aを描画するために、Bで継承
してオーバーロードした関数内に、Aのメンバ変数が欲しいな、と・・・。
AはBと大きく違うし、複数のBみたいなクラスを持っているので、
描画クラスから継承したくはないと思っています。
初期化したときにクラスAのポインタをコンストラクタでクラスB
に突っ込む事で動作するようにはなりましたが、こんな汚い方法
以外で出来ない物かと。
0192デフォルトの名無しさん
NGNG外で定義したほうが、変な制約つかなくていいと思うのだが。
0193192
NGNGclass Picture
{
public:
int data[256];
};
class Canvas : class Graphics
{
public:
void Draw(Picture& p){/*pをCanvasに描画*/}
};
int main()
{
Canvas canvas1;
Canvas canvas2;
Picture pic;
canvas1.Draw(pic);
canvas2.Draw(pic);
return 0;
}
0194デフォルトの名無しさん
NGNG描画対象のオブジェクト
描画方法
それぞれ独立したクラス階層で管理して、最終的にまとめたい、と。それだとコンポジション使う
場面だと思うなぁ。
class AObject { /* */ };
class DrawImpl1 { /* */ };
class DrawImpl2 { /* */ };
struct ObjectInterface {
virtual void doSomeThing1() = 0;
virtual void doSomeThing2() = 0;
/* */
};
class A
: public ObjectInterface
{
AObject aobj_;
DrawImpl1 draw1_;
DrawImpl2 draw2_;
void doSomeThing1() {
draw1_.doSomeThing(aobj_);
}
void doSomeThing2() {
draw2_.doSomeThing(aobj_);
}
};
0195192
NGNG正 class Canvas : public Graphics
0197名無しサソ
NGNG仕様を使い切れてない物で・・・。
>192
>193
言われていることを見ると、外のクラスのメンバにアクセスできる
訳じゃないので、ネストは確かに間違いっぽいですね。
要は、そのmainで定義・処理されている部分を隠蔽したい(canvas
をpic内部に持ちたい)、と言う話なんですよ。となると、>194で
書かれている方法に切り替えた方が良さそうですね。
0198
NGNGって無害だったっけ?
即答で頼む。
0199sage
NGNG0201
NGNGメニューをつけたりできるようなクラスないですか?
0202
NGNG昼休みが終わっちゃう!!
0203名無しさん
NGNGなんすか、コレ
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGcout << i++ << i++ << i++ << endl;
の動作の合理的な説明してください。
0206デフォルトの名無しさん
NGNGnewt
0207デフォルトの名無しさん
NGNGお?てっきり012って出力されるかと思ったんだけど
210って出力された。なんで?
0208無名λ式
NGNG(((cout.operator<<(i++)).operator<<(i++)).operator<<(i++)).operator<<(endl);
http://www.gotw.ca/gotw/055.htm
Objectをpost-incrementしたい、かつ、post-increment演算子を一つの定義で済ませたい。
0209デフォルトの名無しさん
NGNGそれで207のようになるのは不思議。
これは不定ってことだよね?
0210デフォルトの名無しさん
NGNG>>209
コンパイラによって結果が違うの?
ちなみに私はLinuxのGCCでコンパイルして試しました。
0211デフォルトの名無しさん
NGNG結合順序の問題だから、不定ってことは無いと思われ。
0212デフォルトの名無しさん
NGNG職業プログラマさん達には常識的な知識なのかな?
私はただいまC++勉強中なんで208を理解するには
時間がかかりそう。
0213デフォルトの名無しさん
NGNGそういうことですね。
式中の副作用(side effect)が実行される順序は、いくつかの場合を除いてほとんど不定と思ったほうがよい。
VC++だと、副作用が確定するシーケンスポイントはこんなふうに規定されてます。
http://www.microsoft.com/JAPAN/developer/library/vclang/_pluslang_c.2b2b_.sequence_points.htm
gccの場合の規定はどこに書いてあるかわかんなかった。
0215デフォルトの名無しさん
NGNG今度のプロジェクトでSTLの使用禁止令が出てしまった。
用意されてるのはイテレータも無い、出来の悪いlistとmapだけ。
vectorを使いたいと言ったら、代替クラスを作れだと。
STLportでいいじゃん・・・。
愚痴スマソ。
0216デフォルトの名無しさん
NGNG理由はなんなんだい?
0217デフォルトの名無しさん
NGNG不定というか、処理系依存というか。
いずれにしろ、そういうコードは書かない方が。
0218デフォルトの名無しさん
NGNGbbbbatttooのような文字列をb5a1t3o2のように文字種と連続回数で書き表すことによって
文字列の長さを圧縮する方法を連長圧縮という。
aからyまでの文字を1文字づつ入力として受け付け、zが入力されるまでこれを繰り返す。
連長圧縮を行って結果を出力せよ。
例:入力 a
a
u
出力 a2u1
やり方がぜんぜんわからないので、教えてください。
0219デフォルトの名無しさん
NGNGSTLのvectorのコードそのまま持ってきて「代替クラスです」って言い張るとか。
0220デフォルトの名無しさん
NGNGまず連長圧縮の内容を理解する
↓
(プログラムでやる代わりに)自分の頭でその処理をやるとき、どういう風にやるか考えて、紙に箇条書きする
↓
そのままプログラム化
↓
(゚д゚)ウマー
0221デフォルトの名無しさん
NGNGcharを使うんですよね?
0222215
NGNG既存のSTLのvectorを使いたいなら、
・信頼性を証明して
・性能を検証して
・是非使いたい理由を提示しろ
ということらしい。
auto_ptrならともかく、vectorだったら問題ないと思うんだけど・・・。
ちなみに会社はF系列です。ここはこんなんばっか。
驚くことに、stringの代替クラスまでありました。
素直にstring使えよ・・・。
0223デフォルトの名無しさん
NGNG既存のvectorの代わりに自分で作った代替クラスなら
信頼性があるんだ・・・・・・ふーん。へーぇ。
ぜひ使いたい理由:
「既にあるものを使わず同じ物を新しく作ると、無駄な時間がかかる。
無駄な時間がかかるということは、無駄な金(人件費)がかかる。
我々には無駄に浪費できるほど金が余っているのでしょうか?」
金が余ってるなら、それでいいです。別に異議はありません。
0224デフォルトの名無しさん
NGNGランレングス圧縮は簡単よ。
この前までちゃんとソースも提供したり、書き上げたりもしたけど、
これじゃ学生クンのためにはならないと気づき、ヒントのみにするヨ
ランレングス圧縮は、連続した文字列を記号と数で表現するものナノヨ。
例えば、aaaabbcだと、a4b2c1となるわけネ。
アルゴリズムは
1:n = 1
↓
2:文字を受け取る
↓
3:文字列(ファイル)の終端?
YES→goto 9 NO→goto 4
4:次のに取得される予定の文字は同じ文字か?
YES→goto 5 NO→goto 7
5:nをインクリメント
↓
6:goto 2
7:"入力された文字"'n'を出力
↓
8:goto 1
9:"入力された文字"'n'を出力
↓
10:end
ソラで書いたから間違ってるかもネ
0225224
NGNGランレングスヤッターヨ。あの頃はPC98でした・・・
鮪真似たりいろいろやったよ。
今じゃ一端のアウトローなゲームプログラマですわ(;´Д`)
ガンバレ学生タン!
0226名無しさん
NGNG列(A,B、C,・・・)を選択するには
どうしたらいいでしょうか?
普通にやるとA列のみに格納されます。
0227デフォルトの名無しさん
NGNGプラットフォームが書いてないけど、
特殊な環境向けならコンパイラちゃんとしてなくてもおかしくないし。
それでSTL使って問題が起きた時に、
「STLのバグなのでどうしようもありません」とか言われると困る。
0229デフォルトの名無しさん
NGNG標準じゃなくて、STLPort使用するようにすれば?
こっちは実績もあるから。
0231デフォルトの名無しさん
NGNGやっぱりランレングスのプログラムだけはうまくかけません。
大体わかったのですが、一度にすべての文字を出力する方法がわかりません。
たとえば、a3d2f1のようにできないのです。
この問題だけは終わらせないとマズイのでマジでヘルプです〜。
0232デフォルトの名無しさん
NGNG答えが知りたい?
0233デフォルトの名無しさん
NGNG224の方針でプログラムが書けたんだね?じゃああとは、
結果を逐一coutに出力せずに、適当なstrstreamに出力するように変更。
最後にその内容を一気にcoutに出す。てなかんじでオーケー。
0234ゲイ2
NGNGCreateFontIndirect(&lf)
LOGFONT lf;
の使い方教えてください。
0235デフォルトの名無しさん
NGNGMSDN読めばわかる。で、もし続けたいならこっちのスレで。
「Win32AP質問箱」
http://pc.2ch.net/test/read.cgi/tech/991576947/l50
0236デフォルトの名無しさん
NGNGを使って疑問に思ったのですが
何でこれでクラス配列に割り当てたメモリが全て解放されるのでしょうか?
それと、delete base
で、baseが派生型へのポインタの場合(実体は違うクラス)
問題が生じますか?
0237デフォルトの名無しさん
NGNG割り当てたアドレスの始端 & 割り当てたサイズ
が把握できていれば型は関係ないと思うが。C/C++では配列 = ポインタ
として扱うことができることから類推できないか? 配列といっても
JavaやC#なんかとは違う。
0238デフォルトの名無しさん
NGNG実装によると思うけど、メモリブロックのサイズを調べて、
その先頭から最後まで順にデストラクタを適用するだけじゃない?
VC++でアセンブリコード吐かせてみたらそうなってた。
baseのデストラクタがvirtualなら問題なし……だと思ったが。
0239デフォルトの名無しさん
NGNGまだ、私はメモリがどう扱われているかわかっていないようです
メモリブロックのサイズを調べるのは,コンパイラですよね
>割り当てたアドレスの始端 & 割り当てたサイズ
a[10]
だと、aがベースアドレスで
配列の添え字と型で、アクセスするアドレスを決定するのですよね?
だから、
delete a[10]
ならわかるのですが
delete [] a
というところが,納得いかないのです
例えば
del(A a){
delete [] a;
}
なんてのもありなわけです
0240デフォルトの名無しさん
NGNGコンパイラは変数の型を知ってます。
0241デフォルトの名無しさん
NGNG言語仕様です。
0242デフォルトの名無しさん
NGNG| メモリブロックのサイズを調べるのは,コンパイラですよね
よくある実装ではメモリブロック自身にサイズ情報が含まれており
delete[]が実行時にメモリサイズを調べている。
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNGシステムコール使う以外ないでしょ
0245デフォルトの名無しさん
NGNGstd::listとstd::map を例外安全かつ中立な実装にできないかな?
型引数として渡されるクラスが例外安全・かつ中立であると
仮定しての話でよいです。
すでに、例外安全だったら素マン。出直してくる。
0246デフォルトの名無しさん
NGNGありがとう〜。
ネタでなくドキュソを承知で聞きます。システムコールってなあに?
0247デフォルトの名無しさん
NGNGへどうぞ
0248デフォルトの名無しさん
NGNG話についてけない厨房ですんません。
例外安全でない実装ってどのあたりか教えてー。
0249245
NGNG複数要素の挿入を除いては安全かつ中立であると、書いてあった。
というわけで、出直してきます
0250デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG用語がわからん
0253245
NGNG例外発生時にもリソースが適切に解放され、かつ一貫性が保たれること
例外中立
例えが委を処理しない場合、呼び出し側で処理できるようにその例外を伝えること。
C++を使う上で設計にも関わるくらい大切なことみたい。
>>250の本を読んでみてね。
0254デフォルトの名無しさん
NGNG> 例外安全
> 例外発生時にもリソースが適切に解放され、かつ一貫性が保たれること
「リソースが適切に解放され、かつ」は冗長。
0255252
NGNG・・・それって、当たり前にそうあるべきことじゃないの?
0257デフォルトの名無しさん
NGNG演算子オーバーロード。
テンプレート。
これらのキーワードと例外処理くんの民族紛争の話です。
0258デフォルトの名無しさん
NGNGhas_a(インスタンス保持)ってあるじゃん。
あれの使い分けがようわからん。
なんかhas_aばっかしになる私はDQN?
0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNGエクセプションセーフの方が良かったかも
いや例外セーフか。
やっぱ例外安全か。
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNG委譲やコンポジションを使いこなしているならOK
0263ななし
NGNGCMap <int,int,CArray,CArray&> Fx;
って宣言すると,CArrayが引っかかる.なぜ?
使い方が根本的にまちがってるのかつら?
0264デフォルトの名無しさん
NGNGCMap<int,int,CArray<int,int>,CArray<int,int>&> Fx;
0265デフォルトの名無しさん
NGNGいいえ。
例外安全にしようと思うと、メソッドのインターフェースから制限されてしまう場合もあるし、特に
テンプレートが絡む場合には設計の難易度が上がります。例外が発生したら「例外が発生し
ました」という情報だけ伝えることにして、例外を発生させたインスタンスは以後は使えないこと
(デストラクトだけは可能)にするという選択もアリです。
0266デフォルトの名無しさん
NGNGこれってみなさん何て呼んでます?
0267デフォルトの名無しさん
NGNGhttp://www.shindich.com/sources/c++_topics/exceptions.html
の定義だと、
例外安全 - 例外時のオブジェクトの状態を保持する
例外中立 - 知らない例外は全て遺伝させることを保証する
とある。 例外安全はDBのロールバックみたいな物だね。
>>265
コンテナが例外発生後は使えないようになるなんていう設計だとかなり
苦しいと思うけど。使えないようになるってことは、以降にアクセスした
スレッドに対してまた「使えません」と例外投げるってことだろう
からかなりやばい例外でない限りコスト的に見合わないような気がする。
例外中立って例外安全に対する机上の比較ネタじゃないの?
0268デフォルトの名無しさん
NGNG適切にデストラクトできるという保証をするには、
それなりのコストがいるので、どうせやるならはじめから
強い保証を行うべきだと思ってる。
たとえばスレッドのハンドルを管理するmapのようなコンテナクラスが
あったとして、新しいスレッドの追加時に例外が発生したら、
それ以降はデストラクトしかできませんよ、というわけにはいかないよね。
mymap<threadhandle> threadmap;
threadmap.insert(CreateThread()); // ここで死んだらどうする?
単純なクラスであればそれもいけるかもしれないけど、
すべてがすべて、失敗したらプログラムも終わり(後始末も無し)
ってわけにはいかないよ。
0269デフォルトの名無しさん
NGNGストリームとは何なんでしょうか?cout等はストリームを操作しているらしいのですが・・・・・
いまいちピンときません。
tcpのストリームとは全く違った概念なんでしょうか?
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG> 単純なクラスであればそれもいけるかもしれないけど、
> すべてがすべて、失敗したらプログラムも終わり(後始末も無し)
そもそも 265 は
「すべてのクラスが堤外安全」でなくてもいい
であって、
すべてのクラスが「例外安全でなくても」いい
ではないと思われ。
リソースとしてメモリしか使わないコレクションクラスの類はともかく、ハードウェアと密接に絡むような
操作だと、一度発行したら容易には元に戻せないこともあるし。
0272デフォルトの名無しさん
NGNGhttp://yougo.ascii24.com/gh/38/003826.html
先頭から順番に、シーケンシャルに、データを読むことを
ストリームと言うね。
UNIXの標準入出力と言うと、コンソールやらファイルやら
プロセス間のやりとりやらをすべてストリームとして
扱うとこのできる仕組み。
coutは標準出力を扱うインスタンス。
0273デフォルトの名無しさん
NGNGレスありがとうございました。勉強になります。
0274デフォルトの名無しさん
NGNGどのようにすればいいんでしょうか?
教えて下さい
0275デフォルトの名無しさん
NGNG64ビットの整数演算は「long long」や「__int64」などで使える場合が多いです。
(処理系によって違うので、ドキュメントなどで調べてください)
64bit以上の数十、数百桁の演算を行う場合は、それ用のライブラリを用意する必要があります。
ネットで公開されていると思いますので「多倍長」などの言葉で検索をかけてください。
0276デフォルトの名無しさん
NGNGありがとうございました。自分はUNIXでやってるんですけど
long long int a=10000000000
みたいな感じでいいんでしょうか?
0277デフォルトの名無しさん
NGNGgccだったら、それでOKです。
printf()なんかで表示するときは、%dじゃダメっぽいので、
気をつけてください。
0278デフォルトの名無しさん
NGNGsyukudai.cpp:17: integer constant out of range
syukudai.cpp:17: warning: decimal integer constant is so large that it is unsigned
0279デフォルトの名無しさん
NGNGビット長は処理系依存なので、環境も明記したほうが良いと思われ。64bit 版 Solaris だと long で
64bit, int 32 bit だったりするし。
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNG1000000000 とか書いても、それは「int 型の定数」だから。整数の型を明示したければ、適切な
サフィックスを付けないとダメ。
>>280
で、CPU は Alpha なんですか?
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNGx86 アーキテクチャの Linux だと、int 32bit, long 32bit, long long 64bit ですね。gcc では long long 型の
整数定数は、サフィックス LL をつけることになっています。
long long int a=10000000000LL;
これで試してみてください。
0284デフォルトの名無しさん
NGNGigoire : アイゴイレ tolower : トゥロワー boolalpha : ブーラルファ
全部てきとー・・・
0285デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNGどういう相互変換よ? 文字コード含めた変換はプラットフォーム
依存のAPIかライブラリつかえや
0287デフォルトの名無しさん
NGNGmbstowcs, wcstombs
0288デフォルトの名無しさん
NGNG面白いかどうか聞きたいのですが。
0289名無しさん@Emacs
NGNGオライリーのやつ?あれは「面白い」かどーかだったら「面白くない」と思うよ,漏れは.
Effective C++ とかの方が面白いと思うけど.
まぁ悪くは無いけどね.
0290デフォルトの名無しさん
NGNG0291デフォルトの名無しさん
NGNGそっか。ありがと。
Effective C++はとっくに読んでるので、
とりあえず、Exceptional C++読むことにするよ。
0292デフォルトの名無しさん
NGNGseylocaleを忘れるとハマるよね‥‥
0293デフォルトの名無しさん
NGNG0295デフォルトの名無しさん
NGNG無い.
C++ Gems あたりで
/* final */ とコメント入れてるのを見たことがある.
ドキュメネトでやるしか無いってことね.
0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG周波数を指定してスピーカーから音を出そうとして、
Web上でサンプルを検索したところ、
http://www.thevine.net/~hopkins/seth_cpp.html
のようなページを見つけ、早速コンパイルしてみました。
ですが、「未定義の関数soud」というコンパイルエラーがでてしまいます。
dos.hのファイルをみたところ、soundなどの関数はありませんでした。
サンプルではBorland C++ 4.xを使っているようですが、
これより上のバージョンでサポートしなくなるということはあるのでしょうか。
また、周波数を指定して、音を出すために、他に簡単な方法はありますでしょうか。
以下、HP上のサンプルコードです。
#include <stdio.h>
#include <dos.h>
void main() {
int x;
printf("\n\n Are we having fun yet? \n\n");
for (x=50; x<2000; x++) {
sound(x);
delay(3);
}
nosound();
}
0299デフォルトの名無しさん
NGNG何かいい本ないでしょうか?
0300デフォルトの名無しさん
NGNGとりあえずプログラミング言語C++読んでから聞け
0301名無しさん
NGNGN01 68 56
N02 74 79
N03 39 56
出力で
N01 68 56 144
N02 74 79 153
N03 39 56 95
としたいんです。
で、宣言を int n [3];
として while (k<=3)
z=x+y
k=k+1
としてみたんっすけどうまくいきません。
助言ください。
当方殆ど初心者です。
0302デフォルトの名無しさん
NGNGわかりやすくいうとだな、
どういうメッセージが表示されたか書きなさい。
どういうプログラムを書いたのか書きなさい。
だ。
0303デフォルトの名無しさん
NGNG何がどううまくいかないの
0304デフォルトの名無しさん
NGNGVC++で以下のようなインターフェースのDLLを作りました
#include <vector>
using namespace std;
__declspec(dllexport) void WINAPI Foo(vector<string>& arg)
{
arg.pushback("AAA");
}
これを他のC++コンパイラ(C++Buiilderとか)でビルドしたEXEから
上記DLLのエクスポート関数を正常に処理することは可能でしょうか?
試してみたところ、上記関数を実行した時点でGPFが起こります。
コンパイラによって当然vectorの実装方式が違うため、
無理な気がするのですが気のせいでしょうか...
板違いかもしれませんが、宜しくお願いします
0305デフォルトの名無しさん
NGNG調子が悪いんです。
いつもは朝起きてご飯食べて学校に行ってるんですが、
調子が悪いんです。
なんて説明するのか?
0306デフォルトの名無しさん
NGNGヒープ管理の問題もあるから、あなたの言うとおり、絶望的。
というかC++のクラスをdllexportするのは、たとえ同じコンパイラ
であてもちと気持ち悪い。
安直にはCのみになるのかな。当然vectorとか使えない。
がんばりたければCOMだろうけど・・・疲れるよ
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNGレス有難うございました。
やっぱり、そうですね。本当にバイナリレベルの互換
を望むならCOMでしょうが・・・確かに疲れますしねぇ
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNG0313310
NGNGありがと
0314デフォルトの名無しさん
NGNG表示できるツールってVC以外で無い?
コマンドラインアプリでも良いんだけど・・・
0316デフォルトの名無しさん
NGNGありがとう
Turbo Debuggerはできるんだね
でもあれってユーザ登録が必要でしょ?それってちとイヤンな感じ
0317デフォルトの名無しさん
NGNGたまにメールが来るだけだから気にするこたぁない
それも嫌ならすぐ登録解除でもすれば?
0318デフォルトの名無しさん
NGNGそうだね試してみようかな
でもよさそうなの見つけたよ
フリーだしオープンソースらしい
SourceNavigator
http://sources.redhat.com/sourcenav/
まだちょっとしか使ってないけどGUIがTkなんで遅いし
不安定っぽいが機能はかなりいけてる
0319ルビ厨な入
NGNG0320デフォルトの名無しさん
NGNG0321デフォルトの名無しさん
NGNGchar a='/0';
とするのと
char a;
*a=0;
とするのは同じ事となる?
0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNGまず /0 (スラッシュゼロ)ではなく \0 (バックスラッシュゼロ)。
NULL ではなくヌル文字といい、文字配列の終端を表す。
規格上 char ポインタの文脈で使われる 0 はヌル文字に変換されることになっている。
0324デフォルトの名無しさん
NGNGそれじゃ意味が全然違うというかコンパイルとおらないんじゃ?
char a='\0';
と
char a;
char *p = &a;
*p = '\0';
なら同じことです。
'\0'とNULLは違うものです。
'\0'はキャラクタコードでNULLはポインタ。
0325デフォルトの名無しさん
NGNG> 規格上 char ポインタの文脈で使われる 0 はヌル文字に変換されることになっている。
「char ポインタ」じゃなくて「char」の間違いだよね。
0326デフォルトの名無しさん
NGNGフォローサンクス。書いてから気付いた。
char ポインタの文脈だとメモリ壊れるね(笑
0327日本@名無史さん
NGNG> NULL ではなくヌル文字といい、文字配列の終端を表す。
「文字配列」じゃなくて「文字列」の間違いだよね。
0328デフォルトの名無しさん
NGNG実際問題として
'\0'とNULLはどっちも 0 だから混同してもコンパイルできたり
正常に動いたりはする。
でも処理系によってはトラブルの元になるからちゃんと区別して
使わないとダメ。
0329デフォルトの名無しさん
NGNG処理系依存だからというのも理由の一つだが、ソースコードを読んで
ポインタなのか
文字型なのか
それとも整数の 0 なのか
が一発で分かるので、読みやすくなるというのも少なからぬメリット。もっとも C++ だと
#define NULL 0
って処理系がほとんどだが、その場合 foo(NULL) で foo(int) が呼ばれる点だけは注意が必要。
0330321
NGNGとするのと
char a;
&a=0;
ですね、すいません
で結論としては
char a='\0';
と
char a=0;
が同じなんですね
0331デフォルトの名無しさん
NGNG前者はやってることが違う。
a = '\0'はaに値を代入している。
&a = 0; はaのアドレスを0で上書きしている。こんなことはしてはいけない。
後者はまぁオッケー。
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGsize_t は?
0334デフォルトの名無しさん
NGNGそういうときには、論拠も示してくれると助かるんだが。
0335デフォルトの名無しさん
NGNG人に聞く前に
http://www.kuzbass.ru/docs/isocpp/
の全ページを見てNULLについての記述があるかないか目を皿のようにしてしらべましょう
0336デフォルトの名無しさん
NGNG手元には ISO C++ の規格書がありますが、これには 18.1 で NULL は C++ null pointer constant だと
明記してありますな。
0337デフォルトの名無しさん
NGNGオタッキーなデブになってはいけません
0338オタッキーなデブ
NGNG0339デフォルトの名無しさん
NGNGネタは sage てな。
それとも NULL の定義や、整数型とポインタ型の比較についてディープに語りたい?
0340デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNGディープに語れるのですかッ?
0342デフォルトの名無しさん
NGNG0343デフォルトの名無しさん
NGNG__null は何型のヌルポインタにもなるけど整数には変換できないみたいな。
規格違反?
0344デフォルトの名無しさん
NGNG__null は何型のヌルポインタにもなるけど整数には変換できないみたいな。
0345デフォルトの名無しさん
NGNG0346デフォルトの名無しさん
NGNG-4- The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (conv.ptr).*
[Footnote: Possible definitions include 0 and 0L, but not (void*)0. --- end foonote]
NULLはnull pointer定数なんだねえ。
0347デフォルトの名無しさん
NGNG念のため、キーワードではなく単なるマクロなのでよろしく。
0348デフォルトの名無しさん
NGNGISOで定義されているというのはデカいな。
0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNGint WINAPI WinMain(...)
{
std::string str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
コレだけのプログラムで、BoundsCheckerが4800バイトのメモリリークを検出します。
他の方はどうですか?
ビルドに失敗したんじゃないかと心配です
0351デフォルトの名無しさん
NGNG漏れのところもそうなるよ。
stringの数だけリークしてるわけじゃないから、メモリプールじゃないか?
無視して問題ないと思うが、他人の回答も欲しいからage
0352デフォルトの名無しさん
NGNGかなりがいしゅつ。リークではない。
ロケールだかなんだかのために、STLportが
最初の一回だけ確保するメモリだ。
厳密に言えばboundscheckerの言うとおりリークだが、
深刻なリークではない。
プロセスが終了すれば解放されるので気にしないでよい。
0353デフォルトの名無しさん
NGNG確かに既出だが、細かい話はこのスレじゃなくて STL スレでやってた気がする。
0354デフォルトの名無しさん
NGNG簡単にできますかね?
0355デフォルトの名無しさん
NGNG精度にもよるがおおむね処理系依存。
0356デフォルトの名無しさん
NGNG0357デフォルトの名無しさん
NGNG仮想関数=Javaのすべてのメソッド
C++の非仮想関数に相当する物はJavaに無いよ
0358デフォルトの名無しさん
NGNGあえて挙げれば final か?
微妙に違うけど。
0359デフォルトの名無しさん
NGNG明示的にデストラクタを呼ぶときに、そのクラスが X だとすると、
this->~X();
って書いてある。this-> っているだろうか?
0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNG目にふれているはずなのだけど、やはり this-> はただの
飾りなのかな?
非 virtual なメソッドから virtual なメソッドを呼び
出していることを明示してるだけの気はするが、何か深遠
な理由があるのではないかと勘ぐってみたり。
0362デフォルトの名無しさん
NGNGthrow new classA
で
catch(classA* a)
ってうけとるのと
�A
throw classA
で
catch(classA &a)
ってうけとるのと
なにがどうちがうの
�@はdelet aするけど
�Aはしなくていいの?
0363デフォルトの名無しさん
NGNG0364デフォルトの名無しさん
NGNGそしたら�Aのほうがぜったいつかいやすいとおもうんだけど
どーして�@のようなそーすがおおいの?
0365デフォルトの名無しさん
NGNG多いか? MFC は過去のしがらみがあるので catch (CException*) だが、それ以外で例外を
new で投げてるのは、私の周囲では見ないよ。
0366デフォルトの名無しさん
NGNG0367デフォルトの名無しさん
NGNGそーなんだ ありがとー
それで、もひとつしつもんだんだけど
�AでthrowしたclassAはどのじてんできえてなくなるの?
catchしたばしょでまたthrowしたかったとき?
0368デフォルトの名無しさん
NGNGまちがえた!
catchしたばしょでまたthrowしたかったとき?
↓
catchしたばしょでまたthrowしなかったとき?
0369デフォルトの名無しさん
NGNGオブジェクトはスコープの終わりで解体される
0370デフォルトの名無しさん
NGNGSTLを勉強したいのですが、お勧めの本はありますでしょうか?
0371デフォルトの名無しさん
NGNGの時点で生成されたインスタンスを仮に a とする。
a はコピーコンストラクタで一時的にコピーされる(bとする)。
throw 文が実行終了したので a は破棄される。
catch に突入。
ここで受け取る方法が参照の場合は、b を参照する。
参照でなければ、もっかいコピーコンストラクトされる。
catch 終了時点で b は破棄される。
って感じだと、勝手に思ってます。規格を調べたわけではない。
0372デフォルトの名無しさん
NGNGC++標準ライブラリについて知りたいならプログラミング言語C++を。
STLに限るなら「標準テンプレートライブラリによるC++プログラミング」あたり?
0373デフォルトの名無しさん
NGNGすでに移転済み。
推薦図書/必読書のためのスレッド in プログラム板
http://pc.2ch.net/test/read.cgi/tech/1005897052/
0374デフォルトの名無しさん
NGNGくわしいせつめいありがとー
じゃあまたまたしつもんだけど
classA;
がもし
int i[10000];
ってゆーくらすへんすう?をもってたら
やっぱり�@のほうがいいのかなー??
0375デフォルトの名無しさん
NGNGint i[10000];
ってゆーくらすへんすう?をもってたら
↓
すごーくいっぱいめもりつかってるからもったいないとか、
こぴーにじかんかかるとか
そーゆーいみです
わかりずらい?
0376デフォルトの名無しさん
NGNG読みにくすぎ。漢字を少しは使おう。
漢字を使いたくなければ単語の間を適当にスペースで区切るか、英語で書いてくれ。
0377デフォルトの名無しさん
NGNG御免なさい
0378デフォルトの名無しさん
NGNG例外発生時にコピーコンストラクタが呼ばれるなんて聞いたこと無いが?
0379デフォルトの名無しさん
NGNG>throw classA;
>の時点で生成されたインスタンスを仮に a とする。
>a はコピーコンストラクタで一時的にコピーされる(bとする)。
>throw 文が実行終了したので a は破棄される。
classA がもし
int i[10000] あるいはもっと大きいクラス変数?を持っていた場合
一時的にコピーされる際の、時間・メモリ大きさのことを考えると
やはり�@のようにポインタを投げる方が良いのでしょうか??
話しはそれますが(コピーコンストラクタもよく知りません)
コピーコンストラクタでコピーされる内容は
仮に classA が持っているクラス変数?がポインタの場合、
コピーされるのはそのポインタのみでしょうか?
下記の *a の値は、どうなるのでしょうか?
class classA{
intr* p;
classA(){
p = new int;
*p = 10;
}
~classA{
delete p;
}
}
これを throw classA した場合
catch(classA &a) で受け取った
a の持つ *p の値は保証される(この場合値は10になるのか)のでしょうか?
0380デフォルトの名無しさん
NGNG下記の *a の値は、どうなるのでしょうか?
↓
下記の *p の値は、どうなるのでしょうか?
0381デフォルトの名無しさん
NGNGVC++ だと、catchが参照なら、コピーコンストラクタ呼ばれない。
catchが実体なら、コピーコンストラクタ呼ばれる。
C++Builder だと、catchが参照なら、コピーコンストラクタが1回呼ばれる。
catchが実体なら、コピーコンストラクタが2回呼ばれる。
gccは試してない。
テストコードはこんな感じ↓
#include <stdio.h>
class A{
public:
A(){ printf("constructor %p\n", this); }
A(A&){ printf("copy constructor %p\n", this); }
~A(){ printf("destructor %p\n", this); }
};
void f()
{
throw A();
}
int main()
{
try{
f();
}catch(A a){
}
return 0;
}
0382デフォルトの名無しさん
NGNGというわけで、保証されません。
上手く動くこともあるけど、上手く動かないこともある。
潜在的なバグですな。
コピーコンストラクタを書くべき。
ついでに代入演算子も書くべき。
このように↓
class classA{
intr* p;
classA(){
p = new int;
*p = 10;
}
classA(const classA& a){
p = new int;
*p = *a.p;
}
~classA{
delete p;
}
classA& operator=(const classA& a){
*p = *a.p;
return *this;
}
}
0383デフォルトの名無しさん
NGNGだとしたら型が変わる可能性があるぞ?
class a {};
class b : public a {}
void f(){
try {
throw b();
}
catch( a aa ){
aa は b ニアラスズ
}
}
0384デフォルトの名無しさん
NGNGそれ terminate() されないか?
0385デフォルトの名無しさん
NGNG一度 b のコピーコンストラクタでコピーされたあと、
a に変換されて catch が実行される。
たぶん throw b(); の b() で生成した一時オブジェクトは、
throw 文の終了時点で消滅する理屈なのかなぁと。
コピーして取っておかないと、元のオブジェクトは消滅して
catch ブロックで使えない。
0386デフォルトの名無しさん
NGNGなるほどー
とっても勉強になりました。
ありがとうございました。
0387デフォルトの名無しさん
NGNG>>382 の classA を 継承する classB を throw し、
catch(classA &a) や catch(classB &b) できるようにする場合の
classB はどう書けばいいんだろう???
classA と同じようにコピーコンストラクタと代入演算子も書くべきなのかなー??
寝ながら考えてみます。
0388383
NGNG383については「スライス」の問題で
別件です。
0389デフォルトの名無しさん
NGNG基本的に多くの場合、書くべきだと思うけど?
書かなくても自動生成されるけど、これはC++の罠だし。
0390デフォルトの名無しさん
NGNGNULL の話は、結局、こっちで盛り上がりました(数日前から狙ってたんだが、人が集まったのが
向こうだったので)
http://pc.2ch.net/test/read.cgi/tech/982758107/774-875
しかし
- C++ の標準規格で NULL が null pointer constant と規定されている
- その値は整数型で 0 と等しい (0, 0L など)
したがって #define NULL ((void*)0) は規格違反
ということを知らない人が、わりと多かった気がする。
0391デフォルトの名無しさん
NGNGどうでしょう。
例外の説明でスタックの巻き戻しとか出てくるけど
return文だって同じことするのになぜだろう。
0392デフォルトの名無しさん
NGNGreturn は呼び出しもとの関数に戻るけど、throw は catch されるまで一気に戻るのが違い。
throw は C なら return よりも setjmp, longjmp に近いと思われ。
0393デフォルトの名無しさん
NGNGたとえばこんな感じかな。
void f1()
{
try{
f2();
}catch(...){
}
}
void f2()
{
f3();
}
void f3()
{
f4();
}
void f4()
{
throw 0;
}
どこまで戻るかが違う。
0394デフォルトの名無しさん
NGNGプログラミング言語C++買ってきました
7000円は痛い・・・
0395デフォルトの名無しさん
NGNG今後3年は使えると考えて、1年に2000円なら安いもんだ
0396デフォルトの名無しさん
NGNGおおなるほど。
ってreturnでも一緒じゃん!
0397デフォルトの名無しさん
NGNG>>396
>ってreturnでも一緒じゃん!
違うよ。もっと考えてみて。実行してみるのが一番だよ。
もし良かったら、今後の参考のために「一緒」と思った理由を教えて。
0398デフォルトの名無しさん
NGNG0399デフォルトの名無しさん
NGNG0400デフォルトの名無しさん
NGNG2回目以降はvftableのようなものを経由しないで呼び出したいのですが、
どうすればよいでしょうか?
0401デフォルトの名無しさん
NGNG0402デフォルトの名無しさん
NGNG0404401
NGNGほぼ call [vtable+n] です。
さて、インスタンスが変化しないのでそれを経由せずに
自分でポインタで関数を管理したとします。でも
インスタンスは当然一つではないので、それぞれの
インスタンスにポインタが必要です。
コレを呼び出す手間は最小で call [footable+pointeraddress] です。
言語側の仮想関数と自前のポインタ処理は同じような機械語になります。
よって呼び出しを自前で処理してもあまり意味がないと思うのですが。
そうでもないのかな?
0405デフォルトの名無しさん
NGNG1 仮想関数にするのをやめる。仮想関数でなければ、オブジェクトのクラス名とメソッド名から、
呼び出すコードが一意に決まりますから vtbl 引きませんし、うまくいけばインライン化できま
す。コンパイル時に型が確定するのであれば、template を使う手もあります。
2 メンバ関数へのポインタを使う。
ただ、ほんとうにボトルネックはそこですか? 細工を始める前に本当に仮想関数呼び出しが
オーバーヘッドになっているのか、プロファイラを使って計測した方が良いです。細かい工夫で
数サイクル稼ぐより、アルゴリズムを工夫してメソッド呼び出し回数のオーダーを下げた方が
遥かに効果的です。
0406デフォルトの名無しさん
NGNGメンバ関数へのポインタではオーバーヘッドなくならないんじゃない?
あと、正直プロファイラがどんなものなのか分からない。
0407デフォルトの名無しさん
NGNGパフォーマンスを気にするなら、プロファイラがどんなものか
理解しておくべきだ。
プログラムを実際に動かしてみて、
どの関数が何回呼ばれたとか、
どの関数で何ミリ秒時間がかかったとか、
そういう様々な実行時の情報を計測してくれるツール
のことだよ。
小手先最適化の前に
まず、こっちを先に調べなさい。
0408400
NGNG>>404
VC++のはいたコードを見てみたのですが、
たしかにそういう呼び出し方をしていますね。
>>405
>2 メンバ関数へのポインタを使う。
は
>>404さんの
>言語側の仮想関数と自前のポインタ処理は同じような機械語になります。
と同じですよね?
>数サイクル稼ぐより、アルゴリズムを工夫してメソッド呼び出し回数のオーダーを下げた方が
>遥かに効果的です
にしたいのですが、もともと仮想関数を使う理由は
あるコンテナ群に対する処理をひとつのソースで済ませたいからなのですが、
コンテナのインタフェースに対して処理しているので、
どうしてもvirtual invokeが発生するのです。
やはり、この場合はコンテナにアルゴリズムを持たせるのが一番でしょうかね・・・。
0409デフォルトの名無しさん
NGNGclassBが下記のような場合はコピーコンストラクタいるの?
classA を継承しているし、いらないかなー
なんて思ってしまうのですが・・・
(わけわかんない事いってたらごめんなさい)
classB
throw classB;
して
carch(classB &b){
}
で受け取ると
class classB : public classA {
int q;
classB(){
q = 20;
}
~classB{}
}
class classA{
public:
int* p;
classA(){
p = new int;
*p = 10;
}
classA(const classA& a){
p = new int;
*p = *a.p;
}
~classA{
delete p;
}
classA& operator=(const classA& a){
*p = *a.p;
return *this;
}
}
0410デフォルトの名無しさん
NGNG{
public:
virtual void each() = 0;
};
class container1 : public container_base
{
public:
virtual void each() { }
};
class container2 : public container_base
{
public:
virtual void each() { }
};
//ひとつのソース
template <typename Container>
void general_test(container_base* pBase)
{
Container* pCont = dynamic_cast<Container*>(pBase);
for (int i = 0; i < 10000; i++)
pCont->Container::each();// no virutal call
}
container_base* pCont = new container1;
general_test<container1>(pCont);
仮想関数を非仮想呼び出しするには、明示的限定以外ないので(関数ポインタによる呼び出しも仮想呼び出し)、
こんな感じですがあまり役に立ちそうにない。
0411デフォルトの名無しさん
NGNGA1,A2:Aから派生したクラス
X:A1,A2を多重継承したクラス
としてAのポインタをXのポインタにキャストしたいのですが
どうすればよいでしょうか
#BCCでエラー('A *' から 'X *' へのキャストはできない)
class A {};
class A1 : virtual A {};
class A2 : virtual A {};
class X : A1, A2 {};
main() { A *pa; X *px = (X *)pa; }
0412デフォルトの名無しさん
NGNG何のためにそんなコトしたいのか知らんが、できないものはできない。
0413デフォルトの名無しさん
NGNGX* から A* ではなく、逆なのか? やってやれないことはないが、設計が腐ってるとしか思えん。
0414デフォルトの名無しさん
NGNGAが仮想関数もってないからじゃないの?
class A {virtual void virtual_method(){}};
class A1 : A {};
class A2 : A {};
class X : A1, A2 {};
main() { A *pa; X *px = dynamic_cast<X *>(pa);}
ところで、class A1 : virtual A {}; での
「virtual」の意味を教えてちょ。どんなときに使うの?
0415デフォルトの名無しさん
NGNG仮想継承は菱形継承するときに使う。この場合だと、仮想継承しないと X オブジェクトの内部には
A オブジェクトが二つ含まれることになるが、仮想継承すると A オブジェクトが一つしか含まれな
くなる。
プログラミング言語 C++ に図入りで解説があるから、読んでみ。
0416414
NGNGおお、さんくす。
プログラミング言語 C++買ってこよ。
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNG0421デフォルトの名無しさん
NGNG0422417
NGNGただtry catchはやはり例外発生時にのみ使うべきだと思うのであります。
0423仕様書無しさん
NGNGスカートの中を覗き見しようとしている414の画像をキボンヌ
0424デフォルトの名無しさん
NGNG俺は goto 使う場面では goto 使う。
0425411
NGNGAを基底クラスとした様々な派生クラスをリスト化
その要素にアクセスするためのイテレーターをA*
X以降の派生クラスであることがわかっている要素(一応typeidで確認して)で
Xのメソッドを使用したいときにA*→X*のキャストが必要となりました。
多重継承させずに設計すべきだったんでしょうかね。
できないなら仕方ありませんが、
やれないことはないとは、どのようなことか教えてくださいませんか?
0426デフォルトの名無しさん
NGNG> X以降の派生クラスであることがわかっている要素(一応typeidで確認して)で
> Xのメソッドを使用したいときにA*→X*のキャストが必要となりました。
X の派生クラスであることが分かっているのなら X* のまま渡すべきであって、途中で A* に落としてしまう
設計がイマイチでしょう。
基底クラスを扱う側で本当に「その X 固有のメソッド」を参照する必要があるのなら、そのメソッドを A に移
して仮想メソッドにするべき。A では純粋仮想メソッドにして派生クラスで実装させるか、もしくは適当なデフォ
ルト値を返すようなメソッドを定義しておく。
> やれないことはないとは、どのようなことか教えてくださいませんか?
dynamic_cast です。
0427425
NGNGなるほど。色々と説明ありがとうございます。
dynamic_cast を使う場合は >>414 のようにするのですね。
レスくださった方に感謝します。
設計から再考してみようと思います。
0428デフォルトの名無しさん
NGNG1. VC++(ver6)
2. g++(2.96, Kondara MNU/Linux 2.0)
3. g++(cygwin2.95.3-5, WIN2K)
でコンパイルしたのですが、1,2ではコンパイルが通って(警告もなし)
3ではどばっとエラーが出ます。エラーの内容は最初に
class my_itr : public iterator<bidirectional_iterator_tag, my_type>{
と書いた行で parse error before `<' と出た以後、
何かがずれたようにsyntax errorやundeclaredといったエラーが延々と出ます。
こんな経験のある方いませんか?
cygwinメインで書いてるのでホトホト困ってます。
0429デフォルトの名無しさん
NGNG絶対ソースのせた方が早く解決すると思う。
0430デフォルトの名無しさん
NGNG0431428
NGNG0432428
NGNGg++ -c
で試してみると >>428 のようになります。
2回にわけます。
---以下ファイル ---
#include <list>
#include <map>
#include <iostream>
using namespace std;
typedef unsigned long ulong;
template<typename VRTX,typename EDGE>
class _graph{
public:
class _vwrap;
class _ewrap;
class _vrtx_itr;
// 頂点リストの型
class _vlist : public list<_vwrap*>{
public:
list<_vwrap*>::iterator operator[](const ulong& i){
if(i>=size()){
cerr << "ERROR: Index out of range" << endl;
exit(1);
}
list<_vwrap*>::iterator itr = begin();
advance(itr,i);
return itr;
}
};
typedef _vlist::iterator _vlist_itr;
// エッジリスト型
typedef list<_ewrap*> _elist;
typedef _elist::iterator _elist_itr;
// 結合マップのソートの基準
struct _less_vlist_itr :
binary_function<_vlist_itr,_vlist_itr,bool>{
bool operator()(const _vlist_itr& v0,const _vlist_itr& v1) const{
return *v0<*v1;
}
};
// 結合マップ<結合先頂点,対応エッジ>
typedef map<_vlist_itr,_elist_itr,_less_vlist_itr> _amap;
typedef _amap::iterator _amap_itr;
0433428
NGNGclass _vwrap{
friend _graph;
friend _vrtx_itr;
private:
VRTX vrtx; // 頂点本体
_amap amap; // 結合マップ
_vwrap(){}
_vwrap(const VRTX& v) : vrtx(v){}
};
// エッジのラッパ
class _ewrap{
private:
EDGE edge; // エッジ本体
_vlist_itr vrtx[2]; // 両端点の頂点
};
// 頂点の内容(VRTX)にアクセスするための反復子
class _vrtx_itr : public iterator<bidirectional_iterator_tag,_vwrap*>{
friend _graph;
private:
_vlist_itr itr;
public:
_vrtx_itr(void){}
_vrtx_itr(_vlist_itr v) : itr(v){}
_vrtx_itr(_amap_itr a) : itr(a->first){}
VRTX& operator*(){ return (*itr)->vrtx; }
VRTX* operator->(){ return &(*itr)->vrtx; }
_vrtx_itr& operator++(){ ++itr; return *this; }
_vrtx_itr& operator--(){ --itr; return *this; }
};
private:
_vlist vlist; // 頂点リスト
_elist elist; // エッジリスト
public:
_graph(void){}
~_graph(){}
};
0434428
NGNG全角のスペースを使ってるので注意です。
0435デフォルトの名無しさん
NGNG0436428
NGNGstd::は4行目で宣言してるので問題ないと思います。
それといまSUNのSPARC(gcc2.95.1)でも試してみました。
結果・・・通りませんでした。
ん〜。gccの最近のバージョンでSTLの枠が少し変わったのかなぁ。
自分のやり方が間違ってないことが判れば、今コンパイルが通らなくても
将来通るようになるだろうということで納得できるんですけど。
0437デフォルトの名無しさん
NGNGg++ -E で、プリプロッサを通した後の <iterator> を読んでみれば? 実は struct iterator が
削除されてたりしない?
0438デフォルトの名無しさん
NGNGコンパイラで使ってる名前とぶつからないかどうか
いちいちチェックしないといけないだろ
0439デフォルトの名無しさん
NGNGをソースの最初で定義するべし
0440デフォルトの名無しさん
NGNGいい忘れたが#include よりも前の行で(つまりほんとの1行目)
0441428
NGNGstruct iterator。
確かにコンパイルが通らなかった方には存在しませんでした・・・。
これが原因ですか?だとすればなぜこうなってしまうのでしょうか。
>>438
なんか昔から大文字と小文字がくっついてるのが気持ち悪くて
型は全部"_"で始めるようにしてます。それと定数以外は全て小文字です。
あまり複雑なプログラムは組んだことがないので(専門は流体計算です)
これまでは気にせずに来ましたが、やっぱり常識的にまずいですか?
>>439
エラーが増えました・・・。
0442デフォルトの名無しさん
NGNGstruct iterator ...
になってるはず。
0443デフォルトの名無しさん
NGNG_で始まる名前は Cの予約語。
__で始まる名前と _ + 英大文字 で始まる名前はC++の予約語。
厳密にいえば _ + 英子文字で始まる名前は C++の予約語ではないが、
さけるべき。
0444428
NGNG確認しました。それでプログラムの冒頭で
#define __STL_USE_NAMESPACES
としたのですが、やはりg++ -Eで出力を見ると
struct iteratorは存在しません・・・。どこで消えてるの?(泣)
>>443
厳密には予約語ではないけれども常識的には避けるべきということですね。
了解しました。少しずつ慣れるようにしてみます。
いろいろと有難う御座います。
ちょっとピグミン買いに行ってきます。
0445デフォルトの名無しさん
NGNG> foo.cc:47: friend declaration requires class-key, i.e. `friend class
> _graph<VRTX, EDGE>'
> foo.cc:48: friend declaration requires class-key, i.e. `friend class
> _graph<VRTX, EDGE>::_vrtx_itr'
> foo.cc:65: friend declaration requires class-key, i.e. `friend class
> _graph<VRTX, EDGE>'
0446デフォルトの名無しさん
NGNGfriend class XXXX<VRTX,EDGE>にすりゃいいのか?
試してなくてす万コ
0447428
NGNG駄目みたいです。
それで買い物に行く前にもう一つだけ試してみました。
無理やりですが、ファイル冒頭の#include <list>の後に
stl_iterator.h内の該当部分
template <class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
typedef _Category iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef _Pointer pointer;
typedef _Reference reference;
};
を貼っ付けてみました・・・。
コンパイル通りました(泣)。
納得できません・・・。
0448デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNGなぜかVC++で全然通らないのはなぜでしょう?
class CFoo {
public:
CFoo(int foo) {m_foo = foo;}
private:
int m_foo;
friend ostream& operator<<(ostream& s, const CFoo& r);
};
ostream& operator<<(ostream& s, const CFoo& r)
{
s << r.m_foo;
return s;
}
main()の中で、
CFoo obj(10);
cout << obj << endl;
VC++コンパイルすると以下のエラーが出る
> error C2248: 'm_foo' : private メンバ (クラス 'CFoo' で宣言されている)にアクセスできません。
> error C2593: 'operator <<' があいまいです。
最初のエラーは m_foo を public にすると通るけどpublicにはしたくない
次のエラーは friend の行を外すと通るが、理解不能。
0451デフォルトの名無しさん
NGNGそれどういう環境?
0452デフォルトの名無しさん
NGNG0453450
NGNG試してくれてアリガトウ。
cl.exe のバージョンはこのようになっています。
> Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
> Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
sp5とか当てた覚えが無いのでやっぱりコンパイラが古いんだろうか。
0454デフォルトの名無しさん
NGNGうちのこんなかんじ。
spあてたら?(でかいけど)
0455450
NGNGあきらかにバージョン違うね。
sp5当ててみます。
0456デフォルトの名無しさん
NGNG古すぎ。
0457デフォルトの名無しさん
NGNG0458デフォルトの名無しさん
NGNG0459450
NGNG0460デフォルトの名無しさん
NGNGclass _vrtx_itr : public iterator<bidirectional_iterator_tag,_vwrap*>{
このiteratorって何者?
class _vrtx_itr : public list<_vwrap*>::iterator {
とかじゃないの?
0461デフォルトの名無しさん
NGNGif(!hoge)と判定するためには operator!をオーバーライドしますが、
if(hoge)と判定するためには 何をオーバーライドしたらいいのですか?
0462461
NGNG0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNGもう解決してるみたいだが、うちは未だにVC++5の
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 11.00.7022 for 80x86
だけど通った(古すぎて悪かったな)。
0465デフォルトの名無しさん
NGNGoperator void*() const
プログラミング言語C++ 3版 21.3.3参照
ついでに面白くなってるスレ
http://pc.2ch.net/test/read.cgi/tech/1005897052/l50
0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNGどのクラスを継承しているかという情報は
取れるのでしょうか?
0468
NGNGVC++6.0を使ってWIN32コンソールアプリケーションのMFCをサポートしない
プログラムの練習をしているんだけど、画面を制御する方法が判らなくて
困ってます。
具体的に、coutで出力した文字を全て消去して、新たに文字を画面の頭から
出力したいとき、必要なライブラリと関数は何かを教えて欲しいんだけど
だれかご教授お願いします。
使用OSはWIN-Meです。
0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNG取れません。typeid で取れるのは、クラス名だけです。
0471デフォルトの名無しさん
NGNG普通NULL文字と0x0d,0x0aはテキスト情報としてどう
表現しますか?
今のところ暫定的にNULl文字→'0'
0x0d→'D'0x0a→'A'としてるんですけどこれじゃ
だめなのはわかっています。
0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNG他のバイナリビュアーつかったことないの?
0475デフォルトの名無しさん
NGNGみんな static_cast と reinterpret_cast どっち使ってる?
0476デフォルトの名無しさん
NGNG0477デフォルトの名無しさん
NGNGあるクラスを継承してるかどうかなら
type_info::before()で判定できるはず
0478デフォルトの名無しさん
NGNGふつーreinterpret_castだろ。つーかコンパイラがエラー出さないか?>static
0479デフォルトの名無しさん
NGNGそれ違う。a.before(b) は strcmp(a.name(), b.name()) < 0 程度の意味。
0480デフォルトの名無しさん
NGNGそれはミもフタもないです。。。
>>478
ほんとだ。
基本型のポインタ同士では static_cast 使えないのか・・・知らなかった
0481デフォルトの名無しさん
NGNG俺もしないと思う。
なんのメリットがあんの?
MSDN>reinterpret_cast 演算子は、const、volatile、__unaligned の各属性をキャストして除去することはできません
こんだけしかない気が・・・
0482デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/986355498/
0483デフォルトの名無しさん
NGNG書き直しているんだけど、なぜかリファレンスにNULLが指定出来ないという
問題にぶちあたった。これってそういうもの?
0484デフォルトの名無しさん
NGNGそういうもの。
全部参照ならNULLポインタにアクセスする危険性がなくなる。
0486478
NGNGintをシリアライズした生メモリ(まPVOIDでもいいんだけど)がたまたま
途中の都合でchar*で与えられたときにreinterpret_castでint*に変換
してintとしてアクセスするとか。
0487nori
NGNG書き方があるでしょうか?
初歩的な質問で申し訳ありませんが、お願いいたします。
0488デフォルトの名無しさん
NGNG意味わからん。aとかbとかどんなオブジェクトなんだよ。
0489デフォルトの名無しさん
NGNG安心はできない(*´Д`*)
string *s; //初期化忘れてる
...
hoge(*s); //あぼーん
0490デフォルトの名無しさん
NGNG純然たる「参照」では初期化は必須では...
string& s; // エラー
0491デフォルトの名無しさん
NGNG赤黒木はあったんですけど、あれってツリーをいろいろいじりますよね?
0492デフォルトの名無しさん
NGNG「2分木」なんていうコンテナはSTLにゃねえよ
0493428
NGNG: class _vrtx_itr : public iterator<bidirectional_iterator_tag,_vwrap*>{
: このiteratorって何者?
: class _vrtx_itr : public list<_vwrap*>::iterator {
: とかじゃないの?
ありがとうございます!そうやって
list<_vwrap*>::iterator<bidirectional_iterator_tag,_vwrap*,diff_type,ptr_type,ref_type>
と設定したらうまく行きましたー。
やはり自分の間違いだったのですね。もう少し勉強します。
お蔭様ですっきりしました。
0494428
NGNG1. g++(2.96, Kondara MNU/Linux 2.0) : OK
2. g++(cygwin2.95.3-5, WIN2K) : OK
3. g++(gcc2.95.1, Solaris) : OK
4. VC++(ver6) : NG
となりました。4のVC++のエラーの内容は『コンパイルされたクラステンプレートの
インスタンス化云々』というものです。ちなみに
iterator<bidirectional_iterator_tag,_vwrap*,diff_type,ptr_type,ref_type>
とした場合だと
1. g++(2.96, Kondara MNU/Linux 2.0) : OK
2. g++(cygwin2.95.3-5, WIN2K) : NG
3. g++(gcc2.95.1, Solaris) : NG
4. VC++(ver6) : OK
となります。この場合の2と3のNGの内容は>>444のようにstruct iteratorが
消えたことによるものです。そしてこの場合は>>447のように
無理やりstruct iteratorを定義してやると、2と3(2.95以前のg++)についても
コンパイルが通ります。まだすっきりしません。
0495デフォルトの名無しさん
NGNG参照のメリットは、もうひとつあるぞ。const 参照の場合限定だが、構造体やクラスを実引数「その場」
で作れる。
void Render(const Point& pt, Color color);
Render(Point(0, 0), Color(255, 255, 0));
0496デフォルトの名無しさん
NGNG0497デフォルトの名無しさん
NGNG1. mutable にする
2. const_cast する
0498デフォルトの名無しさん
NGNG変数の宣言の所でconstを削除する。
0499デフォルトの名無しさん
NGNG変えるな!
0500デフォルトの名無しさん
NGNG理想はそのとおりだが、たまに const char * をとるべき関数/メソッドなのに、char * をとるように
書いてあるライブラリとか存在するから。
DrawString(char *s);
みたいなやつね。
0501デフォルトの名無しさん
NGNG0502デフォルトの名無しさん
NGNGpublic:
Base(){
init();
}
virtual void init()=0;
};
class Derived:public Base{
public:
void init(){
}
};
こういう使い方したいなー
0503デフォルトの名無しさん
NGNGコンストラクタから派生クラスの仮想メソッドを呼びたい、って話?
0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNGDelphiなら出来るけど、あの仕様はバグの温床だ。
0506仮想コンストラクタ?
NGNGちょうど知人に、最近、「あなたはオブジェクト指向に詳しいですか?」と、これに
ついて尋ねられ、オブジェクト指向のオの字しか知らない自分は、答えに窮した(゜ε ゜
コンストラクタのオーバーライドは、オブジェクト指向的にイケてるのか、という話。
0507506
NGNG0508デフォルトの名無しさん
NGNG0509デフォルトの名無しさん
NGNG0510485
NGNG引数の部分でクラス生成出来るのは便利だなぁ
ちなみに、よくわからないけど const 付けないでもコンパイル出来たよ。
あと Color color は Color& にしなくていいのかな?
0511デフォルトの名無しさん
NGNGhttp://www.kuzbass.ru/docs/isocpp/lib-iterators.html
24.3.2 -4 を見ると
class _vrtx_itr : public iterator<bidirectional_iterator_tag,_vwrap*,std::ptrdiff_t,_vwrap**,_vwrap*&> {
とかできそうなんだけど。gcc-3.0.xならいけるか?
iterator作るのが目的なら
class _vrtx_itr {
public:
typedef bidirectional_iterator_tag iterator_category;
typedef _vwrap **pointer;
typedef _vwrap *&reference;
typedef _vwrap *value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
… あといっしょ
でどう?
0513デフォルトの名無しさん
NGNG隠れた動作がおおいっての、C++の悪い面だよなあ。
0514デフォルトの名無しさん
NGNG6000個のデータが入ったテキストファイルを1000個のデータ(double)の入った6つのテキストファイルに分割したいのですが、やり方がわかりません。
元のファイル名はdata.txt、新たに作られるファイルはそれぞれdata1,data2,data3....という名前をつけなければいけません。
どなたか達人の方、教えてください。
お願いします。
0515デフォルトの名無しさん
NGNGデータ形式がどうなっているかわからんとわからん。
0516514
NGNG123.234,
456.435,
92.412,
4.23,
-2.35,
0,
12,26,
という感じです、すいません、うまく説明できませんがよろしくお願いします。
0517デフォルトの名無しさん
NGNG0518デフォルトの名無しさん
NGNGというわけで、見事なワンライナー募集に変更すべし。
0519デフォルトの名無しさん
NGNG区切り文字は','なの?
0520デフォルトの名無しさん
NGNG”ある場合もある”って日本語変じゃないですか?
0522デフォルトの名無しさん
NGNG",\n"を区切り文字としてstrtok()で分割しちゃえば?
コピーするだけだから数値に変換する必要はないな。
0523522
NGNG0524デフォルトの名無しさん
NGNG一行に二個ある場合もあるので、 ",\n"じゃだめだと思うの。
0525デフォルトの名無しさん
NGNGstrtok()の説明を見た?
0526525
NGNG12,43,
34
これは3つじゃなくて4つに分割されるな・・・・
0527デフォルトの名無しさん
NGNG0528524
NGNG0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNGそうだな・・・・
一行一行やるのが一番だね。。。。
0531デフォルトの名無しさん
NGNG#include <stdio.h>
#define NUMDATA 2
#define NUMFILE 6
main(){
char from[] = "data.txt";
char *r = "r";
char *w = "w";
char to[] = "data0.txt";
FILE *ff, *tf;
int n, k, c;
if((ff = fopen(from, r)) == NULL) return;
n = 1;
do{
to[4] = n + 48;
if((tf = fopen(to, w)) == NULL){
fclose(ff);
printf("can't open %s\n", tf);
return;
}
k = 0;
do{
c = getc(ff);
if(c == EOF) break;
if(c == ',') k++;
putc(c, tf);
}while(k < NUMDATA);
fclose(tf);
n++;
if(c == EOF) break;
}while(n <= NUMFILE);
}
0532デフォルトの名無しさん
NGNGにしといてくだされ。
空白行がうざければ適当に処理してくだされ。
0533514
NGNG一緒に考えてくださった、他の皆さんもどうもありがとうございました。
2ch初心者なので不安でしたが、世の中にはたくさん親切な人がいるんだなぁと思い感激です。
ありがとうございました。
0534デフォルトの名無しさん
NGNGカコイイ!!
俺もサクッと回答できるようになりたい・・・
0535デフォルトの名無しさん
NGNGナゼダカワカルカイ?ハクチドモ
0536ハクチドモ
NGNG0537デフォルトの名無しさん
NGNG0538428
NGNGclass _vrtx_itr : public iterator<>
で定義するのはg++2.95以前だと(今の書き方だと)やっぱり駄目みたい。
2.96以上では通るんだけど。
それで>>511書かれていたように継承なしで定義するようにしました。
これだとg++(2.95,2.96)でもVC++(v6sp2)でも通るみたいです。
これでいきます。どうもありがとうございました。
0539デフォルトの名無しさん
NGNGがんばってね
0540デフォルトの名無しさん
NGNGってやる事のデメリットってなんですか?
0541デフォルトの名無しさん
NGNG一番致命的なのはやはり、派生クラスへのキャストだね
0542(・Λ・)ワカラナイ・・・
NGNG16進数の各桁を文字列の各文字として定義して、その文字を受け取りint型を
返すような関数を定義せよ。
関数名、仮引数および返値は以下のよに定義すること。
int htod(char hex[]){...}
上の問題ですが、全然わかりません。
文字列自体、習ったばかりです・・・。
誰かやりor答えを教えてください。
0543デフォルトの名無しさん
NGNGスレ違い。宿題スレを探して、そっちで聞け。
0544デフォルトの名無しさん
NGNGint hrod(char hex[])
{
int n;
sscanf(hex, "%x", &n);
return n;
}
0545デフォルトの名無しさん
NGNG0546通りすがり
NGNGコンストラクタだの仮想関数だのって、、。
なにか飽きないで勉強できるネタない?
0547デフォルトの名無しさん
NGNG0548通りすがり
NGNGそうだな。
取り合えずなんか作るわ。
0549デフォルトの名無しさん
NGNG仮想継承した場合、基底クラスと派生クラスで vtbl の配置が変わってしまう(ような実装が一般的だから)
規格でも仮想基底クラスから派生クラスへのキャストは NG になってる。
0550九州の学生
NGNG�Bの所で+演算子の返すオブジェクトをcoutで出力しようと
して�@,�AのようなオーバーロードをするとBCC(Ver5.5.1)に
「エラー E2094 ref.cpp 20: << 演算子が使われたがクラス
ostream では MX 型のための定義が存在しない(関数 main() )」
といわれてしまいます。g++でも出来ませんでした。しかし、
VC5では何の問題もなくコンパイルできます。<<演算子は�@の
ところでオーバーロードしているので、コンパイルできると
思うのですがどうなのでしょうか。なお、�Aのところを参照
を返すように変更すればなぜかコンパイルできるのですが、
そうすると動的な配列が存在する場合にデストラクタによっ
てメモリが開放されてしまいます。(元のソースでは"d"はポ
インタになっていてコンストラクタで"new"している。)
どなたかよい方法、又はこのソースの間違いを教えてください。
#include <iostream>
using namespace std;
class MX{
double d;
public:
MX(double x){d = x;}
MX(MX &m){d = m.d;}
MX &operator+=(MX &m){d += m.d; return *this;}
friend ostream &operator<<(ostream &o, MX &m) // �@
{o << m.d; return o;}
friend MX operator+(MX &lm, MX &rm) // �A
{return MX(lm) += rm;}
};
int main()
{
MX m1(1.0); MX m2(2.0);
cout << m1+m2 << endl; // �B
return 0;
}
0551デフォルトの名無しさん
NGNGそういう場合はグローバル定義の演算子オーバーロードするんじゃなかったっけ?
0552デフォルトの名無しさん
NGNGなるほど
ありがとうございます
0553デフォルトの名無しさん
NGNGfriend 関数は、そこに実装を書くことはできないはずだ!
0554551
NGNGfrendはアクセス指定であって、関数定義じゃないよ〜
0555デフォルトの名無しさん
NGNG> そうすると動的な配列が存在する場合にデストラクタによっ
> てメモリが開放されてしまいます。(元のソースでは"d"はポ
> インタになっていてコンストラクタで"new"している。)
このように実装すれば良い。
class MX{
double* d;
public:
MX(double x){ d = new double; *d = x; }
MX(const MX& m){ d = new double; *d = *m.d; }
~MX(){ delete d; }
MX& operator=(const MX& m){ *d = *m.d; return *this; }
};
0556九州の学生
NGNG迅速なレスありがとうございます。こんなに早く答えていただける
とは思いませんでした。
555さんのとおりconstをつけたらコンパイルできました。
C++では型のチェックが厳しいのを忘れておりました。
0557デフォルトの名無しさん
NGNG0559デフォルトの名無しさん
NGNGダイナミックキャストは出来る
0560デフォルトの名無しさん
NGNG遅いレスで恐縮ですが、
> 実験してみたよ。
> VC++ だと、catchが参照なら、コピーコンストラクタ呼ばれない。
> catchが実体なら、コピーコンストラクタ呼ばれる。
これは、throw A(); というようにインスタンス生成と同時に throw
しているから、最適化が施されたんでしょうね。意味論上は、C++Builder
の場合と同じです。(g++ は C++Builder と同じ動作をした)
ふつうの関数でも
A foo()
{
retunr A();
}
とやると、律義にデフォルトコンストラクタとコピーコンストラクタを
使うというようなことはせず、呼び出し側が用意したインスタンスの領域を
直接コンストラクトするような最適化がなされることがあります。
ちなみに、
void f()
{
A a;
throw a;
}
とやると、VC++ でもちゃんと(?)デフォルトコンストラクタとコピー
コンストラクタが呼ばれるようです。
0561BUGMAKER
NGNG渡すのってどうすれば良いでしょうか?
Javaでいうところの、
OtherClass.setMyClass(this);
みたいにしたいのですが・・・
0562デフォルトの名無しさん
NGNGC++ でも、それで良いけど。NULL チェック省くために参照にして
class OtherClass
{
public:
void setMyClass(Foo& foo)
{}
};
OtherClass.setMyClass(*this);
としたり、コンストラクタで渡すと吉。ただし Java と違って GC ないから、どこで
delete するかは要注意ね。
0563デフォルトの名無しさん
NGNGC++ でも this 使えますが?
なにかマズイんですか?
0564デフォルトの名無しさん
NGNG>C++ でも、それで良いけど。NULL チェック省くために参照にして
参照をそういう使い方してNULLチェックが省けるってのは、
考え違いだろ。
ポインタにNULLが入ってれば、参照でも結局クラッシュするし。
0565デフォルトの名無しさん
NGNGそりゃあ NULL をデリファレンスしたヤツが悪い。
0566デフォルトの名無しさん
NGNG言語と実行時環境で強制はしていないから、一種の紳士協定だわな。
ただしポインタを引数にとるメソッドでは、
- メソッドを呼び出す側、メソッド側どちらで NULL に対応すべきか明確ではない
(ふつうはドキュメントに書いておく)
のに対して、参照だったら
- メソッドを呼び出す側が NULL をデリファレンスしないようにすべき
というのは明白になる。NULL が入ったポインタ p に対して *p ってコードを書いた
時点で、そいつのチョンボなのは間違いない。
0567デフォルトの名無しさん
NGNG個人的にはメソッド側でチェックする方がスマートに感じるけどね。
0568デフォルトの名無しさん
NGNGポインタの場合は、仕様からして NULL が正常値な場合はそれでいいとして、
そうでない場合は assert 書いてる。
0569デフォルトの名無しさん
NGNGC++ でスマートといったら、スマートポインタ。
0570デフォルトの名無しさん
NGNGこんなものわざわざ標準化した理由は何?
0571デフォルトの名無しさん
NGNGexceptional C++読んでみて
0572570
NGNG0573デフォルトの名無しさん
NGNGオブジェクトの寿命をスコープで管理しないと、例外に対して堅牢なクラスを作るのが
面倒だから。
auto_ptr が微妙に使いづらい面があるのは確かで、Boost.org でも shared_ptr, scoped_ptr,
shared_array, scoped_array なんてクラスを提供しているし、ATL だと CComPtr という COM
用の独自のスマートポインタクラスを提供している。用途によって自分でスマートポインタを
作るのは、常套手段ではあるよね。
0574クロスゆるして(マルチ?)
NGNG良い資料/WEB等、無い???
作りたいのは、認証システム。
doc, xlsファイルとかだと、直にURLたたかれたら、ユーザチェック
できないでしょ?普通。
あ、win統合認証とかは使えない。
ユーザIDとパスワードたちは、DBに入ってるし。。。
MSのUSサイトいっても、イマイチ情報が古いし。
0575デフォルトの名無しさん
NGNGっつか、スレ違い。
0576デフォルトの名無しさん
NGNG単純に、直に URL を叩かせなければ良いんでわ。
0577573
NGNGどこいけばいいの???
0578デフォルトの名無しさん
NGNGWebProg 板か、VC スレと思われ。
0579デフォルトの名無しさん
NGNG逝ってきます
0580デフォルトの名無しさん
NGNGスレッドAの関数a: コンテナfooに値を挿入/削除(クリティカルセクションCで保護)
スレッドBの関数b: コンテナfooの全ての要素にイテレータを使って順次アクセス/操作
コンテナfooはスレッドA&Bで共有。
aは任意のタイミングで呼び出され、bは定期的に呼び出される。
の場合、スレッドBの関数b全体をクリティカルセクションCで保護しなければ
ならないのでしょうか? 関数bがすぐ終わるならいいのですが、関数aがそれなり
に頻繁に呼び出され、bによってブロックされるのが好ましくないような場合、
bが長い時間かかると困ります。コンテナ全体の要素にアクセスしている途中で
イテレータが無効になったらそれを判断できればいいのですが。
他方、bのようにするのをやめてコンテナfooの要素それぞれがスレッドを持つ
ようにしたりすると効率上問題であると思います。
このような場合どうすればいいでしょうか。
0581デフォルトの名無しさん
NGNGコンテナに格納する要素数と比較して、挿入/削除される要素数が少ないのなら
> スレッドAの関数a: コンテナfooに値を挿入/削除(クリティカルセクションCで保護)
これをスレッドAで直接行わず、挿入/削除するコマンドを生成して一旦キューに
貯めて、スレッドBで処理を開始する前にコマンドを実行するようにします。
ロックする単位を、要素数が多いコンテナから比較的要素数が少ないコマンドキュー
に移すわけです。
0582580
NGNGなるほど... コマンドキューへの出し入れを排他ロックするだけで
よくなるわけですね。キューなら個数だけ調べて先頭をポップする
だけで済むので、イテレートする必要もなくていいですね。
ありがとうございます。
0583デフォルトの名無しさん
NGNGコピーする一瞬はクリティカルセクションだけど、
コピーしてしまえばどんなに時間かけても大丈夫。
設計問題に絡むけど。
0584デフォルトの名無しさん
NGNGキューに対する排他が必要だぞ。
0585デフォルトの名無しさん
NGNG取得は、、、
char* szBuf;
szBuf = new char [1024];
subFunc(szBuf);
で、sub()側で解放します
subFunc(char* pBuff)
:
:
delete [] pBUff;
ここで、deleteの後 []を付ける事は問題ないのでしょうか?
charの配列用のメモリを取得して、
charのポインタの配列用で取得したメモリを解放する。
これって問題ありますか?
0586デフォルトの名無しさん
NGNG問題ないです。
0587iku
NGNGいつも参考にさせて頂いています。
PathFileExistsでファイル検索をしたいのですが,
過去ログも拝見させて頂きまして,
MSも見て下記の様な記述をしたのですが
リンカーエラーPathFileExistsAが未解決といったエラーが生じて
しまいました。
他に何が必要なのか検討がつきません。
大変申し訳ないのですが,教えて頂けないでしょうか?
#include <windows.h>
#include <iostream.h>
#include "Shlwapi.h"
char chrPath[100];
sprintf(chrPath,"%s",Edit1->Text);
bool status = PathFileExists(chrPath);
0588デフォルトの名無しさん
NGNGおお、即レスありがとうございます
0589iku
NGNGPathFileExists(chrPath);
の件ですが,解決しました。
下記が原因だったようです。
お騒がせしました。
#includeプリプロセッサ指令はコンパイル前にその場所へ
そのファイルを挿入する指令です。
<shlwapi.lib> はテキストファイルではないので
#include で 取り込むことはできません。
これは shlwapi.dll を暗黙で使うためのインポート
ライブラリなので リンカに渡す必要があります。
C++Builderではリンクに使う指令があります
#pragma link "shlwapi.lib"
とソースファイル中に書くことによってリンカに
渡されます。
ただ、このままだと"shlwapi.lib"へのパスが
正しく張られていないので
[プロジェクト|オプション][ディレクトリ/条件]
の[ライブラリパス]に
$(BCB)\Lib\PSDK
を追加してください。
0590デフォルトの名無しさん
NGNGshlwapi.libをリンクする必要があると思われ。
0591亜美ちゃん ◆WOLFps4M
NGNGどのようなフローで勉強していくのが正しいでしょうか?
0592デフォルトの名無しさん
NGNG優良書籍を紹介してるスレがあるから、そこでC++とオブジェクト指向の
本を探して読む。
0593iku
NGNGC++BuilderのTQueryについて教えて頂きたいのですが,
Databaseコンポーネントの様に
TQueryコンポーネントでSQLServerのUserIDとPasswordを設定する事はできないのでしょうか?
0594デフォルトの名無しさん
NGNGデスマーチにはいりたくなかったら、現在出ている予定工数の1/5位を
C++の勉強に割り当てなさい。
習熟度に従って、開発効率やバグの発生頻度が大きく変わるからね。
0595580
NGNG>関数b で、コンテナ foo をコピーしてから使うという手もあるぞ。
>コピーする一瞬はクリティカルセクションだけど、
>コピーしてしまえばどんなに時間かけても大丈夫。
コピーにもそれなりの時間がかかりますので(コンテナの
要素全てがコピーされるので下手すると全要素をイテレートする
のと同様かそれ以上の時間がかかります)。
それにコピーされた要素に操作を行っても元のコンテナへ変更を書き
戻す手間が発生してしまいます。
>>584
>両方のスレッドで同じキューを使っていたら、
>キューに対する排他が必要だぞ。
581さんの話は両方のスレッドでコマンドキューを共有しな
ければ無意味な話だと思うんですが...?
これは582で
>なるほど... コマンドキューへの出し入れを排他ロックするだけで
と述べているように了解済みです。詳しく書けば、関数bでの先頭要素
の参照が終わった段階でのpopと、関数aで行われるpushとを排他する
ということです。
0596デフォルトの名無しさん
NGNG問題はないですが、例外に対して脆弱になるのと delete[] を間違えて delete
と書くと検出しにくいエラーになるので、STL の vector や string を使うのが
おすすめです。
string というと「文字列」という印象がありますが、多くの実装では参照回数計
測によって不要なコピーを押さえた可変長配列として使うことも出来ます。
あと、標準ライブラリではないですが boost::shared_array も便利ですよ。
http://www.boost.org/libs/smart_ptr/smart_ptr.htm
0597デフォルトの名無しさん
NGNGとりあえず、new/delete malloc/freeでも
いいんでないかい?
0598デフォルトの名無しさん
NGNGどれも同じなのかな?
0599デフォルトの名無しさん
NGNGたぶんものすごい初歩的な質問ですみません。
int a[5]
while(1) {
scanf("%d",&a[i])
i++
}
配列変数のサイズを超えても構わないような方法を教えて下さい。
別の int b[6] を用意して、a からそっくり移せばいいのでしょうか。
0600599
NGNG0601デフォルトの名無しさん
NGNG配列をたくさん取っておく
0602Kusakabe Youichi
NGNG> while (1)とwhile (true)とfor (;;)のどれが一番いいんですか?
> どれも同じなのかな>
1つめと2つめはlintが文句いいますね。
出てくるコードはどれも同じでしょうけど。
0604Kusakabe Youichi
NGNG> int a[5]
> while(1) {
> scanf("%d",&a[i])
> i++
> }
> 配列変数のサイズを超えても構わないような方法を教えて下さい。
> 別の int b[6] を用意して、a からそっくり移せばいいのでしょうか。
だからscanfなんか使うな。
0605デフォルトの名無しさん
NGNGどれも同じ。
while(1)は警告を出す処理系があるので、for(;;)がよい。
と思うが、なぜかwhile(1)が良いという人も根強くいる。
0606デフォルトの名無しさん
NGNGvectorを使う。
0607デフォルトの名無しさん
NGNG使ってもいいが戻り値は見ろ、だろ。
ボケ
0608Kusakabe Youichi
NGNG> >>604
> 使ってもいいが戻り値は見ろ、だろ。
> ボケ
ぼけは自分でしょう。戻り値見ればscanf使ってもいいと思っているんだから:)
0609デフォルトの名無しさん
NGNG戻り値見てもどうしようもない事もある。
0610599
NGNG検索しても例のページばっかり引っかかっちゃって。
0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNGwhile(1) {
a.push_back()
scanf("%d",&a[i])
i++
}
0613599
NGNGありがとうございます。引っかかりました。
#include <vector>
vector<型> ベクタ名(サイズ);
ベクタ名.resize(サイズ);
これで解決しますでしょうか。
さっそく試してみます。
と思ったら >>612さんわざわざありがとうございます。
「push_back()」のあたりを調べてみます。
0614599
NGNGVC++ 6.0なのですが。
どういうことでしょう。
0615デフォルトの名無しさん
NGNG拡張子なしのvectorなら確実にあるはずだが。
0616599
NGNGusing namespace std;
この文を加えたらエラーが減ったんですが。
どうやら必要みたいですね。
0617デフォルトの名無しさん
NGNGstl のリファレンスとして、オレはよく
ttp://www-scc.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/stdlib/stdref/index.htm
を利用させてもらってる。
0618デフォルトの名無しさん
NGNG0619599
NGNG参考になりました。ありがとうございます。
おかげさまで一応完成しました。
ただ>>612さんの方法で
a.push_up() にすると
「関数が不正な 0 個の実引数をともなって呼び出されました。」になっちゃいます。
カッコの中に適当な数を入れたらエラーはでなくなりましたが。
それがちょっと気持ち悪いですね。
0620デフォルトの名無しさん
NGNG>それがちょっと気持ち悪いですね。
vector <int> a
while(1) {
int n;
scanf("%d",&n)
a.push_back(n)
}
0621デフォルトの名無しさん
NGNGどうやればいいんでしょうか?
ヒントだけでもいいのでおねがいします。(ペコリ
0622名無しさん@Emacs
NGNGexplicit の事か?
それとももっと本質的なところか?
0623621
NGNGレスありがとうございます
いや例えば、
void (bool test);
とかでfalseとかtrueとかを引数として持たすとして
普通の定数を入れてもコンパイル側はワーニングとして
でるじゃないですか。だからそれをエラーとして
コンパイルできなくしたいんです。
VCとかでそういう設定をかける以外ってないんでしょうか?
0624デフォルトの名無しさん
NGNGcl のオプション /WX を使う。
0626デフォルトの名無しさん
NGNGcl.exe は Visual C++ のコンパイラ実行ファイル。
Visual C++ 統合開発環境で設定するなら、メニューから [プロジェクト] [設定]
を開いて、[C/C++] タブ [カテゴリ] 一般を選択、表示されるダイアログにある
[警告をエラーとして扱う]
にチェック入れる。もしくは [プロジェクトオプション] に直接 /WX って書いても
良いけど(ここに書いた文字列が cl.exe に渡される)。
0628名無し募集中。。。
NGNGすいません、C++とVC++って何が違うんでしょうか・・・
0629デフォルトの名無しさん
NGNG0630デフォルトの名無しさん
NGNGC++は言語の種類だがVC++は特定の商品の略称。
それともアレか? VC++のC++標準非準拠部分が知りたいのか?
0631デフォルトの名無しさん
NGNG0633デフォルトの名無しさん
NGNG0634デフォルトの名無しさん
NGNG最強のC++開発環境とうたっているしな。
あと、もちろんCのソースもコンパイルできるよ(でなければあんなの使わない)
0635 ボーランドマンセー
NGNGむかついているのでボーランドマンセーです。
0636デフォルトの名無しさん
NGNGVS6.0Ent(アカデミック版)がVC++6.0Pro(通常版)の半値以下(笑)
0637 ボーランドマンセー
NGNGそうなんだよねー。
それで買う気が失せました。
学生を5000円でスカウトしようと
したら怪しまれて終わりました。
0638デフォルトの名無しさん
NGNG誰かご教授おねがいできないでしょうか?
0639Kusakabe Youichi
NGNG> constの使い方がいまいちよくわかりません。
> 誰かご教授おねがいできないでしょうか?
K&R 2ndにわかりやすく解説してありますよ。
0640デフォルトの名無しさん
NGNGconst T foo :fooオブジェクト
const T &foo :fooオブジェクト
const T *foo :fooポインタの指すオブジェクト
T *const foo :fooポインタの位置
const T*const foo:上の両方
T::method() const :インスタンス変数
を、変更禁止とします。
(同時にconst_castなしでconstを剥がす事も禁止されます)
0641デフォルトの名無しさん
NGNGないみたいだけど、テンプレートの定義を .cpp のほうにおきたいときって、
みなさん、どうしてますか?
やっぱり、ダミーの関数かなんかを作って、その中で、必要なテンプレート
引数を持った型を生成しておく、とかするんでしょうか。
例
foo.h:
template<class T> class Foo;
foo.cpp:
#include <foo.h>
template<class T> class Foo { .... };
void dummy()
{
Foo<int> fooInt; // 型 Foo<int> が生成される
Foo<char> fooChar; // 型 Foo<char> が生成される
}
0642デフォルトの名無しさん
NGNGfoo.cpp:
template<class T> class Foo { .... };
bar.cpp:
#include "foo.cpp"
void dummy() …
0643642
NGNGtest.h:
template<class T> class Foo {public: void test();}
test.cpp:
#include "test.h"
template<class T> void Foo<T>::test() {}
void dummy()
{
Foo<int> a;
a.test();
}
とかってこと?
> テンプレートの export って、g++ でも VC++ でも、まだサポートされて
> ないみたいだけど
「まだ」つーことは、そういう予定があるの??
0644デフォルトの名無しさん
NGNGさらに、別の翻訳単位からも呼び出して、リンクできるようにしたい
わけです。
hoge.cpp:
#include "test.h"
int main()
{
Foo<int> a;
a.test();
}
とか。
> 「まだ」つーことは、そういう予定があるの??
「プログラミング言語 C++ 第3版」の p413 には、
他の翻訳単位からテンプレート関数にアクセスできるようにするためには、
テンプレート定義に明示的に export を宣言しなければならない
という一文があります。
0645デフォルトの名無しさん
NGNGprivate:
int age;
double sage;
public:
A(int =0, double =0.0);
}
(1)のパターン
A::A(int a, double s): age(a), sage(s){}
(2)のパターン
A::A(int a, double s){
age = a;
sgae=s;
}
(1)と(2)はどう違うんですか?
またどっちを使った方がいいのですか?
0646デフォルトの名無しさん
NGNG別に違わないが、(1)ならクラス内での宣言順通りに初期化しないと
コンパイラが警告くれる場合がある(ので(1)の方が厳格)
0647デフォルトの名無しさん
NGNG(1)はメンバオブジェクトのコンストラクタで初期化。
(2)はoperator=で代入。
intにdoubleじゃどっちでも変わらんような気もするが。
0648デフォルトの名無しさん
NGNGint,double以外の何だったら変わるんですか?
0649デフォルトの名無しさん
NGNGコンストラクタ中で例外が発生すると、デストラクタが呼ばれない、ってのは
知ってる?
0650デフォルトの名無しさん
NGNGデフォルトコンストラクタのコストが高いような場合だと差が出るかも。
0651デフォルトの名無しさん
NGNGEffective C++ の12項を参照。
0652デフォルトの名無しさん
NGNG漏れなら Efficient C++ 2.4 をすすめるけどな
0653デフォルトの名無しさん
NGNGプリコンパイル済みヘッダにテンプレートヘッダいれると
コンパイル早くなるということなんだが
結局exportが有効になっても大してコンパイル早くならないとおもふ。
0654デフォルトの名無しさん
NGNGいい太古とはよくわかる。(IMEのバカめ)
使いたい型が最初から決まっている場合は、やはり、あらかじめ
生成しておくべき、ということでいいのかな。
0655デフォルトの名無しさん
NGNGclass A:
{
public:
const int b;
};
のbってどうやって初期化するの?
0656655
NGNG0657デフォルトの名無しさん
NGNG諦めてC言語でもやっとけ
0658デフォルトの名無しさん
NGNG{
public:
const int b;
A::A() : b(100){}
A::A(int n) : b(n){}
};
0659まちがい
NGNG{
public:
const int b;
A() : b(100){}
A(int n) : b(n){}
};
鬱
0660655
NGNG他に方法ないようねぇ?
0661デフォルトの名無しさん
NGNGconst_cast
mutable
0662デフォルトの名無しさん
NGNG0663デフォルトの名無しさん
NGNGじゃ、こういうのはどうだ?
template <int NUM>
class A
{
public:
enum { b = NUM };
A()
{}
};
A<100> a;
コンパイル時に値が確定してる必要があるけどね。
0664655
NGNGなんで
mutable const int *a;
は出来て、
mutable const int a;
は出来ないわけ?
0665デフォルトの名無しさん
NGNGa は intで const で mutableである。
後者は矛盾しているが、前者は、そうでもない。
mutable int * const a;
はエラーになるだろ?
(未確認)
0666デフォルトの名無しさん
NGNGmutable const int *a;
const は int にかかってるけど、mutable は a にかかってるのがミソだね
0667デフォルトの名無しさん
NGNGごめん、きちっとした規格書会社にしかおいてない。
0668655
NGNGややこしいなぁ。
って、655で言った
const int b;
の初期化ってmutableでは無理ってこと??
まぁコンストラクタかconst_cast使えば言い訳だけど。
0669デフォルトの名無しさん
NGNGclass B{
};
};
こういうクラス宣言があったとして。
この宣言をしてあるヘッダファイルを読み込まずに他のクラスでclass Bを使う(先行宣言する)の
ってできるのかな?
class A; //先行宣言
class A::B; //先行宣言?
class C{
A* a; //OK
A::B* b; //NG
};
0670デフォルトの名無しさん
NGNGconst int a;
const int *b;
mutable int c;
mutable int *d;
// const mutable int e;
const mutable int *f;
// const int * mutable g;
// mutable int * const h;
const int * const i;
0671デフォルトの名無しさん
NGNGコンストラクタとかデストラクタの定義をクラス外部に置いたとき、
inline付ける意味ってあるのでしょうか。
概念的に付けるのはおかしいのでしょうか。
0672デフォルトの名無しさん
NGNGだめみたいだね。これに似てるけど、g++ だと、
template<class T> void foo()
{
typedef T::B b;
}
なんてのも、templateのパース時にエラーになってしまう。
VC++ なら通るのに。
0674デフォルトの名無しさん
NGNGinline付けないとヘッダ(もちろんクラス定義の外ね)に書けない。複数のオブジェクト大るを
リンクするときに二重定義扱いされてしまう。それだけ。
0675674
NGNG0676デフォルトの名無しさん
NGNGclass A{
public:
inline A();
inline ~A();
};
inline A::A()
{
}
inline A::~A()
{
}
って、こんな感じ?全然おっけーなはず。
inline 付ける意味は当然「我はインライン展開を望む」ってなことで、
外部に置くと何が嬉しいかというと、
クラス定義が多少見やすくなるってことかな・・・?
0677デフォルトの名無しさん
NGNGclass A {} の中の方には inline は不要
0678デフォルトの名無しさん
NGNG> 外部に置くと何が嬉しいかというと、
> クラス定義が多少見やすくなるってことかな・・・?
A のメソッド中で B を使い、B のメソッド中で A を使うようなコードを書ける。
0679671
NGNG私の目的はまさに>>676の最後の行なんですが、
1. クラスの中で定義した内部関数は自動的にinline関数になる。
2. 内部関数をクラス外部で定義する場合はinline関数にならない。
3. 2の場合、定義の方にinlineを付けるとinline関数になる。
だったような気がしていたのですが、最近友人に
『クラスの内部関数は自動的にinline関数になる』(外部で定義しても、という文脈)
と言われて、なにやらこんがらがってしまいました。
それでコンストラクタやデストラクタはどうなんだろうと思い
ウェブ上のソースファイルをいろいろ漁ってみたのですが、
コンストラクタとデストラクタをクラス外で定義して、
さらにinlineを付けているというものは見つけられず、
一般的ではない(無意味な)のかなぁと思っていた次第です。
とりあえず>>674を踏まえたら『付けないと駄目』みたいですね。
0680デフォルトの名無しさん
NGNGinlineキーワードは、inline展開をするかどうか、
コンパイラがヒントとして使う。
つけないとダメかどうかは、コンパイラの性質による。
また、
コンパイラによっては付いていても展開しないし
コンパイラによっては付いていなくても展開する。
付いていても複雑な関数は展開しないし
付いていなくても単純な関数は展開する。
本当にinline展開されるのかどうかは、
つまり、コンパイルをしてみないと分からない、ということだ。
0681デフォルトの名無しさん
NGNGども。確信できなかったんで両方に付けてみた。
>>678
あぁ、そうか。そういえばそうだ。指摘サンクス。
0682674
NGNGないですよね?
# 自分の場合、たまたまクラスにtemplateを使っていたので
# inlineを付けなくても二重定義のエラーはでませんでした。
# もちろんtemplateがどうやって展開されるかもコンパイラ依存だと思いますが・・・。
0683674
NGNG「あれ? 俺何時の間に書いたっけ?」と思たーよ
>とりあえず付けておけば
だぁね。逆にソースの方に書く場合はinline付けない。
>>680
ちなみにMSVCだと__forceinlineてなキーワードもある。コンパイラオプション
でインライン展開の制御もできる。
0684デフォルトの名無しさん
NGNG0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNGなんで?
0687デフォルトの名無しさん
NGNG0688671
NGNGごめんなさい。>>682を書いたのは671です。
>>685
もう一つ疑問が生まれました。
派生クラスを基底クラスとして扱った場合(base_class* base_ptr=new derived_class)、
デストラクタをvirtualにしておかないとうれしくないことが起こる、
というのは分かるのですが、この場合
class A{
virtual ~A();
};
inline A::~A(){}
とするのは可なのでしょうか。
0689デフォルトの名無しさん
NGNGinlineつけないとダメだろ?リンクエラーじゃん。
付けても付けなくても実際にインライン展開されるかどうかは
コンパイラ次第というのはその通りだけどさ。
0690デフォルトの名無しさん
NGNGヘッダ上の話として「inline可」かつ「inline必須」だよ。
実際にはインライン展開されることは無いけどな。
でも普通は、class A { virtual ~A() {} }; と書くか、
CPP上に、inlineなしで A::~A() {} と書く。
0691デフォルトの名無しさん
NGNGvirtual なデストラクタのインライン展開は、スタティックバインドできる
なら可能なような気がするんだけど、どうでしょうか。
0694デフォルトの名無しさん
NGNGint aho( int i1 , int i2 , int i3 );
int main(int argc, char* argv[])
{
int iRet = 4 ;
int iRet2 = 0;
int iRet3 = 0;
int iVal = aho( iRet , iRet2 , iRet3 );
printf( "iRet = %d \n",iRet );
printf( "iRet2 = %d \n",iRet2 );
printf( "iRet3 = %d \n",iRet3 );
return 0;
}
int aho( int i1 , int i2 , int i3 )
{
i2 = i1 + 1;
i3 = i1 + 2;
printf( "i1 = %d \n",i1 );
printf( "i2 = %d \n",i2 );
printf( "i3 = %d \n",i3 );
return 0;
}
で、ahoの第2引数と第3引数に結果をmainに渡したいのだけど、
渡す方法がわかりません。どうすれば引数としてmainに戻せますか?
もちろん、戻り値で戻すのは知ってます。引数として値を戻したいん
です。
0695デフォルトの名無しさん
NGNGC++なら、int aho(int a, int& b int& c)とすればいいよ。
0696デフォルトの名無しさん
NGNG0697695じゃないが・・・
NGNGおいおい、なんの話だ?694か?ネタ?あれ。
0698690
NGNGinlineつけとけばインライン展開される*かも*しれん。
でも、virtualデストラクタとしたクラスは、
普通は基底クラス型のポインタ経由で扱いたいわけで、
それで扱う限り、スタティックバインド可能な機会が無い。
0699デフォルトの名無しさん
NGNG>>696がネタ、それにマジレスしている君はカコワルイ
0700デフォルトの名無しさん
NGNG>>697がネタ、そ
0701デフォルトの名無しさん
NGNG記念すべき700で何噛んでんだよ!
0702デフォルトの名無しさん
NGNG>>700がネ(略
0703デフォルトの名無しさん
NGNG0704デフォルトの名無しさん
NGNG呼べないというにハマって一時はめんどくせ〜って思ったけど、
const があるお陰でソースの可読性が飛躍的に上がった。
0705デフォルトの名無しさん
NGNG0706デフォルトの名無しさん
NGNGの B が、シングルトンになるような A は、どう書けばいいんですか?
0707デフォルトの名無しさん
NGNGA、Bのコンストラクタは隠蔽して、Aにシングルトンインスタンス
用のハンドル置いておいて、Aの代理コンストラクタでBを作るよう
にすれば?
0708706
NGNGやってみました。動いてるみたいです。
こんな感じで良いんでしょうか?
できれば、もっと B の負担を減らしたいです。
Windows98 Mingw1.1 で確認しました。
とりあえずエラーチェック無しです。
#include <iostream>
class A
{
public:
virtual ~A () { m_instance = 0; }
protected:
A () {}
static A* getInstance (A* (*newInstance) (void))
{
if (!m_instance)
m_instance = newInstance ();
return m_instance;
}
private:
static A* m_instance;
};
A* A::m_instance = 0;
class B : public A
{
public:
static B* getInstance (void)
{
return dynamic_cast<B*> (A::getInstance (newInstance));
}
const char* getName (void) { return "B"; }
private:
B () {}
static A* newInstance (void) { return new B; }
};
int main (void)
{
B* b = B::getInstance ();
cout << "My name is " << b->getName () << "." << endl;
delete b;
return 0;
}
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNG私なら template 使って書くかな。
template <typename T>
class Singleton
{
static bool m_IsAlive;
protected:
Singleton()
{
assert(!m_IsAlive);
m_IsAlive = true;
}
~Singleton()
{
assert(m_IsAlive);
m_IsAlive = false;
}
};
template <typename T> bool Singleton <T>::m_IsAlive = false;
template <typename T>
class A : public Singleton<T>
{};
class B : public A<B>
{};
0711デフォルトの名無しさん
NGNG意図がよく分からん。何か、これだと、
B と同じような定義で class C : public A { … }; も定義すると、
C::getInstance();
は、先に生成した B のインスタンスを返してくれちゃうけど。
0712デフォルトの名無しさん
NGNGいや、dynamic_cast やってるから、NULLだな・・・と、さりげなく突っ込んでみたり。
意図がわからんのは同感。
0713706
NGNGget〜 とかですか? instance や name の方が良いんでしょうか?
>>710-712
継承するだけでシングルトンになるクラスがほしかったんです。
>>707 さんの方針に従ってエラーを潰していくうちに、こうなって行ったので、
dynamic_cast とか良く分からないままです。
自分で考えていた時には、コンパイルも通っていませんでした。
複数のクラスで継承できないのは、継承したクラスのほうで dynamic_cast が 0 なら、
例外でも投げようと思っていましたが、出来ないのは変ですね。
template も良くは分かりませんが、何とかしてみます。
ありがとうございました。
0714デフォルトの名無しさん
NGNG> 継承するだけでシングルトンになるクラスがほしかったんです。
こんなテンプレートでどう?
template<class T> class Singleton : public T {
private:
static T *m_instance;
public:
static T *instance();
};
template<class T> T* Singleton<T>::m_instance = 0;
template<class T> T* Singleton<T>::instance()
{
if (!m_instance)
m_instance = new Singleton<T>;
return m_instance;
}
class B;
int main()
{
B* b = Singleton<B>::instance();
……;
delete b;
return 0;
}
0716706
NGNGどうも、ありがとうございます。
でも、Singleton<B>::instance() 以外では生成されなくするには、
どうしたら良いのでしょうか?
B のコンストラクタを protected に置いてみたら、
`B::B()' is protected
と怒られました。
0717714
NGNGあ、その質問で new Singleton<B>; にしていたわけがわかった (^^;
B のコンストラクタを protected にすると、B 以外 (B の派生クラスも含めて)
のインスタンスからは、明示的に B を生成することは出来なくなるんです。
だから、Singleton<B> からは、new B; はできない。ということで、
new Singleton<B>; にしてたんだな。ようやく思い出した。バカだ > おれ
んで、Singleton<B> のインスタンスとかは必要ないと思うので、Singleton の
デフォルトコンストラクタも private で定義しておくのが吉でしょう。
0718デフォルトの名無しさん
NGNG> 継承するだけでシングルトンになるクラスがほしかったんです。
じゃあ >>710 の class Singleton で良いと思うが。
0719706
NGNG仰る通りにしてみたら出来ました。
ちょっと思ったんですが、B のデストラクタは virtual にした方が良いんでしょうか?
それとも、Singleton には static なものしかないので、必要無いのでしょうか?
>>718
>>713 の時点で、>>710 さんのクラスで思った通りの結果が得られました。
ですが、後学のために instance () からポインタを得る方法も、
自力で template を使って実装しようと考えていたんです。
言葉足らずでした。
0720デフォルトの名無しさん
NGNG> ちょっと思ったんですが、B のデストラクタは virtual にした方が良いんでしょうか?
いいえ。
デストラクタを仮想化する必要があるのは
class A {};
class B : public class A {};
A* p = new B;
delete p; // p は A* 型
こういう、基底クラスへのポインタに派生クラスのインスタンスが入っている場合。このときに
デストラクタが仮想化されていないと「p は A* 型、つまり ~A() 呼べば OK」となって問題が
発生する。
Singleton() の場合には、そもそも Singleton 型のポインタに対して delete を呼ぶことはあり
えない(それを保証するためにデストラクタを protected にしてある)から、デストラクタは非
仮想で OK。
07211 v(^・^)v
NGNGModern C++ Designをもう読んだろうな。
どうやらC++はもはやクラス階層自体をテンプレートで
定義できてしまうようだ。デザインパターンコミュニティを
すっかり黙らせて、過去のイディオムをすっかりひっくり返す。
この高級アセンブラもどきが最も進化した言語であるとは皮肉だな。
この点についてご意見を伺おうか。君はC++を畏れるのか。
0722デフォルトの名無しさん
NGNGもう少しわかりやすく言え。
0723クロスボウとやら
NGNG出てきますが、こいつをクラスのメンバ関数にしたいと思います。
一般的(あいまいな定義ですが)にコールバック関数はPrivate、
Publicのどちらに定義した方がいいですか?Private派、Public派
の意見が聞きたいッス。
0724デフォルトの名無しさん
NGNGオブジェクト指向と関係ないんだし無理するこたあない
0725デフォルトの名無しさん
NGNG進化のなれの果て、だな。
アンモナイトが絶滅するときに奇形種が
さかんに出てきたのだが、ちょうど
そういう時期に相当するのだろう
0726クロスボウとやら
NGNGそーなんだよね。レスサンクス。
0727デフォルトの名無しさん
NGNGその本は読んでないが、
>どうやらC++はもはやクラス階層自体をテンプレートで
>定義できてしまうようだ
(partial) specialization を駆使する、てことか?
0728デフォルトの名無しさん
NGNGその奇形種とやらがJavaやC#ですがなにか?
0729デフォルトの名無しさん
NGNG突然変異と奇形は違うよ
0730デフォルトの名無しさん
NGNGObjective-C支持者の方ですか?
0731729
NGNGObjective-Cはキメラじゃないの?
0732デフォルトの名無しさん
NGNG>奇形
コレって主観的評価じゃん。同じだろ。成功すれば突然変異、失敗すれば奇形。
0733デフォルトの名無しさん
NGNGModern C++ Design が面白かった、と言いたいのでは? 俺も読んだけど、確かに面白かったよ。
0734デフォルトの名無しさん
NGNG違うよ。成功、失敗というレベルでの分類じゃないもん。
0735デフォルトの名無しさん
NGNGどういう分類か書いてないから、何ともいえんが。判断基準を明記した方が実のある議論に
なると思われ。(ならくてもいーけど)
0736デフォルトの名無しさん
NGNG0737名無しさん@Emacs
NGNG探したけど無いっぽい.
# 英語読めと言われたらそれまでなんだが…
0738732
NGNGそら劣等種は種を残せずに淘汰されるからそもそも遺伝できないだろうよ。
だから歴史の証明を待つまでは主観的評価、歴史の判定が下った後では
客観的評価だ。
C#は、さしづめJavaがC++とVBとObject Pascalに輪姦されてできた私生児って
とこかな 笑
0739デフォルトの名無しさん
NGNGもうちょっとまともな例えは出来ないのか?
お里が知れるよ
07401 v(^・^)v
NGNG・・・なんだこのクソレスは(゚Д゚)y
>>727以外、言語名の英単語しか言ってないじゃないか貴様ら。
>>737よ、Modern...は英語簡単なのでがんばって読めよこの(゚Д゚)バカチン。
>>733なんかまだ全部読んでないだろ!(゚Д゚)
下僕どもは年明けまでにMore Exceptional C++のレビューしておくこと!!
あ、俺はSchemeやってっから。いやほんと。んじゃ。
0741デフォルトの名無しさん
NGNG生物科出身の漏れにはツッコミたいところだらけだが
我慢します。
0742737
NGNGリョカーいした.簡単なら読んでみよう.でも漏れの英語力も相当低い・・・(蔚
その前に Exceptional C++ も読んだ事無い漏れは厨房か?
日々是勉強だのぅ・・・
0743デフォルトの名無しさん
NGNGあんた微妙にスレ違いじゃない?
推薦図書スレでやれよ
0744デフォルトの名無しさん
NGNGいや,アソコはすぐ荒れるから C++ 関係の本はこっちでやっもいいんじゃん.
・・・っつーかむしろこっちでやって欲しい・・・
0745デフォルトの名無しさん
NGNGJava「やめてっお父さん!!!」
C++「ふふふ、怖がることはないよ、安心しなさい...」
VisualBasic「ダンナ、犯っちゃっていいんですかい? ハァハァ」
ObjectPascal「Hejlsbergさんにも感謝しなけりゃな... 変態のおいらは後ろをっと」
Java「いっ痛いッッ!!! synchronizedだなんてッッッ!!」
C++「$unめ、Forteもっと使いやすくしろよ、64ビットだけじゃ満足できねぇんだよオラオラ」
VisualBasic「ぎ、ぎもぢええ〜プロパティプロパティ」
07461 v(^・^)v
NGNGC++スレでC++の本語らないでな〜にを語るんだこのバカチン(゚Д゚)め!め!
あっちはこっちで紹介されてる本参照してるんだよ!
これは言葉狩りですよみなさん!!
・・・つーかこのスレ立てたの俺だった!(゚Д゚)y
お前は最悪なのでInside OLE読破の刑なー!。なー!
0747デフォルトの名無しさん
NGNGあなたのIMEは壊れてるんですか?
0748デフォルトの名無しさん
NGNGこんごも、そのコテハンを使いつづけるようにな。ホットゾヌの NG ワードに指定するから。
0749デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNG自分がこれほどまでにtemplateの可能性を知らなかったとは、愕然!
template好きからtemplateオタクへ
0751デフォルトの名無しさん
NGNG出る!
0752デフォルトの名無しさん
NGNG値段になっとくいかねー。なんでこんな安いんだ。まっとけばよかった・・
0753デフォルトの名無しさん
NGNGうっはぁ! ついさっき、amazon で原書を注文しちゃったよ。
キャンセルしてこよー。
0754デフォルトの名無しさん
NGNG「お約束」くらい大事な本?
0755デフォルトの名無しさん
NGNG娯楽用だと思っておく方がいいと思われ(笑) でないと応用に苦しむ。
0756デフォルトの名無しさん
NGNG教えてください。たとえば、g++ では、以下のコードをコンパイルできます。
template<class T> class A {
friend bool operator==<T>( const A& x, const A& y );
};
template<class T> bool operator==( const A<T>& x, const A<T>& y )
{
return true;
}
int main()
{
return 0;
}
しかし、VC++ だと、2行目の operator==<T> の 「<T>」を削除しないと
コンパイルできませんでした。ところが、これを削除してしまうと、g++ では、
template_friend.cpp:2: warning: friend declaration `bool operator==(const
A<T>&, const A<T>&)' declares a non-template function
template_friend.cpp:2: warning: (if this is not what you intended, make sure
the function template has already been declared and add <> after the
function name here) -Wno-non-template-friend disables this warning.
というような warning が出ます。前のほうで何かうまいプロトタイプ宣言とかを
すればよいのかな?
0757デフォルトの名無しさん
NGNGおーこれすげーみたいな?
実際の現場で使えるかどうかは別問題って事かな?
0758デフォルトの名無しさん
NGNGこれでは駄目なの?
template<class T> class A {
friend bool operator==(const A<T>& x, const A<T>& y);
};
template<class T> bool operator==(const A<T>& x, const A<T>& y)
{
return true;
}
int main()
{
return 0;
}
0759デフォルトの名無しさん
NGNGそのうち、この本の手法使ったclass libraryが増えてくるような気がする…
0760デフォルトの名無しさん
NGNGSTLportを使った自分のプロジェクトに、VC++6標準のSTLを使ったライブラリ(*.libと*.hが利用可能)を
組み込もうとしたんだけど、上手くいかないんですよう。リリースビルド時に例外起こして逝きます。
デバッガで追いかけてみたらdelete時にメモリ破壊してました(debugビルド時は平気)。
ライブラリのヘッダの
#include <vector>
でSTLportの方のvectorがincludeされてしまい、おそらくそれが原因では無いかと思っておるのですが。
0761デフォルトの名無しさん
NGNGSTLスレ逝け
0762デフォルトの名無しさん
NGNG0763742
NGNG危うく原書チャレンジしちまうところだったよ・・・
これでまた俺の英語力は上がらんな(藁
0764756
NGNG引数の型の A のところに <T> を付けるわけですね。これもやりましたが、
やはり g++ では warning が出ます。class A の中での friend 宣言なので、
A が T を引数にとるテンプレートであることは、コンパイラにはわかって
いると思われます。
とりあえず、>>1 で示されているサイトにある標準仕様のドラフトを読んで
みることにします。
0765デフォルトの名無しさん
NGNG標準仕様に沿わないのがVC++
コレ定説
せめてANSIには準拠して欲しいよなあ・・・
0766Kusakabe Youichi
NGNG> >>764
> 標準仕様に沿わないのがVC++
> コレ定説
> せめてANSIには準拠して欲しいよなあ・・・
たとえばどの辺ですか?
0767Kusakabe Youichi
NGNG> >>764
> 標準仕様に沿わないのがVC++
> コレ定説
> せめてANSIには準拠して欲しいよなあ・・・
たとえばどの辺ですか?
0768Kusakabe Youichi
NGNG> >>764
> 標準仕様に沿わないのがVC++
> コレ定説
> せめてANSIには準拠して欲しいよなあ・・・
たとえばどの辺ですか?
0769デフォルトの名無しさん
NGNG名称が。
確かANSIの規格書にはVisual C++という名前を付けてはいけなかったはず。
0771デフォルトの名無しさん
NGNGfor(int i=0; i<N; ++i);
for(int i=0; i<N; ++i);
とか、
template<class T>
class Hoge
{
template<class U>
T method(const U& u);
};
0772デフォルトの名無しさん
NGNGあとは
void foo();
void bar()
{
return foo();
}
これがコンパイルできないとか。(おかげで bind が微妙に使いづらい)
0773デフォルトの名無しさん
NGNG要するにスコープから出るときにfoo()を実行したいということか?
bindってなに?
0774デフォルトの名無しさん
NGNG関数パラメータのデフォルト値に変数が使えない理由を知りたいです。
例えばブール変数をメンバに持ったクラスでトグル用のメンバ関数を定義するとき、
気持ち的には以下のようにしたいのです。
class my_bool {
public:
bool elem;
bool toggle(const bool& b=!elem) { // (*1)
// 引数が指定されればelemを引数の値にセット
// 引数が指定されなければelemを反転した値にセット
elem = b;
return elem;
}
};
もちろんこれは(*1)のところでエラーがでます。
これが可能ならば上のような操作を簡潔に書けてハッピーなのですが、
デフォルト値に変数が使われると何かまずいことがあるのでしょうか?
0775デフォルトの名無しさん
NGNGclass my_bool {
public:
bool elem;
bool toggle(const bool& b) {
return elem = b;
}
bool toggle() {
return elem = !elem;
}
};
0776デフォルトの名無しさん
NGNGあのう、クラス内で文字列を宣言して、それを定数にする方法ってありますか。
っていうか(あればですが)文字列の定数を宣言する方法がわかりません。
どなたか教えていただけますでしょうか。
0777デフォルトの名無しさん
NGNGeもπも大学の本読まなくちゃだめだぞ
テーラー展開とかそこらへん探せ
あとアークサインとかアークタンジェントとかも
キーワードだ。あれを整数でやるのはきついかな
0778デフォルトの名無しさん
NGNGclass Hoge{
public:
static const char* const str;
};
const char* const Hoge::str = "string-literal";
0779774
NGNG>>774に書いたのは簡単な例で、実際はトグルした後に長い処理があります。
ですからオーバーライドはしたくないのです。で、今どうやってるかというと、
class my_bool {
public:
bool elem;
bool toggle(const int& i=-1) {
if (i<0) elem = !elem; else elem = (bool)i;
return elem;
}
};
としています。これでもとくに問題はないのですが、
5行面のconst intをboolに変えるところでwarningが出ますし
見た目も良くないなぁと。で>>774に書いた疑問を感じたのです。
0780775
NGNG>トグルした後に長い処理
その長い処理を関数にすればいいだけじゃないの? それをオーバーライド
してる関数2つに入れればいい。
>bool toggle(const int& i=-1) {
> if (i<0) elem = !elem; else elem = (bool)i;
> return elem;
> }
「引数が指定されれば」という条件はソース書いてる時点で静的に判定
できる条件のはずなのにそれをわざわざ動的に判断する条件に読み替え
ようとしているようで気持ち悪いのだけど。
0781デフォルトの名無しさん
NGNG0782デフォルトの名無しさん
NGNGもしそれが const なインスタンス変数ならば、コンストラクタの
初期設定リストを使わなければ初期値を設定することはできない。
0783デフォルトの名無しさん
NGNGくだらん。何を悩んでるのかさっぱり。
class my_bool {
public:
bool elem;
bool toggle(const bool& b) {
return elem = b;
}
bool toggle() {
return toggle(!elem);
}
};
0784デフォルトの名無しさん
NGNGいや、そうじゃなくて。
普段 void を返すような関数に対して return foo(); なんて書くことはないんだけど、これがテンプレートを
使ってると良く出てくる。たとえば
class Object
{
public:
virtual void DoSomething() = 0;
};
std::vector<Object*> v;
std::for_each(v.begin(), v.end(), std::mem_fun(&Object::DoSomething)); // *1
とかね。
std::mem_fun から展開される std::mem_fun_t はたいてい
template <typename TRet, typename TParam>
class mem_fun_t
{
TRet operator(TParam* p) { return (p->*func)(); }
};
みたいに定義されているから TRet が void の場合 (上の Object::DoSomething() とか)だと
上の (*1) で VC6 だとコンパイルが通らなくなる。ANSI C++ 的にはコンパイルできるハズ。
> bindってなに?
bind は Boost.org にある boost::bind のこと。これを使うと引数を複数取ったり、参照をとる関
数に対しても関数オブジェクトが作れる。std::mem_fun, std::mem_fun_ret, std::bind2nd 捨て捨
てですよ。
class CTaskBall
{
...
int exec(const IControllerTask& con, DWORD dwTick);
};
class CTaskBalls
{
typedef std::vector<boost::shared_ptr<CTaskBall> > CBallList;
CBallList m_ball;
void exec(IControllerTask& con, DWORD dwTick)
{
std::for_each(m_ball.begin(), m_ball.end(), boost::bind(&CTaskBall::exec, _1, boost::ref(con), dwTick);
}
};
0785773
NGNG>上の (*1) で VC6 だとコンパイルが通らなくなる。ANSI C++ 的にはコンパイルできるハズ。
ああ、それか〜俺は仕方ないから無意味にtrue返したりとかしてるけどね(笑 どうせ使われて
ないのでコンパイラが最適化してくれるのではないかと願って。
イテレータとか、コンパイラが最適化対象として認識できないほどに抽象度が
高い物って少々緩くてもいいんじゃないかという気になってしまうな。
VC++7はテンプレートのウザい警告とか消えてるのかな?
0786名無しさん@Vim%Chalice
NGNGちーと調べてみるかいのぅ.
boost ってあんまいぢってなかったけどいぢってみよーかな.
0787774
NGNG> 関数パラメータのデフォルト値に変数が使えない理由を知りたいです。
正確には『クラスのメンバ関数のパラメータのデフォルト値にメンバ変数が使えない』
でした。外部変数ならばデフォルト値にできます。またメンバ変数であってもenum型なら
OKです。しかしconstのメンバ変数(デフォルトコンストラクタで初期化)は駄目でした。
何か理由があるのかないのか・・・。
>>783
悩んでいたのは実装方法とか実装方針についてではなくて、
メンバ関数のデフォルト引数にメンバ変数を与えてはいけないのは
どうしてかという点でした。実装については>>780,>>783にあったように
オーバーライドしようと思います。どうもです。
0788781
NGNGそのメンバ関数を使う場所がクラスの外なら
クラスを指定しないとメンバ変数にアクセスできないよ?
0789デフォルトの名無しさん
NGNGデフォルト引数として使えるのは、「宣言の時点でスコープに入っていて、
かつ、実体を特定できる変数、定数、関数などからなる式」と考えれば
よいと思う。
メンバ変数が指定できないのは、宣言の時点ではオブジェクトが存在しない、
つまり実体のないものを指定しているから。クラス変数なら、実体が
確定するのでデフォルト引数として使える。
0790デフォルトの名無しさん
NGNG0791デフォルトの名無しさん
NGNGはあ?アフォ?
0793デフォルトの名無しさん
NGNG>for(int i=0; i<N; ++i);
>for(int i=0; i<N; ++i);
このコードは、/Za コンパイルオプションをつければコンパイル
できますけよね。(これがコンパイルでき「ない」のが「言語拡張」、
ってのは、どーかと思うけど)
0794774
NGNGスコープを指定してもコンパイルが通らないのでやはり駄目なのだと思います。
>>789
なるほど。『宣言の時点で実体を特定できないものは駄目』というのは
感覚的によく判りました。const指定したとしてもコンストラクタが
呼ばれない限り実体はないので、定数だったらよいというわけでもないんですね。
なぜ実体がなければデフォルト値にできないかという話になると
仕様ということになるのでしょうか。
>>792
どうもです。オーバーロードでした。
名前も働きも似ているのでときどき判らなくなります。
0795真・初心者
NGNG「要素数がnであるint型配列xの最小値とその添え字を返却する関数」
を作りたいんですが、最小値は出せたけど添え字の返却がよくわかりません。
誰か教えてもらえないでしょうか?
0796デフォルトの名無しさん
NGNG阿呆ですか?
最小値ではなくその要素の添え字を返せば、
同時に最小値も取得できるでしょうに。
それとも、その配列とやらは関数内のローカル変数かよ。
DQNにマジレス、鬱氏
0797デフォルトの名無しさん
NGNGクラス定義の中でメンバ変数のスコープ指定ってどうやるの?
0798真・初心者
NGNGよくわからんのですが、例えば int X[i]があったとして、
Xは return(X)で返せますよね? iを返したい場合は return(i)じゃ
できないっぽいんですが・・・
0799真・初心者
NGNGmin=x[i]となっててminは返せるけど iはどうやって出せばいいんですか?
0800デフォルトの名無しさん
NGNG配列はどう渡した?
0801真・初心者
NGNG{
int min = x[0];
for (int i = 1; i < n; i++)
if (x[i] < min)
min = x[i];
return (min);
}
よくわからんがこんな感じです。iを出すにはどこをどうすればいいのでしょうか?
0802デフォルトの名無しさん
NGNGいみわからん
return したいのは x[i]なのか? iなのか?
0803真・初心者
NGNGしかし、もう一個をどうやって作ればiが返せるかがわかりませぬ。
0804デフォルトの名無しさん
NGNG#include <iostream>
#include <vector>
#include <algorithm>
template <typename T>
struct MinIter
{
T* m_index;
MinIter()
: m_index(NULL)
{}
void operator()(T& n)
{
if (m_index == NULL)
m_index = &n;
else if (n < *m_index)
m_index = &n;
}
};
int
main(void)
{
int n[6] = { 10, 18, 3, 35, 1, 5 };
int* p = std::for_each(&n[0], &n[6], MinIter<int>()).m_index;
std::cout << p - &n[0] << std::endl;
return 0;
}
0805804
NGNG0806デフォルトの名無しさん
NGNGコテハンウザイ、くだらん質問でageるな。
阿呆なオレに教えてくれ。
出ているエラーは何だ?
使っているコンパイラは何だ?
VC++とかいう腐れ環境でなければ、
for(int i=0;;);
とやったら、変数iはforの中でのみ有効だ。
forの前で宣言しろ、阿呆。
0807デフォルトの名無しさん
NGNGclassか構造体作ればできるけど、とても無意味。
0808デフォルトの名無しさん
NGNGきっとこうだろう。
問題も、「最小値とその添え字を返却する関数」だし。
template <class T>
std::pair<int, int> minof(T begin, T end )
{
int min=INT_MAX;
T min_it;
for( T i = begin; i != list.end; i++ )
{
if (*i < min)
{
min = *i;
min_it = i;
}
}
return std::pair<int,int>( min, std::distance( begin,min_it ) );
}
0809デフォルトの名無しさん
NGNG> classか構造体作ればできるけど、とても無意味。
俺は Generic Programming の良い題材だと思うけどね。そこで、つい for でループ回しちゃうのは
C のクセが抜けてないプログラマ。とはいえ 804 を真・初心者が理解できるとは思えんけど(w
真・初心者には、次の文章を読むことを強く薦める。
http://www.geocities.co.jp/SiliconValley/5656/
0810真・初心者
NGNGちなみにVC++のソースファイルを使ってやってます。
なんだかよく理解できないです。すみませんどうもありがとうございました
0811774
NGNGできないと思います。自分が駄目元で書いたのは
class my_bool {
bool elem;
bool toggle(const booll& b=!my_bool::elem) { return elem=b; }
};
ですが、当然駄目でした。それで>>781さんが言いたかったことは
たぶん別のことなんだと思います。今回は>>789さんのアドバイスで
class my_bool {
public:
static bool elem;
bool toggle(const booll& b=!elem) { return elem=b; }
};
bool my_bool::elem=true;
とすれば当初の意図が達成できることが判り、気持ちすっきりしました。
# 実際にはtoggle()を2個用意するか、別にset()を用意しようと思ってます。
0812デフォルトの名無しさん
NGNGゴメン、君面白いんで粘着させて。
> ちなみにVC++のソースファイルを使ってやってます。
私にも下さい、VC++“の”ソース(笑
プログラムの前に、最低限の日本語能力と逸般常識を学んでくれ。
教材としては、809さんが提示されたサイトが良いと思われ。
0813デフォルトの名無しさん
NGNGまだダメだ
numelic_limit<int>を使え
0814デフォルトの名無しさん
NGNG逸般常識のほうでいいのか?(藁
0815デフォルトの名無しさん
NGNG逸般で良いよ、IT業界(w)なんてオレも含めてDQNの集合だ。
多くは期待せん、PG/SE間に通じる意識でよし。
というか、真・初心者が一般常識を持つのは無理と思われ。
粘着終了、場を荒らしてすいませんでした。
0816デフォルトの名無しさん
NGNGでそのstatic版はコンパイル通るということね?
0817808
NGNGこれでどうよ、つか、numeric_limits‥‥
#include <vector>
#include <algorithm>
#include <limits>
template <class U, class T>
std::pair<U, ptrdiff_t> minof(T begin , T end )
{
U min = std::numeric_limits<U>::max();
T min_it = end;
for( T i = begin; i != end; i++ )
{
if (*i < min)
{
min = *i;
min_it = i;
}
}
return std::pair<U, ptrdiff_t>( min, std::distance( begin, min_it ) );
}
0818デフォルトの名無しさん
NGNGフン、まあ許してやるか。
> for( T i = begin; i != end; i++ )
は
> for( T i = begin; i != end; ++i )
とすべきだがナ
0820デフォルトの名無しさん
NGNG型無し汎用型をC++で実現してソースを載せてください。
文字列に対する演算はベーシックみたいのがいいです。
0821デフォルトの名無しさん
NGNGMSのvariant_tでも見とけ
0822デフォルトの名無しさん
NGNGベーシックを使ってください。
0823デフォルトの名無しさん
NGNGどうせ作るなら、正規表現系操作の方がよっぽど便利なのに。
たとえば、std::string str に対して、str.search( RegExp &exp )
みたいな拡張がしたいな、とか。
(RegExp::seach( std::string &str) は思想的にどっか間違ってる気がする。)
0824デフォルトの名無しさん
NGNGvoid*
てきとーにキャストして使え。
0825デフォルトの名無しさん
NGNGわざわざ min を持ってこなくても
T min_it = begin;
for (T i = begin; i != end; ++i)
if (*i < *min_it)
min_it = i;
で良い気がするな。一回多く比較するのはご愛嬌、間接参照が増えるのはコンパイラの
最適化にお任せ、ということで。(これで numeric_limits 定義してない型でも使えるし)
あとイテレータの指す値の方が必要なら iterator_traits<T>::value_type を使った方が良さ
そう。これなら T が int* だろうが vector<int>::iterator だろうが使えるし。
0826デフォルトの名無しさん
NGNG0827デフォルトの名無しさん
NGNGビルの窓からPCを投げ落とせ。
10階以上を推奨。
ついでにお前も飛び降りろ。
0828デフォルトの名無しさん
NGNG0829デフォルトの名無しさん
NGNGCOBOL板へ逝ってよし!
0830デフォルトの名無しさん
NGNGVC++で拡張子.cだとC++のキーワードでエラーになるね(classとか)
GCCは大丈夫みたいだけど
0831デフォルトの名無しさん
NGNGgcc もエラーになると思うけど。
拡張子によらず強制的に C++ のソースコードとしてコンパイルしたければ
gcc の場合 → g++ を使う、もしくはコンパイルオプション -x c++ を使う
VC6 の場合 → コンパイルオプション /TP を使う
じゃない?
0832デフォルトの名無しさん
NGNGVC++ のオプションに /Za 付けたらテンプレートで
エラー出まくりますが、そういうもんですか?
0833デフォルトの名無しさん
NGNGごめん
MakefileでCC = g++してた(w
VC++でもコンパイルスイッチあるんだね
知らなかった有難う
0834デフォルトの名無しさん
NGNG便乗質問、逆に強制的にcとしてコンパイルするオプションて、
VC++にありますか?
以前に調べた限りでは見つけられなかったので…
VC++スレ逝けとか言わずに、お願い。
0835デフォルトの名無しさん
NGNGcl /? で調べると 5 秒で見つかると思われ。
0836デフォルトの名無しさん
NGNGそういうもんです。あきらめましょう。
0837デフォルトの名無しさん
NGNG0838デフォルトの名無しさん
NGNG#define for if(0);else for
というマクロを定義しておくと少し幸せになれるかもしれません。
0839デフォルトの名無しさん
NGNGから派生したクラスは、その関数とは friend 関係にはない、という理解でよい?
たとえば、
class B;
class A {
friend void foo( B& );
}
class B : public A {
private:
int x;
};
void foo( B& b )
{
b.x = 1; // B::x にはアクセスできない
}
何だか、「C++ 第3版」の C.13.2 を見ると、上のようなことが出来そうな
気がするんだけど、g++ 3.02 とかで試すかぎり、エラーになる。
0840デフォルトの名無しさん
NGNGfnc(&lst);
void fnc(list<T> *lst) {←ここで”構文エラー : 識別子 'list' がシンタックスエラーを起こしました。”
...
...
}
というように、templateのlstを引数にした関数fncを作りたいのですが、
エラーが出てしまいます。
どこがおかしいのかわかりません。C++むずかしいっす。
どなたか助けて…
0841デフォルトの名無しさん
NGNGtemplate<typename T>
void fnc(list<T> *lst) {
...
...
}
0842Kusakabe Youichi
NGNG> list<T> lst;
> fnc(&lst);
>
> void fnc(list<T> *lst) {←ここで”構文(I閑� : 識別子 'list' が(I杓政現閑�ぢを起こしました。”
> ...
> ...
> }
> というように、templateのlstを引数にした関数fncを作りたいのですが、
っていうか、それ以前の文字化けしてますよ。
0843デフォルトの名無しさん
NGNGusing std;
もしくは、std::list<T>
って事とは違うの?
>>842
文字化けしてんのはあんたの脳味噌
0844840
NGNGおっしゃるとおりでした。std::つけないとだめなんですね。
どうもありがとうございます。
0845デフォルトの名無しさん
NGNG「それ以前の文字化け」ってなんですか?
0846840
NGNG半角カタカナ使っちゃいました。
0847デフォルトの名無しさん
NGNG>半角カタカナ使っちゃいました。
甘いな、「半角カタカナ使っちゃいました。」と書かなきゃ。
で、もう一度「それ以前の文字化けしてますよ。」とレスが付く。
コレ
0848デフォルトの名無しさん
NGNGusing namespace std;
か?
0849デフォルトの名無しさん
NGNGYES!
氏んで来ます…
0850デフォルトの名無しさん
NGNG>> void fnc(list<T> *lst) {←ここで”構文(I閑・ : 識別子 'list' が(I杓政現閑・ぢを起こしました。”
文字化けしてますYO!
0851デフォルトの名無しさん
NGNGいきなりC++に手を出すのは危険ですか?
0852デフォルトの名無しさん
NGNGC++を本気で理解するなら、C言語とアセンブリ言語を理解することになります。
危険ですが楽しいですよ、怖がらずにこっちへ来なさい(プ
0853デフォルトの名無しさん
NGNGハキーリ逝ってSTLに感動してるレベルの漏れには難しいYO!
もーちょっとガムバルのDA!
0854デフォルトの名無しさん
NGNGなんとなく使い方は解るんだけど…。
参照をポインターへ変換するプリプロセッサって考えていいんですかね?
0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNG0857デフォルトの名無しさん
NGNG言語以外の内容がほとんど全くないにも関わらず
細かい所を見ていくと現在最も難しい本だと思います。
boostとのアプローチの違いを見たりするとなお面白いと思います。
MSのコンパイラが準拠するのはマジで2004年くらいな予感なので
のんびりやりましょう。
0858デフォルトの名無しさん
NGNGintとvoidどちらをつけるかとか引数とか
0859デフォルトの名無しさん
NGNGint main( [int argc [, char** argv [, char** envp ] ] ] );
void main( [int argc [, char** argv [, char** envp ] ] ] );
仕様とかマニュアル、本を何故読まないの?
> intとvoidどちらをつけるかとか引数とか
角度とか?
0860デフォルトの名無しさん
NGNGint main(int argc, char**argv)
int main(int argc, char*argv[])
0861デフォルトの名無しさん
NGNG返り値にvoidは間違いです。
0862デフォルトの名無しさん
NGNGなんか、最近この質問妙にあちこちで見るんだけど。
宿題かしらん?
0863デフォルトの名無しさん
NGNGまだ第2章の途中までしか読んでないけど、すごく面白い本だね。
整数値から型を生成するテンプレートを使って、オーバーロード
された関数を選択する、なんてテクニックにはちょっと感動したよ。
テンプレートの基礎をしっかり押さえておけば、読みこなすのは
そんなに難しくないんじゃないかな、という印象だけど、やはり、
細いところが大変なのかな?
0864853 (857ぢゃねーけど)
NGNG3章はムズいぞー.
継承に再帰を使われると一瞬なんだか分からなくなる(苦笑)
まぁヲレが厨房なだけかもしれんが.
一応 Lisp 使ってたから再帰には慣れてたはずなんだけどねー.
0865853
NGNG0867853=854
NGNGヲレも好きは好きなんだよね.だから読んでてオモロイ.
でもムズいなーって(苦笑)
0868デフォルトの名無しさん
NGNG0869デフォルトの名無しさん
NGNG別々に2つのファイル(ソース+ヘッダ。ヘッダには宣言のみ)に定義
したのですが、ヘッダ内でお互いをインクルードすると互いのどちらかの
関数宣言が先に来てしまう事になって、宣言されてないクラスを参照している
というシンタックスエラーが出ます。解決する方法ありますでしょうか?
やっぱり仮想関数というのを使わないといけないんでしょうか。よく分かりません。
関数はこんなカンジのものです。test1メンバがtest2クラス自体を参照します。
void test1::show(test2& t2){}
0870デフォルトの名無しさん
NGNGクラスを宣言しなさい。
0871デフォルトの名無しさん
NGNGどこですればいいでしょうか?
2つのヘッダでは、
・相手ヘッダのインクルード
↓
・クラス宣言{
パブリック:
・相手のクラスオブジェクト自体を参照するメンバ関数プロトタイプ
}
となっています。
0872デフォルトの名無しさん
NGNG0873デフォルトの名無しさん
NGNG宣言
class test2;
定義
class test2 {};
0876ちょっと。
NGNG0877↑
NGNG0878デフォルトの名無しさん
NGNGただ、virtual系メソッド呼び出しはNGだったかな
0879876
NGNGですよね。あー、ビックリした。
0880デフォルトの名無しさん
NGNGスレ立て任せたぞ
0881デフォルトの名無しさん
NGNG868 じゃないが、とりあえず新スレ 1 に並べる書籍は
Modern C++ Design
Andrei Alexandrescu, Addison-Wesley, ISBN:0-201-70431-5
Generic Programmin - STL による汎用プログラミング
Matthew H. Austern, ASII, ISBN:4-7561-3441-6
ぐらいか?
0882デフォルトの名無しさん
NGNGC++スレ行けよ
genericスレ行けよ
たらい回しでどこにも誰もいなくなると思われ。
0883デフォルトの名無しさん
NGNGvoid foo()
{
throw (int());
}
とかやると、throw のところでコンパイルエラーになるんだけど、
これって例外指定だと思ってパースしちゃってるのかな?
VC++ だと通るみたいなんだけど。
0884デフォルトの名無しさん
NGNGintのコンストラクタなんか無いだろ
0885デフォルトの名無しさん
NGNGいや、int などの組み込み型でもコンストラクタは定義されてる。でないと template ライブラリを
書くときに困るぞ。
0886デフォルトの名無しさん
NGNGじゃ
int n = 5;
n.();
ってやったらn == 0になったりするの?
0887886
NGNGint n = 5;
n();
0888デフォルトの名無しさん
NGNGoperator () と constructorは別種のものだと思うのですが。
0889886
NGNGんじゃ、これ?
int n = 5;
n.int();
デストラクタの明示呼出ならやらないことはないと思う
んだけどコンストラクタは...
0890デフォルトの名無しさん
NGNGとlong型の変数にセットするにはどうしたらよいでしょうか。
どうしても頭がきれてしまいます。
0891いっぱいいっぱい
NGNGというエラーメッセージが出てしまうのですが、どうすればなおるのか
わかりません、どなたかご教授くださいお願いします。
0892デフォルトの名無しさん
NGNGgcc 2.95やと、
class test{}
void foo(){ throw (test()); }
も通らないね‥‥とか思ったら、
void foo(){ throw int(); }
だと通った。不思議な話。
>890
ええと、あなたのところでは、longは64bitだったりするのでしょうかね?
0893デフォルトの名無しさん
NGNGconst int &n=int();
通ったよ。
0894デフォルトの名無しさん
NGNG32bitです。
0x00000123456789ab
という値を構造体のメンバで配列をつかわずに
保持する事はできないのでしょうか?
0895デフォルトの名無しさん
NGNGQ:64bitの数を32bit変数1つに入れるにはどうすればいいでしょうか
A:(゚д゚)ハァ? 64bit分の情報を放り込むには、64bit以上の領域が必要だろが。
__int64とか、longlongでもつかっとけ。
0896デフォルトの名無しさん
NGNGlong long とかは使えんの?
0897デフォルトの名無しさん
NGNG調査不足でした。
ありがとうございます。
0898デフォルトの名無しさん
NGNGコンストラクタは n.(), n(), n.int() では呼び出せないだろ。入門書読んで出直せ。
int n = int();
0899883
NGNGすまん。んで、>>892 のように、
> void foo(){ throw int(); }
ならコンパイルできるわけです。つまり、throw (int()); と書くと、
void foo() throw( int …
のような例外指定とカンチガイして解析してしまうので、パースエラー
になるのかな、と。
0900デフォルトの名無しさん
NGNGおそらく、throw (int());
はint throw(int (*pf)());という関数宣言と見なされている。
関数名に予約語を使っておりエラーである。
(...int()...)がパラメータリストに見えるのだ。
宣言に見えるものは全て宣言になる。
0901デフォルトの名無しさん
NGNG10分くらい考えて、8割がたは納得しました。ためしに
return (int());
とやったら、これも同じエラーになりました。一方、
throw (int()+1);
はコンパイルが通ります。ということで、(int()) が
パラメータリストに見える、という説は説得力がありますね。
0902デフォルトの名無しさん
NGNG// 以下は全て同じ意味
int g(double d);
int g(double); // 仮引数名の省略
g(double); // 戻り値型intの省略
//以下は全て同じ意味
int f(int (*pf)()); // 引数は関数ポインタ
int f(int pf()); // 引数はやはり関数ポインタ
int f(int()); // 仮引数名の省略
f(int()); // 戻り値型intの省略
// 宣言と見なせるものは常に宣言
int n(); // 引数なし戻り値型intの関数宣言
では関数名らしきものがキーワードならそれを
宣言と見なすか見なさないかを標準が定めているのか
どうかは知らない
0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNGEffective STLによればこれを回避する方法はこれだ。
return ((int()));
が、うまくいかない上にむなしい。
暗黙のintを許しませんと警告するくせに
パーサーは古いままなのだきっと。
0908デフォルトの名無しさん
NGNGということでしょうかね。
0909デフォルトの名無しさん
NGNGvoid sub(const string &);
次のコードは正しい?
string s;
sub(s + s);
g++ではOKだけどBorlandのコンパイラではエラーになる。
0910デフォルトの名無しさん
NGNG米【TIME】紙が「Person of the 2001」の投票を行っています。
75年の歴史を誇る由緒正しい賞で、過去には「ヒトラー」や「レーニン」
なども選出されています。
TIME 投票ページ
■Masashi Tashiro■ で表記統一しましょう。(■は抜かす)
http://www.time.com/time/poy2001/
投票は削除を避けるために手動で。
締め切りは24日ですです。。。
こちらは軽いですけど結果はみれまえせん(連続投票可能)
TIME 投票ページ
http://www.time.com/time/poy2001/nominee_pop.html
※「Masashi Tashiro」で表記統一しましょう。
名前やメール欄など適当に 例)[email protected]
記入して、投票しよう。
新しいページがちゃんと開くまで待つ!!
VOTEの連打はダメ!!
葉書票もあるだろうから、ネット上で1位になっても安心できない。
2位にダブルスコア以上つけるのが望ましい。 。らしい。
本スレ
http://choco.2ch.net/test/read.cgi/news/1008799152/
前スレ
http://choco.2ch.net/test/read.cgi/news/1008799136/
0911デフォルトの名無しさん
NGNGクラス string の実装にもよると思われ。
0912デフォルトの名無しさん
NGNGどちらですか?
0913デフォルトの名無しさん
NGNGボーランドは
operator +
がconstをかえさないのかな?
0914デフォルトの名無しさん
NGNGオブションでエラーレベルから警告レベルに変えれたと思ったが・・・
C++は3年くらいご無沙汰してるので忘れた。
0915デフォルトの名無しさん
NGNGボーランドのコンパイラで試したが、エラー出ないぞ
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
0916デフォルトの名無しさん
NGNG非const から const へのキャストは文法上何の問題もないし。
>>909
#include<string>
したけど、
using namespace std;
を忘れてるとか?
0918909
NGNGこれでエラーになります。コンパイラはBorland C++ 5.5.1です。
extern void sub(const std::string &);
std::string s;
sub(1 ? s : s + s);
ちなみにstringでなくても同じエラーは起きます。
文法的に間違ってるでしょうか?
0919デフォルトの名無しさん
NGNG小さい石に躓いてないで工夫したら?
extern void sub(const std::string &);
std::string s;
std::string s2=1 ? s : s + s;
sub(s2);
とやったらエラー出ないと思うよ。
0920デフォルトの名無しさん
NGNG子どもじゃないだから、エラーメッセージくらい書けよ。
0921909
NGNG文法上どうなのかな?って聞きたかっただけです。
>>920
エラーメッセージは以下の通り。subの呼び出し部分でエラー発生。
Q:\>bcc32 test.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
エラー E2357 test.cpp 12: 参照は 'string' で初期化されているが 'string' 型の左辺
値が必要(関数 main() )
エラー E2342 test.cpp 12: パラメータ 's' は const string & 型として定義されてい
るので string は渡せない(関数 main() )
*** 2 errors in Compile ***
0922デフォルトの名無しさん
NGNGbcc5.5 は3項演算子にバグがあるって、別スレに出てたよ。
http://pc.2ch.net/test/read.cgi/tech/997074601/460-466
0924デフォルトの名無しさん
NGNGprivate:
A a;
};
がコンパイルできねーYO。
どうしたらいいんすかね?
VC++ & Win2000
javaなら速攻動くのにyo
0925デフォルトの名無しさん
NGNGJavaの変数はポインタじゃ。C++は違う。
class A{
private:
A* a;
};
0926デフォルトの名無しさん
NGNG横から御無礼。
924みたいなのってクラス定義、はじめて見たんだけど、
どんなときにこういうクラス定義使うんですか?
0927デフォルトの名無しさん
NGNGjava と同じことをしたいならば、
class A {
A* a;
};
だよ。
0928924
NGNGまじです。
java & perl 厨房だからポインタわからんのです。
そういうことですか。
皆さんありがとう。
>>926
tree構造とか再帰的にデータをもつことができるかなとおもって。
定石かどうかわからないけど、javaだと結構やると思うよ。
おれだけか?
0929デフォルトの名無しさん
NGNG0930デフォルトの名無しさん
NGNGclass A{
private:
A a;
};
C++の場合。
A a;と宣言したときに
a.aも宣言される、またそのときに
a.a.aも宣言される、
a.a.a.a
a.a.a.a.a
a.a.a.a.a.a
a.a.a.a.a.a.a
a.a.a.a.a.a.a.a
以下無限に続く
つまり賢いコンパイラは通らないわけだ。
俺のコンパイラは通るけどスタックオーバーフロー起こすよ。
0931デフォルトの名無しさん
NGNG> tree構造とか再帰的にデータをもつことができるかなとおもって。
> 定石かどうかわからないけど、javaだと結構やると思うよ。
> おれだけか?
いや、実際よくやるけど、C++ ではすべてポインタになる。Java のクラス型の変数は C++ ではすべてポインタだと考えれば、だいたい問題ない。
Java の
ClassA a = new ClassA();
は C++ では
ClassA* a = new ClassA();
になる。
C++ で普通に
ClassA a;
と書くと、この場合 a は new の必要なく既に存在してることになる。これは int などと同じように、参照ではなく確固たる実体であって、NULL にしたり他のオブジェクトを指したりすることはできない。
0932デフォルトの名無しさん
NGNGclass A
{
A* a;
void init(){a=new A();}
};
とやるのが普通
0933デフォルトの名無しさん
NGNGclass A {
vector<A> child;
};
でも通らないコンパイラもある。
テンプレートの実装によるのかも。
0934デフォルトの名無しさん
NGNGtypedef struct node {
int nodedata;
struct node* next;
} NODE;
みたいなのはC++ではあんまり見たくないなあ
0935デフォルトの名無しさん
NGNGC++ では、STL があるから、
基礎データ構造を自前でコーディングする機会がないっすね
0936デフォルトの名無しさん
NGNGそんなことはない。
バランスしない純粋な二分木とか、言語処理系の中間段階などで良く使う DAG といったデータ
構造は、STL ではサポートされてないもの。確かに C に比べれば、自前でデータ構造を作る機
会は少ないけどね。
0937デフォルトの名無しさん
NGNGdouble x,y,z;
}
class color:public vec{
}
クラスvecを継承しているクラスcolorで、
xを別の名前で使いたいのですができるでしょうか?
よろしくおねがいします。
0938デフォルトの名無しさん
NGNG0939デフォルトの名無しさん
NGNG0940デフォルトの名無しさん
NGNG書き間違えましたが、vecのメンバは全てpublicにしています。
>>939さん
colorクラスでもvecクラスで定義しておいたメンバ関数を使いたいのです。
ただ、普通に継承したらcolor(色)のメンバ変数にアクセスする時に
r,g,bを使いたいのにx,y,zでアクセスすることになり不自然だからです。
0941デフォルトの名無しさん
NGNG0942デフォルトの名無しさん
NGNGdouble &r,&g,&b;
color() : r(x), g(y), b(z) {}
}
…コンパイル通るかどうか全く自信ない。
>>940
しかし、色空間てことなんだろうけど、それでも
vectorからcolorが派生する設計自体が不自然な気がする。
0943938
NGNGあ、読み違えてた… 逆だ。
そういう意味なら、class colorのなかで#define r x とかってやればええんでないの?
俺なら r() return x ; r(double value) x=value ; とかやるだろうけど。
0944デフォルトの名無しさん
NGNGVC6のWin32 Console Applicationでカーソルの位置を変えたり、出力文字のフォントを変えたりするにはどうしたら良いのですか?
Cの参考書を読むと「cursesまたはncursesというヘッダファイルをincludeしろ」と書いてあるのですが、ヘッダファイルが見あたりません。
教えて下さい。
0945938
NGNG>派生する設計自体が不自然
おれもそう思う。
0946デフォルトの名無しさん
NGNG穴が2個あるからといって、
マンコと鼻穴を同じベースクラスで表現するようなもの。
0947946
NGNG0948デフォルトの名無しさん
NGNGVC++のサンプルにあるぞ。
名前はわすれた。
CDの中さがして
0949948
NGNGcurses使うやつじゃなくてね
0950デフォルトの名無しさん
NGNGその参考書はUNIX用だと思われるので、Windowsでは使えない部分があることを知りましょう。
0951デフォルトの名無しさん
NGNGゴルァァァァァァァ!
0952951
NGNG超誤爆・・・・
スマン・・・・
0953デフォルトの名無しさん
NGNGさがしてみます。
0954デフォルトの名無しさん
NGNGVC++.NETのプログラムを書きました。
でも、実行しようとすると、現在のユーザー権限では実行
できないと言われました。どうすればいいのですか?
0955デフォルトの名無しさん
NGNG0956デフォルトの名無しさん
NGNG0957デフォルトの名無しさん
NGNGどっかレジストリいじればいいんじゃなかったっけ。すれ違いだからほかで探せ
0958
NGNGよく考えたら
同じ名前の関数をもってるクラスを複数継承したら
どれを呼び出すことになるのよ?
わけわからんぞ。
0959デフォルトの名無しさん
NGNG#include <iostream>
class Base1{
public:
void foo(){std::cout << "Base1";}
};
class Base2{
public:
void foo(){std::cout << "Base2";}
};
class Hoge : public Base1, public Base2{
public:
void bar(){foo();}
};
int main(){
Hoge hoge;
hoge.bar();
return 0;
}
//-------------------------------------
>cl d.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
d.cpp(17) : error C2385: 'Hoge::foo' の派生があいまいです。
d.cpp(17) : warning C4385: 可能性 : 'foo' がベース 'Base1' of class 'Hoge' にあります。
d.cpp(17) : warning C4385: または : 'foo' がベース 'Base2' of class 'Hoge' にあります。
0960958
NGNGでも、それだと、同じ関数持ってるやつは複数継承できないってこと?
それじゃ多重継承って使いづらくない?
それともあいまいじゃない指定方法ってある?
0961_
NGNGオーバーライドすればよい。
またはクラススコープ演算子を使う
0962デフォルトの名無しさん
NGNGでいけるはず
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/l50
0965_
NGNGカンケーねえ。
ひたすら勉強だ。
みんなだってそうだろ?
0966デフォルトの名無しさん
NGNGまあ、そういうことだ。おれはいま、Effective STL、Exceptional C++、
マルチパラダイムデザイン、Modern C++ Design を並行して読んでる。
0967デフォルトの名無しさん
NGNG新スレ行こうか。
0968デフォルトの名無しさん
NGNG仕事より勉強の方が長い場合もあって欝
と、暗いまま年末に突入します
More Exceptional C++出たら正月休みに持っていけたのに。
0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNGある言語だよね。仕事のためというより、勉強そのものが楽しいっていうか。
まあ、そのうち恐竜みたいになって滅びるのかも知れないけど。
09721000
NGNG\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
0973埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0974埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0975埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0976埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0977埋め立て屋
NGNG0978埋め立て屋
NGNG0979埋め立て屋
NGNG0980埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0981埋め立て屋
NGNG0982埋め立て屋
NGNG0983埋め立て屋
NGNG0984埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0985埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0986埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0987埋め立て屋
NGNG0988埋め立て屋
NGNG0989埋め立て屋
NGNG0990埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0991埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0992埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0993埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0994埋め立て屋
NGNG0995埋め立て屋
NGNG0996埋め立て屋
NGNG0997埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0998埋め立て屋
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1009071535/
0999埋め立て屋
NGNG1000埋め立て屋 ◆Liz4zQaI
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。