C++相談室 part27

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-7
2v(^・^)v:04/01/19 04:39
■過去スレ■
 1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
 2 http://pc.2ch.net/tech/kako/996/996640937.html
 3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
 4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
 5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
 6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
 7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
 8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
 9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
 10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
 11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
 12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
 13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
 14 http://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
 15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
 16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
 17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
 18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
 19 http://pc2.2ch.net/tech/kako/1052/10526/1052625846.html
 20 http://pc2.2ch.net/tech/kako/1055/10551/1055162298.html
 21 http://pc2.2ch.net/tech/kako/1057/10575/1057580107.html
 22 http://pc2.2ch.net/tech/kako/1060/10603/1060361082.html
 23 http://pc2.2ch.net/test/read.cgi/tech/1062690663/
 24 http://pc2.2ch.net/test/read.cgi/tech/1066546387/
 25 http://pc2.2ch.net/test/read.cgi/tech/1067949669/
 26 http://pc2.2ch.net/test/read.cgi/tech/1070164402/
3v(^・^)v:04/01/19 04:39
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://std.dkuug.dk/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
4v(^・^)v:04/01/19 04:40
5v(^・^)v:04/01/19 04:41
6v(^・^)v:04/01/19 04:49
■関連スレ■
[C++】template 統合スレ]
 http://pc2.2ch.net/test/read.cgi/tech/1066493064/l50
[ぼるじょあがC/C++の宿題を片づけますYO! 19代目]
http://pc2.2ch.net/test/read.cgi/tech/1073566342/l50
[初心者にVisual C++を教えるスレ★ Part9]
http://pc2.2ch.net/test/read.cgi/tech/1068983609/l50
[■ VisualC++(MFC限定)相談室 MFC10.dll■]
http://pc2.2ch.net/test/read.cgi/tech/1074104008/l50
[ATL 相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
 http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
 http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
 http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室 Part8]
http://pc2.2ch.net/test/read.cgi/tech/1070222674/l50
[タダで使えるBorland C++ Part3]
http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Borland C++ BuilderX]
 http://pc2.2ch.net/test/read.cgi/tech/1065260556/l50
[Code of the Nerds" Digital Mars C/C++]
 http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて part3]
http://pc2.2ch.net/test/read.cgi/tech/1072484422/l50
[OpenWatcom C++]
 http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
 http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50
こんなもんかにゃ〜
後何かあったら付け足してください。
8デフォルトの名無しさん:04/01/19 04:52
>>1
乙++
小津>>1
c++の本家とその最先端の動向が良く判るサイトを晒して下さい
cujを読むのがいいんじゃないの?
>>999の続きキボン
>>13
1000
15デフォルトの名無しさん:04/01/19 15:01
変な質問なのかもしれないけど
ソースファイルの内容をまったくいじってないのに
「コンパイルの際にさっきはエラーが出てなかったのに今度は出る」
(あるいはその逆でもいいけど)
なんてことってある?ってゆうか何度かそういう事態に遭遇してるんだけど
なんなんすかこれは
>>15
俺の場合エラーじゃなく警告が出るけど内容をチェックした後は無視を決め込んでる。
>>15
1. コンパイルオプションが変わった。
2. ファイルの日付が変わったが、make ファイルがおかしい所為で
  中途半端にビルドされた。
3. 悪い小人さんがいる。
4. いじめにあっている。
>>17
5. 内容をいじっていないというのは勘違いで、ちょっと書式を変えたつもりが変になってた。
6. ハッキングされている。
7. ファイルが壊れている。
8. >>15の日頃の行いが悪いので天罰がくだっている。
単に二重人格なだけでしょ?
(1)本当は正しくコンパイル出来るのにエラーが出る
(2)本当はエラー(深刻なものではなく)なのにたまたま正しく見えるようにコンパイルされた

(1)は無くても(2)は有り得る?
何もやってないのにおかしくなった、という奴の半数以上は、何かやってるわけだが。
コンピュータは人間が指示したとおりに動く機械だからね。

こんなバグ出るはずねえよムキー!とかいちいち切れるヤツほど
プログラミングが上達しません。
ハードウェアにバグがある場合はどうすればいいのでしょうか?
全スレ最後のvectorとdequeの比較や乱数の話しでvolatileをつけていたのは
最適化しないようにしてCPU依存の話しにならないようにするため……
という認識でよろしいのでしょうか?
当方volatileを一度も使ったことないものなり。
STLつかうと一気に実行ファイルサイズが10倍に?!
>>24
VC7.1でvolatile使わないと、加算演算が一切がっさい削除される。
結局結果を残さなくてもいいな・・・・とコンパイラが判断して無駄な
処理はばっさり切り落とすからだろう。

volatileにするとマルチスレッドで他のスレッドからも読むかも・・・
と判断して最適化しないと思わるる。
>>25
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>27
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>>29
#include "stdafx.h"

後死ね。
>>30
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
ねぇねぇ。みんなコピペってコレクションしてるの?
それとも毎回探してくるの?
地鎮祭状態だな(笑)
3424:04/01/19 20:47
>>26
なるほど。
ありがd。
IDでないからコピペを一人で書き込んでるか、そうでないのか素人の俺にはわからんよ。
>>13
俺漏れも!
>>34
折角C++のスレなんだから、もう少し書いておくね。
volatileの意味はC++では拡張されて、クラスやメンバ
関数にも付けられる。
もしvolatileと宣言されたオブジェクトがあると、それは
volatileメンバ関数だけを呼び出せる。この点const
修飾子と似ている。
const と volatileの両方がつけられたオブジェクトは、
やはりconst と volatileの両方がつけられたメンバ関数
しか呼び出せない。マルチスレッドやマルチプロセスの
プログラムをC++で書く場合はしばしば関数のオーバー
ロードがこのために面倒な場合がある。
38デフォルトの名無しさん:04/01/19 22:45
関数についてる「const」のことなんだけど
あるクラスXで関数を定義するときに

void func() const
const X func()

こういうふうにconstをつけているのを見るのだけど、これの意味って
一つ目は「クラスのデータメンバを変更しないという意味のconst」で合ってる?
これにより定数オブジェクトからもアクセスできるようになるってことかな。
で、次がよくわからないんだけど、戻り値にconstをつけるのはなんでなの?
これをつけると何がどう変わるんでしょーか?
基本的な質問でごめんちゃい
>>38
戻値がconstということ。const Obj func() とかだと、const Objが戻される。
const X func(); は意味がない。
const X& func(); なら意味がある。
4140:04/01/19 22:56
訂正。
使いようによっては意味があるか。
func().somemethod(); が呼べたり、呼べなかったり。
>>39がObjと書いてるのが悪い
>>38
前に付けるconstと後ろに付けるconstじゃ意味が違うからね。
後ろにconst付ける時はその関数があるクラスのメンバ関数
でないと付けられない。
44デフォルトの名無しさん:04/01/19 23:06
そうすると例えば
int& func() なら
func()=適当な整数 とできるけど
const int& func() だと
func()=適当な整数 のような代入はできないってこと?
こんなことするかどうかは別にして。
>>44
メンバ関数ならわりとありうるが。
>>44
const_castと同じような意味で使えるかもしれないが。
>>44
const_castすると代入できるわけだが。(当たり前)

#include <iostream>

const int& func(const int& i)
{
return i;
}

int main()
{
int i = 9999;

const_cast<int&>(func(i)) = 1;

std::cout << i << std::endl;
}
実はconst char *だったりして
49デフォルトの名無しさん:04/01/19 23:35
みなさんどうもです!
自分でも色々やってみます
>>44

まさにそのとおり。
とりあえず、EffectiveC++の21項あたりを読むことを勧める。
WM_KEYDOWNのlParamの30ビットを見て1なら処理しないっていう記述はどう書いたらいいでしょうか?
論理演算とかビット演算とかで調べれ
最近ネタないね。
54デフォルトの名無しさん:04/01/21 03:11
int a=1;
int& r=a+1;
という表現は文法的に正しいですか?
一応私の環境ではエラーは出ないのですが。また

int& f()
{
static int x=1;
return x;
}

main()
{
cout<<f();
}

これはエラーにならないのですが
関数fの return x を return x+1 にすると
『参照は 'int' で初期化されているが 'int' 型の左辺値が必要』
というエラーが出ます。int& r=a+1 という表現が許されるのに
どうしてこういうエラーが出るのかいまいちわからないです。
それともそもそも int& r=a+1 という表現自体がおかしいのでしょうか。
それならむしろ納得がいくのですが・・・
>>54
正しくない。
a + 1 は式の結果だから、
規格上は普通の参照には渡せない。
(できるように拡張されたコンパイラもあるけど)

int a = 1;
const int& r = a + 1;

なら OK 。
const な参照の場合は
そういう式の結果でも入れれる。
その場合、式の結果を入れたテンポラリオブジェクトができて
それへの参照で初期化される。
もっとも、最適化されるとどうなるかは分からんけど。

あと、こういう風な束縛は関数の戻り値には適用されない。
テンポラリオブジェクトを作ろうとしても、
すぐ関数を抜けてしまうからね。
56デフォルトの名無しさん:04/01/21 06:01
ちょっと困ったことがありまして、Cで書かれた某APIをC++でラップしようとしてうるのですが、

setcallback((関数ポインタ型*)foo);

という関数にクラスのメンバ関数を与えてやりたいんですが…。
static メンバ関数を使えというのは無しで…。

これってどうやったらいいんでしょうかね?
 識者のご意見頂きたいです、はい。
>>56
thisポインタが関連付けられないので、無理。

> static メンバ関数を使えというのは無しで…。
じゃぁ普通の関数でも使えば。
>>56

そのAPIがユーザー定義の引数を取るならそこにオブジェクトのポインタを渡し、
それをオブジェクトへのポインタにキャストしてメンバ関数を呼ぶコールバックを使う。

なんか、この質問FAQだな。
ユーザー定義の引数で渡すのが基本だけど一応不可能でもないかも。(不可能ではないというだけ)
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=128
ただしかなり無理してるので何をしてるか分からないなら使わない方が吉。
関数の引数をtemplate引数にするつもりだったけど面倒なんで。
これ以上は実行時にコードを生成する以外に思いつかないけど。
>>59
呼んだだけで、動かしてないんですけど、
Alloc の戻り値 obj.functions[index] には、いつ値が入るんですか?
6160:04/01/21 08:03
s/呼んだ/読んだ/
6260:04/01/21 08:05
すいません、見つけました。Impl::Initですね。
>>60
Func_Dispatch<>::Init()を呼んだとき。
よく考えたらコンストラクタで初期化すればいいだけなことに気が付いたけど(^^;
ただまともに実用することは考えてないんで(作ってみただけ)
あと、引数や戻り値などをテンプレート引数にするつもりだったなごりでtemplateクラスになってるけど実質templateクラスの意味なくなってる(^^;
6460:04/01/21 08:09
お詫びにいいものオシエマース
http://lists.boost.org/MailArchives/boost/msg35037.php
6554です:04/01/21 13:30
>>55
非常に丁寧な解説ありがとうございます。
助かりました。
テスト
/ ヘッダファイル
#ifndef head_H
#define head_H

class Test { プロパティ メンバ関数 など }; // ここを5行目とする

グローバル関数
int function();
void set(); などなど

#endif

// ソースファイル
#include "head.h"
メンバ関数の定義
グローバル関数の定義

// main関数
いろいろ

↑このような状態でmakeすると
「 head.h 5: { が必要」とゆうエラーが出るのですが、どう見ても"{"は書いてあるので
どこを直して良いやら……
ちなみに以前はグローバルにできる関数をフレンド関数にしていて
それをグローバルにしたのが上記のものなんですが
その以前のバージョンではちゃんとmakeとコンパイルはできていました。
どなたかお導きを……
>>67の一行目はもちろん
// ヘッダファイルです
>class Test { プロパティ メンバ関数 など }; // ここを5行目とする
ここ
そこをどうしたらいいのでしょうか?
71デフォルトの名無しさん:04/01/21 18:11
そこの中身を書いてくれないと誰も答えられんと思う。
>>70
クラス定義の中で { が足りないとしか思えませんよ。
一行にクラスの宣言(定義?)を書くのが問題あり
7467:04/01/21 19:10
#ifndef Heimen_H
#define Heimen_H

class Heimen
{
private:

int x;
int y;

public:

Heimen(int u=0,int v=0);

int get_x() const {return x;}
int get_y() const {return y;}
void set_x(const int& u);
void set_y(const int& v);
const Heimen operator-() const {return (-1)*(*this);}

// ******************** フレンド関数 ********************

friend ostream& operator<<(ostream& output,const Heimen& X);
friend istream& operator>>(istream& input,Heimen& X);
};

グローバル関数
const Heimen operator+(const Heimen& X1,const Heimen& X2);
以下いくつかグローバル関数の定義がある

#endif
7567:04/01/21 19:14
メンバ関数など、だいぶ端折りましたが
こんな感じです。あと当然検索で "{" や "}" を探しましたが
一箇所多い(少ない)ということはありませんでした。
>>75
そこまで削った結果でもまだ出ることは確認してあるんだよね?
で、それだけではやはりコンパイルできないので
(たとえばostreamにstd::を付けていないのは、その前に#include <iostream>と
using namespace stdがあるはずであることを示唆している)
includeする側も最小限にして、問題が再現する全体を提示してほしい。
7767:04/01/21 19:27
わかりました。
とにかく問題の起こる最小限のソースにしたいと思います。
少々時間がかかると思いますが、今から作業をして再びソースを書きます。
>>74
どう見ても必要なセミコロンがないように見えるんだが?
単なるコピペ間違いか、それともネタかね?
>どう見ても必要なセミコロン
どれ?
というかコメントくらいまともに書けよ・・・と
8167:04/01/21 21:03
どうやってもエラーが消えないと思っていたのですが
#ifndef Heimen_H
#define Heimen_H
#endif
この3行を消したらエラーが出なくなりました。
(まだ他のエラーはあるのですが……)
エラーの出た理由はなんだったのでしょうか?
今日は寝ろ
test
8456:04/01/22 00:43
勉強になりました、57-60
やっぱりこんな感じになるんでねぇ今ひとつ自信がなかったのですが、
これで逝ってみます。ありがとございますた!!

void CallBack(CHoger* hoge)
{
hoge->Hage();
}

class CHoge {
void SetCb()
{
SetCbApi(CallBack, this);
}
virtual void Hage();
};
ブーツ・オン・ザ・グランドを果たしても、
結局アメリカは全頭検査しないんだな。
イラクから自衛隊全面撤退してもいいんじゃないか。
>>85
狂牛病ぐらいでびびってんなよ。いつかは死ぬんだ。
誤爆にマジレスすんなよ。自作自演か?
まぁ、ヨシ牛食えなくなるのは痛いがナ。

ところで吉牛嫌いなC++プログラマーとかいるんかの?
嫌いじゃないがあまり食わないな
簡単に済ませるときはマックでフィレオフィッシュ
質問です。 new(std::nothrow) を使用して確保したメモリを解放する際には、
普通の(placementでない) operator delete() を使用してもよろしいのでしょうか。

void operator delete[](void*, const std::nothrow_t&) throw();
↑newヘッダファイルに std::nothrow を引数に取る operator delete() が定義されていますが、
使い方がわかりません。

よろしくお願いします。
9089:04/01/23 13:06
定義じゃなくて宣言ですね。
少なくともoperator delete()は、operator new()と対になったもので
malloc()/free()に例外とnew_handlerを加えたような動作をする。
new演算子やdelete演算子とは異なり、メモリの確保/解放をするだけ。
9289:04/01/23 15:29
>>91
回答ありがとうございます。すいません。私の書き方が悪かったです。
  char *buf = new(std::nothrow) char[1024];
として確保したメモリを、
  delete[] buf;
として解放してもよいのかを聞きたかったんです。
ヘッダファイルを見ると std::nothrow を引数に取る delete がありますが、
この delete を呼ぶ必要はあるのでしょうか。
>>92
そのnewは旧式のnew(メモリが確保できないとstd::bad_allocを
投げないで0を返す)だからもちろんdelete[] buf; は必要だよ。

俺はまたplacement_newについて聞いているのかと思った。
>>93
回答ありがとうございます。
  operator delete[](buf, std::nothrow);
としなくてはならないのかと混乱していたのですが、普通に
  delete[] buf;
でよいということですね。placement deleteは謎です……。

とにかく、ありがとうございました。
placement deleteって何?
placement newに対するデストラクタ呼び出しは
デストラクタの直接起動だよ
>>94
おいおい、deleteは全部nothrowだぞ。それから>>95も言ってるけど
placement deleteなんて物は存在しないぞ。
new/delete new[]/delete[] new(std::nothrow)/delete(t, std::nothrow)
のペアがあって
new(std::nothrow)[]の対になるdeleteは何かという話じゃないの?
placement new と ただのnewって何が違うの?
後、return hogeとreturn(hoge)の違いは何?
operator delete[](buf, nothrow); で呼べるけど、
多分 delete[] buf; でも同じことだと思う。
規格上はどうなのかな?
>>98
> 後、return hogeとreturn(hoge)の違いは何?
同じ。
a = 0; と a = (0); で違いがないのと同じようなもの。
>>95
それでもいいけど、
operator delete(p, NULL); でもいい。
new/delete の対応がないのが気持ち悪い人用。
>>101
それだけだと、デストラクタが呼ばれないんじゃない?
ほんとだ。呼ばれない。
じゃぁ、オーバーロードした delete って
どうやって呼ぶんだ?
Elements of Reusable Object-Oriented Software CD
ダウンロードしたぜ。(w
URLは・・・・秘密。ぐぐれ。必死に。
>>98

returnに()をつけるかどうかは結構宗教論争の種。
つけない派の主な理由は、
「タイプミスしてretrun (foo);とした時に、コンパイルエラーにならない。
 こういう場合、やっぱりコンパイラで落としてほしい」
というもの。要するにretrunという(外部)関数とみなされて、
リンカでやっとチェックが入る。

C++だったらエラーにしてくれるような気もするが、
俺は上記理由をきいて以降つけない派なので確認してない。

どっちかというとC++じゃなくてCの内容だ。
すれ違いすまん>スレ住人。
>>103
placement new が成功した後、コンストラクタから例外が飛んだとき呼ばれる。

placement new ってのは、引数つきの new を総称する用語、
だったとおもう。
大抵のエディタならreturnなどの予約語は色付けされるから
パッと見てtypoに気付くと思うのだが…
108105:04/01/24 09:31
それはWindowsなんかで統合環境が出来てからの話。
というか、今、ジェネレーションギャップを感じた俺。
無駄な括弧は書かないだけだな。
括弧がないからってどこまでがreturn式なのかわからなくなることもないし(笑)
俺は普段は括弧を書かないけど、
return に続くものが 2/3 項演算子を含むときは
括弧で囲んだ方が見栄えがいいので括弧で囲むな。
まぁ、趣味の世界だな。
>108
しかし今となっては107が全て。
カードにfortranのコードを書いてた時代の常識など誰も覚えちゃいないのと同じ事。
エディタでもC++予約語、MS予約語なんかは
色がついてないと気持ち悪いよな。
MS の予約語はどうでもいいや。
主にモノクロ vi でプログラムしてるので
たまに VC++ でプログラムすると
色やインテリセンスのありがたみを
ひしひしと感じる。
>>111

だから括弧を書けというのかあんたは?
カッコつきは return を関数か何かと勘違いしてるように見えてダサい。
>>114
> 主にモノクロ vi でプログラムしてるので
vim(gvim)使えば?
>>117
正直 UNIX ではgvimをつかっても何もいいことがないような気がする。
vim + color terminal のほうが便利。
>>89
IS 3.7.3.2の3より。
>...Otherwise, the
>value supplied to operator delete(void*) in the standard library shall be one of the values returned
>by a previous invocation of either operator new(size_t) or operator new(size_t, const
>srd::nothrow_t&) in the standard library, and...

というわけで、問題なし。
120デフォルトの名無しさん:04/01/24 18:11
しょうもない質問でもうしわけないのですが、
if(obj != NULL && obj->data > 100)
  std::cout << obj->data - 100 << std::endl;
のように obj != NULL の評価が false の時、
obj->data > 100 は評価されないことが保証されているのでしょうか?
今まで、前の結果に関係なく全てが評価されると思い込んでいたもので。
>>120
C / C++ では、保証されている。
短絡評価でググルべし。

同様に、a || b なら、a が真 (と評価される) なら、b は評価されない。
>>120
基本的には保証されてるけど、
operator&&() を自前で実装した場合は逆に必ず評価される。
123デフォルトの名無しさん:04/01/24 18:29
>>121-122
レス有難うございます。
ついさっきまで全て評価されると思い込んでいて、
if(obj != NULL)
  if(obj->data > 100)
    std::cout << obj->data - 100 << std::endl;
と、 obj->data に不正アクセスされまいと if 文を分けていました。
いつもこれが嫌だったんですがこれですっきりします。
でも operator&&() だけが評価方向(結合規則?)が違うのも
ちょっとすっきりしないですね。
もう少し調べて見ます。ありがとうございました。
>operator&&()
演算子に見えるけど実体は関数/メンバ関数だから、
関数の引数の評価規則に準じるという意味では自然かと。
127123:04/01/24 18:59
>>122,124
a && b && c && d
とやったら d, c, b, a と評価されるのかと勘違いしてました。
おっしゃる通り自然でした。

>>126
三項演算使う場合も b ? f() : 0; なんてやってたもんですから、
今から全てそういう形式に書き直そうかなぁと考えてます。

templateの再帰だのなんだのやる前に基本的なことがわかっていなかった・・・。
長いことc/c++やってるけど意外と知らないことが多すぎ。
本当に長いことやってそれだったらやばすぎ。
他人のソースをまともに理解できてないことだってあっただろうに。
129123:04/01/24 20:05
>>128
常識ってことですか…。今まで引っかかりすらしなかった…。
あまり他人のソース見てないと言われれば見てないかも。
ちなみに本職ではないのであまりつっこまんでくだせぇ。
>>122
ちょい待ち。関数呼び出しの引数評価の順序は不定。

from More Effective C++ 項目7:「&&,||,,をオーバーロードしない」
>>130
引数評価の順序が不定なことと、引数がすべて評価されることは何も矛盾しないぞ。
>>122
お、読み違え。スマソ
>>131
指摘ありがd
13389:04/01/25 01:06
>>119
なるほど!やっと理解できました。

みなさんどうもありがとうございました。
134デフォルトの名無しさん:04/01/25 02:09
struct Hoge {
 template < typename T > operator T () const;
};

というクラスがあるとき、

Hoge hoge;
if(hoge) { ... }

と使った場合に、Hoge::operator T() の T は bool 型として呼ばれることは保証されているのでしょうか?
>>134
boolが明らかに必要な場所だから hoge.operator<bool>();
として呼び出される。
136134:04/01/25 03:23
>>135
お答えありがとうございました。bool なのですね。

C++だと、int や void* でも if の判定に使えてしまうので、
もしかしたら〜と心配になっていました。
つーかこんな危ないテンプレート作るなよ。
型ごとに個別に定義しとけ。
サブクラス = スーパークラス;

の形で代入された場合にサブクラス固有のメンバを初期化したいと思っています。
そこで

class foo { protected: int foo_value; };

class bar : public foo
{
private: int bar_value;
public: bar & operator =( const foo & f )
{ foo_value = f.foo_value; bar_value = foo_value * 2; return *this; }
};

のように書くと「protected メンバにアクセスできません」とコンパイラに怒られてしまいました。
foo_valueをprotectedにしたままこれを実現するにはどうしたらいいのでしょうか。

また、実際には

サブクラス<hoge> = スーパークラス<piyo>;

のような変換も目的としています。
>>138

 foo::operator=(f);

でいいんじゃないかな?
オーバーライドした時に
スーパークラスのバージョンのやつを呼ぶことがあるのと
同じようなこと。
140138:04/01/25 10:33
>>139
すみません。
言っている意味が良く分からないのですが、

foo::operator=(f);

はどこに書くのでしょうか。
それともfoo::operator=(f)をfooクラスに作るという意味ですか?
そうするとbarクラスの初期化をどうやるのかが分かりません。
>>140

 foo_value = f.foo_value;

の代わりに

 foo::operator=(f);

ってこと。
今の状態だと foo で = 演算子を定義してないから、
デフォルトの = 演算子(メンバ全部代入して移す)が適用される。

もしこれがいやなら、代わりに
適当な protected メンバ関数でも作って、
それ呼べばいいんじゃないかな?
142141:04/01/25 10:41
あぁっと、
> もしこれがいやなら、代わりに
> 適当な protected メンバ関数でも作って、
> それ呼べばいいんじゃないかな?
は、foo に作るのね。

class foo {
protected:
 int foo_value;
 void copy_value(const foo& f) {
  foo_value = f.foo_value;
 }
};

class bar {
 int bar_value;
public:
 bar& operator=(const foo& f) {
  copy_value(f);
  bar_value = foo_value * 2;
  return *this;
 }
};
143138:04/01/25 11:09
>>141
おぉ、成る程!
ありがとうございます。

しかし、barはfooを継承しているのに
外から来たfooのprotectedメンバ変数にアクセスできないというのが納得いかないのですが。

class baz {
private:
int my_value;
void copy( const baz & b )
{ my_value = b.my_value; }
};

はb.my_valueが外から来たbazのprivateにも関わらずちゃんとアクセスできるのに。
だよなぁ。
でも、何らかの危険性を回避するために
そうしてるんだろうなぁ。
それが何かはパッとは思いつかないけど。
>>143>>144
同じクラスのprivateメンバ、protectedメンバはアクセス
出来ても、継承したらもう外部からはアクセスできない
というルールが見つかればいいんだよね。
Javaでthis.x = x;とするように、インスタンス変数とメソッドのパラメータを
同じ名前にして、値を受け渡す様なことは出来ないでしょうか。

class hoge{
 int value;

 public void method(int value){
  this.value = value;
 }
}
こんな感じで。
(*this).value = value;
ではだめ?
できますよ
this->value = value;
150147:04/01/25 16:46
this->valueでもいいかな?
151147:04/01/25 16:47
うお、かぶったーーーーースマソ
メンバ変数にプリフィクスでも付けた方が
タイプ数減ると思うんだけどなぁ。
あぁ、そうか。
他のところで増えるんか。
154146:04/01/25 17:48
どうもありがとうございました。
for文でcinから入力された文字がAかBかCかDならforから抜け出すという
条件を書きたいのですが…何回も書いても上手くいきません。。
教えていただきたい…。
>>155
とりあえずうまくいかないコード見せないと、なんとも。
VC++でSTLのVectorコンテナをいろいろ試してるんですが、
erase()メソッドで要素を一部削除しても、サイズが減少しません。
これはどのコンパイラでも同じなんでしょうか?
それとも要素である構造体にデストラクタを実装しろということなんでしょうか。

>>157
自己レスです。
vector<int>で試してみるとやっぱり減ります。

struct item
{
string name;
string type;
int size;
};

vector<item> vitem;

の最初のstringだけが削除されているようです。
デストラクタでname.clear()かなんかしろということなんでしょうね、きっと。


erase する部分のコードも欲しいな。
160プログラム初心者:04/01/26 21:20
こんにちわ。現在、USBハブ経由で複数のUSBケーブルをPCに繋いで
それらのケーブルに接続した携帯電話同士でデータ転送を行いたいと
考えております。
OSによっては毎回USBケーブルに割り振られるポートが変わってしまう
ようなのですが、これを回避する為にケーブル毎に割り振られるポート
をプログラム的に指定したいと考えております。
例えばC++を使用した場合どういった実現方法があるでしょうか?
ポートを指定できるようなオブジェクトが標準で提供されている
でしょうか?
どなたか御存知の方がいらしたら宜しくお願いします
>>160
>>ポートを指定できるようなオブジェクトが標準で提供されているでしょうか?
C++言語ではそういったライブラリは用意されていません。
ご使用になる OS の API 等をご確認ください(「このスレッドで質問する」以外の方法で)。
>>157-159
むしろ、サイズ・削除されているorいない、をどうやって確認しているかの方が怪しいな。
>>157
swap技法(Effective STL日本語版P76)
std::vector<item>.swap(vitem);
>>163
括弧が抜けてるYO
std::vector<item>().swap(vitem);
キャパシティじゃなくてサイズって言ってるし
>>164
うぉ、コンストラクタを呼び出す()を忘れた。
>>165
よく読んでみるとそうでした。

std::vector::erase(itr)はイテレータが指す要素を削除し、次の
要素を指すイテレータを返しますが、サイズは変化しません。
サイズを変化させる(切り詰める)には明示的にstd::remove()
を呼び出す必要があります。
>>166
ん? サイズは減るでしょ。減らないのはキャパシティ。
168デフォルトの名無しさん:04/01/27 14:11
ちょいと初歩的かもしれないが質問させてちょ
#include <iostream>
using namespace std;

class CClass_A
{
public:
 CClass_A() { cout << "A Construct" << endl; }
 ~CClass_A(){ cout << "A Destruct" << endl; }
};

CClass_Aa;
int main(){ return 0; }

上のソースだと CClass_A のコンストラクタは呼び出されるけど、
デストラクタが呼び出されない。
これって永遠にデクトラクタ呼び出されないコース?
CClass_A a の有効範囲からして終了時に呼び出されるから画面にはでないだけで
実は呼び出されているとか?
hoge.exe >> hoge.txt でテキストに落としたけど
やっぱりデストラクタは呼び出されていないんだ
素直に new して delete しろってことかい?
CClass_Aのデストラクタより先にstd::coutのデストラクタが呼ばれてるので、
CClass_Aのデストラクタが呼ばれるときにはすでにstd::coutが無効になっている。
ただそれだけ。
>>169
なるほど std::cout が先に無効になるんだ
デストラクタで最終的にログを取りたかったからデストラクタの部分に
テキストファイルとして出力するように改良してみたらうまく呼び出されてたよ

これで謎も解けたしログも取れたしC++はおもしろいや
>>166
もうちょっと落ち着いて、確認してから書き込んでください。
157です。
サイズってのはsize()という意味ではなく、実メモリ領域の大きさを
いいたかったんですが、結局のところ、erase()すると開放されるんでしょうか?

まあ、end()のイテレーターは確かに削除後の最後の要素を指しているようなので
気にしないでとっととコーディングを進めることにします。

みなさんありがとうございました。
173デフォルトの名無しさん:04/01/27 21:55
>>172
> erase()すると開放されるんでしょうか?
されない。どうしても解放しなければならない理由が
あるのなら、>>163の方法を使う。
174sage:04/01/27 21:55
>>169
コンストラクタの逆順でデストラクトされるってルールに従えば
CClass_A aの構築前にcoutが構築されているなら大丈夫な気がするんだけど……

って、これが保証されるのは同じ翻訳単位内だけだっけ?
>>168
規格違反と思われ。
現象が発生する環境キボン。
>>172
いや、std::vector::erase()は配列に0を書き込むようなもの。もちろん
そこに入ってるものがクラスならデストラクタも呼び出してくれる。
しかしポコッと穴が開くだけ。

開放するという意味とキャパシティが減少するという意味を取り違え
なければわかるはず。
>>176
いや、だからvectorのeraseは詰めるって
それでsizeが減少するんだって
>>176
いままであんたの作ったコードにstd::vector::erase()がなかったことを祈るよ。
clear が erase で実装されてるのを見たことがある希ガス
とどのつまりは、std::vector::erase()は要素を削除し、詰めるが、
capacity()は変化しないという事でOK?

#include <iostream>
#include <vector>

class Test {
int t;
public:
Test(int i = 0) : t(i) {}
};

int main()
{
std::vector<Test> abc(100);

std::cout << "size = " << abc.size() << ", capacity = " << abc.capacity() << std::endl;
std::vector<Test>::iterator iv = abc.begin() + 50;
abc.erase(iv);
std::cout << "size = " << abc.size() << ", capacity = " << abc.capacity() << std::endl;
}
おk
OK
ちなみにswap技法の書き方も間違っている。

×std::vector<Test>().swap(abc);
↑こう書くと、空のvectorと交換するため、空のvectorが出来上がる
ので駄目。

○std::vector<Test>(abc).swap(abc);
↑capacity()を切り詰めたいならこう書く事。
>>183
用途が違うだけで間違ってるとは言えない気がする。
185デフォルトの名無しさん:04/01/28 06:11
0では駄目でNULLが必要なのはどういう場面でしょうか?

C FAQ5.5の中で
http://www.catnet.ne.jp/kouno/c_faq/c5.html#5
「キャストのついてない0がポインターを必要とする場所にあらわれた場合に、
コンパイラは、そのマシンに適切なヌルポインターを作り出すことができなければならない」
という記述があります。
これをわたしは

char *pt;
if ( pt == 0 )

というソースがあれば

if ( pt == (char *)0 )

とコンパイラーに解釈されることが保証されているという意味だと(わたしが)解釈して
「型にあわせてキャストしてくれるならNULLという表現はどうしてあるのか?0でいいのでは?」
と考えたわけです。

NULLがはびこっている以上、この類推のどこかの時点で間違ってると思うのですがどこでしょうか?
つっこみお願いします。
186デフォルトの名無しさん:04/01/28 06:39
希望の形を選択し、大きさを入力すると、*で丸、正方形、長方形を描きます。
授業になかなか着いて行けないので困っています。
事情のわかる方よろしくお願い致します。

http://up.isp.2ch.net/up/2e6bb62a6ceb.exe
C++ の初級授業で出された宿題なのですが、
これと同じ機能を持つプログラムを組まなければ成りません。
>>185
その類推はあってるんだけど、C++ では

 #define NULL 0

とのみ定義される。
従って、 可読性を高める ために NULL を使うだけであって、
実際の動作で 0 と異なる点は一切ない。

C では int 変数とかに代入できないよう

 #define NULL ((void*)0)

という定義も許されてたから可読性以上の意味があったけど、
C++ では void* から任意のポインタ型への暗黙のキャストが廃止されたため、
この定義が使えなくなった。

どうせなら null キーワードでも作ってくれれば良かったんだけどね。
NULL 使わずに 0 を使う人もいるから導入しなかったのかな...。
>>187
禿自身が0派だからね(笑)
189168 :04/01/28 10:33
>>174,175
OS win98 VC++6.0 コンパイルオプション デフォルトです。

オブジェクト脳内構築順番では std → CClass_A だから
起動して実際にコンストラクタが呼ばれるのは std → CClass_A
デストラクタはその反対で CClass_A → std
だから std が先に無効になるのはちょっと疑問は残っていたんだ

やっぱり規格違反なのかな
190デフォルトの名無しさん:04/01/28 11:38
式の中で一時オブジェクトのポインタを使用したら
警告を受けました。

foo( &String("hello") ); ←こんな使い方で
warning: taking address of temporary ←警告でました

横着しないでオブジェクトを確保すべきでしょうか?
>>190
ya
もしくはfooの引数を定数参照にするかだな。
本当にアドレスが欲しいのでなければ
194190:04/01/28 12:11
>>191,192,193
ありがとうございます!勉強になりました。
>>189
どちらにしろ、たまたま CClass_A → cout になっただけで
動かなくなるプログラムは組むべきではない。
196崖っぷち:04/01/28 13:12
誰か助けてください!
大学でレポートが出されまして、これが明日までに出来ないと留年してしまいます!
どなたか宜しくお願いします・・・・(T_T)

配列Aのデータをソートせよ。ただしAの入力は Void getdata(int *n,double *a)
を呼び出せば入力できるものとする。

っていうものです。このままでは本当に留年が確定してしまうのでどなたか助けてください・・・・・
#include <algorithm>
#include <vector>
int main()
{
std::vector<double> a; int n;
getdata(&n,NULL); a.resize(n); getdata(&n,&a[0]);
std::sort(a.begin(), a.end() );
}
198崖っぷち:04/01/28 13:35
>>197さん
それであっているのでしょうか?
学校でないと実行できないのでよくわかりません・・・・。
いかんせんパッパラパーなもので申し訳ないです・・・。
199デフォルトの名無しさん:04/01/28 13:47
>198
教えてもらってるのに信用しない
信用出来ないけど、自分で判断する脳もない
そんな貴方には留年が最適かと思われます
ファイルの読み込みについて質問です.

001.csvを読み込む
 ↓
計算(if,and,orで1と0にするだけの単純なもの)
 ↓
aaa.txtに追加書き込み
 ↓
002.csvを読み込む
 ↓

このようなプログラムをループさせて,600ファイルほど計算したいのですが
名前の違うファイルをループさせて読み込ませるにはどうしたらいいでしょうか?
あってはいても、人に教わったのがバレバレでやっぱり留年(w

>>200
ファイル名次第。規則性があれば簡単。なければファイル名リストを用意せなアカン。
いずれにせよ環境依存。
>>200
C++に何の関係もなくて宿題スレ行きっぽいけど、
まあ簡単だから答えておくと、

for (int i=1;i<=600;++i){
  char filename[256];
  sprintf(filename,"%03d.csv",i);
  // 処理いろいろ
}

これで、filenameの中には001.csv〜600.csvって文字列が順次入るから、
それを使ってファイルをオープンして処理すればいい。
203168:04/01/28 16:42
>>195
OK!
素直にnew,deleteするよ
>>4に紹介されている本が置いてある書店を知りたいんですが
上野を中心に考えてどこかないでしょうか。
中身を見ずに通販で直接買うにはやや高いので、出来ればパラパラと
内容確認をしてから買うかどうか決めたいのです。
>>204
英文でよければpdf落っこちてるよ(タイーホ)
>>204
上野ってのが東京のそれなら秋葉原なり神田なりまでいけばいくらでも。
>>204
レビューもあるのに そこまで嫌なら足で稼ぐしかないでしょ
書店っていってもたまたま在庫切れだったりするし
>>204
4にのってる本はあまりに有名なので秋葉でも神田でもどこでも置いてあると思われ。
足で稼ぐほどでもない。

まぁ強いて言うなら、上野からの距離という意味では東大の生協が一番近いかもしれん。
209デフォルトの名無しさん:04/01/28 21:39
インターフェースの実装についてです。

通常の本では、インターフェースの実装はインターフェースクラスにメソッドを仮想関数
として実装し、それを使う側がメソッドをオーバーロードして使うような手順になるよう
ですが、そもそもインターフェースは提供者側がメソッドを定義して使わせるという
イメージだったのですが、逆のような気がするのですが、どうしてこうしてるのでしょうか?
>>209
継承、抽象化、隠蔽化などについて勉強汁。
211209:04/01/28 22:46
すみません。質問の仕方をちょっと変えてみます。

あるインターフェースクラスAを別のクラスB,C,Dが使うという場合、
B,C,Dがオーバーロードするメソッドが異なれば意味ありますが、
もし全く同じものなら、クラスB,C,Dのおのおのに、オーバーロード
すべき(全く同じ)メソッドを定義しなければならなくなると思ったのですが。
>>211
「インターフェースを使う」の意味が曖昧。
オーバーロードとオーバーライドの意味を混同しているっぽい。
「メソッド」が「同じ」とか「異なる」とかの意味が不明。

総じて、意味がわからん。
>>211
JavaじゃねぇんだからそういうのはAで普通の仮想関数として定義しとけばいいだろ
>>211
簡単なプログラム例でいいから具体的に示してよ。
本当に簡略化した奴でいいから。
>>211
デフォルトの実装がだいたい決まっている場合は
Javaだと継承して〜Adaptorなんてクラスを作る

このへんは経験で言わせてもらうが
しみったれた実装を残しておくぐらいなら
インターフェースを明確にしておく安心感の方が
はるかに大きい

>209
「使用者」→(使う)→「インターフェイス」←(実装する)←「提供者」
>>196-199 オモロイ
例外処理で質問です。
try{
int x = 0;
int y = 4/x;
} catch(...){
//error
}

のように書いたとき全ての例外をキャッチできますが、
catch(...)の書き方は一体何なんでしょうか?
VCを使ってますが処理系に依存するコードなんでしょうか?
>>218
全ての型。環境依存ではない。
>>218
しかしそのコードは(int y = 4/x; で)未定義動作を起こす。
intで0除算したら例外が飛んでくることを期待している?
0除算で投げられる例外はWin32構造化例外。
それがcatch(...)で捕捉できるのはVC++の独自拡張。
223185:04/01/29 09:23
>>187
可読性のためなんですね。
ありがd。
時々structをclassのように使ってるのを見るけど
struct hoge
{
  int foo;
  hoge() {
   ....
  }
}
これって文法上何って言うのでしょうか?(調べるためのキーワードがわからなくて・・
classとどう違うのですか?
225デフォルトの名無しさん:04/01/29 09:51
>>224
基本的に、classと違わない。
アクセス属性を何も書かなかったときのデフォルトが、
 class → private
 struct → public
なだけ。
C++ の文法上はやっぱり構造体と呼ぶしか無いだろうな。
publicメンバ持ってるよんと明示するときにstructにしてる。
228デフォルトの名無しさん:04/01/29 12:20
Cのランタイムについて教えていただきたいのですが、
BCBとVCではランタイムのソース(実装)が違いますが
これって標準Cでは機能だけ指定されていて、実装は
各コンパイラメーカに任されているっていうことなのですか?
229デフォルトの名無しさん:04/01/29 12:32
Cみたいにデータだけ登録する場合はstructだなぁ。

>>228
ライブラリってそういうものだよ。規格さえ守っていれば実装はどうでも良い。
>>228
(゚Д゚)ハァ?
標準Cはただの言語仕様だ。
何も実装はしない。
>>228
ここはC++スレだけど、標準Cと言っているので一つ例を出すと、
qsortがいい例だね。別にクイックソートを使わなければならないわけではなく、他のソートと組み合わせてもいい。
bsearchもバイナリサーチでなくてもいい(前提条件があるから他の方法で実装する人はいないだろうけどねぇ)。
232228:04/01/29 12:39
>標準Cはただの言語仕様だ。
>何も実装はしない。

未熟ですみません(--);;
標準Cというのはstdのことですよね。
とするとstdの一部であるのSTLとかも、機能とか最低限
のレスポンスが229さんが言うように定められていて
実装はコンパイラメーカが自由にできるという認識
でいいんですかね。



233228:04/01/29 12:42
>>231
なるほど。あくまでクイックにソートできればいいという
話でアルゴリズム(実装)は自由なんですね。
アホなもんで、CRTのソースは標準化機構が作って各コンパイラ
メーカに配っているのだと思っていました。。。
>>232
実装まで定義されていたら作れない環境が続出しちゃうよ。
OSの機能を使わざるを得ない関数(malloc,fopen,etc...)とかね。
235228:04/01/29 12:44
>>234
>実装まで定義されていたら作れない環境が続出しちゃうよ。
>OSの機能を使わざるを得ない関数(malloc,fopen,etc...)とかね。

あくまでランタイム(仮想マシン)なんですね。
そう考えると理解できるようになってきました。。。
236218:04/01/29 13:18
>>219-222
ありがとうございます。なんとなくわかりました・・・
>>228
>標準Cというのはstdのことですよね。
>とするとstdの一部であるのSTLとかも、機能とか最低限
>あくまでランタイム(仮想マシン)なんですね。
きみは何の話をしとるのか
細かい言葉の定義についてネチネチあげつらう趣味は無いけど、
>>228の用語の使い方はちょっと変すぎるなぁ
要するに勘違いしてる。
>>235
一番的確に言うとすれば、インターフェイスが定義されているだけ。
こういう名前の関数をこんな風に呼び出してください。ってこと。

>ランタイム(仮想マシン)
仮想マシンってのはJavaとかと混同してるんじゃないかな?
JavaでのランタイムはJ2SEだけど、これ自身は仮想マシンではないよ。
C++と混ざってるんじゃ?
要するに色々混ざってる。
243デフォルトの名無しさん:04/01/29 15:52
構造体のアライメントに関して質問です。
環境はWinXP Pro + VC6(SP5)です。

構造体のサイズを sizeof で調ると、

typedef struct TTT{
char a[257];
int b;
char c;
} ttt;
が 268、char c をコメントアウトすると 264、int b もコメントアウトすると 257 になります。

これはコンパイラオプションの「構造体メンバのアライメント」によるものだと
いうのはおぼろげに分かっているのですが、どういう条件でサイズが変わるのか、
また、パディングはどこに入るのかなど教えていただけないでしょうか。
参考になるサイトはないかとずいぶん調べたのですが、見つけられませんでした。
よろしくお願いします。
聞いた言葉を適当につなげて知っている振りをする
>>243
cout << offsetof(TTT, a) << endl;
cout << offsetof(TTT, b) << endl;
cout << offsetof(TTT, c) << endl;
246243:04/01/29 16:20
>>244
分かるんだったら教えてくださいよw

追記すると、デフォルトだと8バイト単位(/Zp8)になってるそうで、
またそのオプションは規定値のままいじってないのですが、
構造体のサイズを実際に調べると8バイト単位になってるわけではないし、
一体なにが8バイト? って感じで悩んでるんです。
247244:04/01/29 16:22
>>246
すまん、キミ宛じゃなかったんだが・・・
粗い面とはVCの場合、境界をまたがない時には
整列しません。たしかデフォルトは 8
アドレスが8の倍数になるってこと。

b,cともコメントアウトした場合ってのは、charだけの場合アラインメントして
も意味がないからしないってこと。
>>243
245の結果
0
260
264
aとbの間にパディングが入るみたいだね。
250243:04/01/29 16:32
>>245
0、260、264という結果になりました。

>>247
うおっ 失礼しました (´д`;)スマソ・・・

>>248
アドレスが8の倍数に・・・ですか。
うーん??
正直まだよく分からんです。bの開始位置が260、でも260は
8の倍数ではないですよね。メンバじゃなくて、構造体の先頭アドレスってことですか?
251243:04/01/29 16:34
>>249
わざわざありがとうございます m(__)m
257がなぜ260になるんでしょうか・・・
パディング入って a の占める領域が4の倍数に調節されるのは、
もしかして構造体のアライメントとは関係ない話ですか?
252249:04/01/29 16:55
http://www.microsoft.com/japan/developer/library/vccore/_core_structure_alignment.htm

struct T { char a; int b; };
だとアライメント4

struct T { char a; double b; };
だとアライメント8

らしいです。
253249:04/01/29 17:01
struct TI { char a; int b; };
struct TD { char a; double b; };

std::cout << offsetof(TI, a) << std::endl;
std::cout << offsetof(TI, b) << std::endl;

std::cout << offsetof(TD, a) << std::endl;
std::cout << offsetof(TD, b) << std::endl;

結果
0
4
0
8
254243:04/01/29 17:04
>>249さん
リンク先を読んで、やっと納得がいきました(まだ完全に理解できたかあやしいですがw)
Zpオプションでの値にしばられるとばっかり思っていたら、
そういうわけではなかったんですね。
わざわざテスト結果までありがとうございました m(__)m
255モノアイγ:04/01/29 18:05
素でそろそろいい歳だし子供生まれるし、就職するための技術としてC++を勉強しようと思っているんでつが…

24歳デビューは遅杉?

スレ違いでスマソ
センス&&これまでの経験次第としか・・・。
>>255
まさか、まったくの経験ゼロではあるまいな。

プログラミングを独習するには10年かかる
http://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html
>>255

C++習得したし、子供でも作ろうか?
が正解
>255
10年経験あろうとうんこなやつはうんこ
すべて貴方の努力次第です
24歳だからといって遅いということはない
なんらかのオブジェクト指向j言語かC言語をやっていたことがあるなら、

Cのメモリモデル
オブジェクト指向プログラミング

のどちらかを身につけるだけなので早いと思うが、
C++自体癖のある言語なので
もともとプログラミング(あるいはそれに近いロジックを組む仕事)
をやったことのない人間が
就職を動機として身につけるのは、

客観的に言って、相当、うーん、ですな
能力のわからん人間相手によくそういうことが言えるな。
まあ、こんなところで訊いてる位だから(ry
という推測が成り立たんわけでもないが。
つーかマ板行けよ
>>255
スレ違いというより、板違い
>>255
C++を勉強するのに遅杉ということはない。

しかし、"子供生まれる"と"就職"はフツーに順番が逆だろ。
この点では遅杉。
265モノアイγ:04/01/29 20:51
就職→結婚の順番はごもっともですw

経験は〜かじったというより舐めた程度です

今の仕事収入あえ万はあるからいいっちゃあいいんですが、契約社員でこの先が…ねぇ?

気合いでなんとかなるかもしれない事はなんとなくわかりましたんでやるだけやってみます(感謝

最後に仕事の休憩中に書いた短い文で自分の経験すら書いてなかった質問にレスしてくれた方々、どうもありがとうございました(素
266デフォルトの名無しさん:04/01/29 21:28
>>257
少なくとも半ダースのプログラミング言語を学ぶこと。
言語標準化の試みに加わること。

条件キツ杉。
>>265
この業界、自慢じゃないが給料はべらぼうに安いぞ・・・。

いまの仕事のまま、内職でプログラム作って売るのを目指すほうがいいと思うよ。
VBだろうがC++だろうが、言語仕様がわかるだけでは仕事がない時代になってるから。
>>266
>少なくとも半ダースのプログラミング言語を学ぶこと。

これは別にいまどきフツーだろ。
>>265
この業界に来るくらいなら別の業界に行った方がええんでねぇの
どの業界の派遣社員なのか知らんが月収35万もらってんなら今より少なくなるよきっと
STLのソースを読んで学習したいんですが、
STLPortやらBoostやら色々あるんですが、どれがいいでつか
アスキー配列のキーボードを使ってるので、「あえ」が何だか分からんかった・・・。
>>270
とりあえずboostはSTLではないよ。
>>>268
>>少なくとも半ダースのプログラミング言語を学ぶこと。
>これは別にいまどきフツーだろ。
別々の概念を持つ言語として六種類だそうだ
Java C++ C# VB.net smalltalkこんなに知ってて一種類・・・
>>273
そんなあなたにBrainF*ck。
>>273 そんなあなたにCOBOL
Common Lisp と Scheme と Prolog を勉強すれば、全てのカテゴリを満たす訳だ。
Common Lisp, Scheme, C と Smalltalk は齧ったけど、Prolog はファイト湧かない
なぁ。あと一つどうしよう。アセンブラはカウントしていいのかな??
>>276
Haskellとかは?
関数型だが、型演繹+LazyなのでLisp/Scheme系とは一線を画すということで。

# 俺もProlog系は手を出したくない筆頭・・・
そんだけ学ぶのはいいが、仕事で使うのは1〜2種類じゃないのか?
論理型は脳ミソの普段使わないところが筋肉痛になるよ!
LISPと同じくらい目から鱗が落ちるので、276や277くらいなら手を出すのをお勧めしまつ。

漏れは一応全制覇かな。並列がKL1だから超マイナーだけど。
>>278
言語を使うというより、思想を身につける方が大事だと思われ。
だから同じ思想の言語は重複してカウントしてないでしょ。

ごくごくわかりやすい例としては、
漏れは普段はC++使ってるけど、テンプレートまわりでLISPを思い出すし、
並列プログラミング時に単一代入変数を思い出したりする。
BASIC、C、C++、Java、C#、Perl、アセンブラ(Z80、6809、68000、80x86)でも
1種類にしかカウントされませんか。C++テンプレートもあまり活用してないし。
自分が偏ってるのをようやく自覚したので、もう少し幅を広げようと思いまふ。_| ̄|○
282デフォルトの名無しさん:04/01/30 04:37

テンプレート使ったときのコンパイルエラーって
原因が発見しづらくないですか?
VC++だけど、そういう印象持ってまふ。
なにをいまさら
>>276 Lisp 系のかじり方が中途半端な予感.普通 Lisp を勉強する過程で
Prolog モドキを実装するハズだ.大抵のLisp 本にあるだろ? Prolog モドキの実装.
昔は Prolog 使いと Lisper が被っていたのにはちゃんと理由がある.関数と再帰く
れーやって「齧った」などといってると半可通になっちゃうぞ.

などと煽ってみる漏れも今は C++ 使い.師匠,やはり Lisp は永遠のマイノリティ
の予感がします….
処理系とライブラリが整備されていれば喜んでLisp使うんだけどなあ。
Pythonのライブラリ整備パワーはうらやましい。
Prolog やったとき、確かに関数型言語っぽいなぁ、と思ったな。
ここは C++ 相談室です。
今時のC++使いって言語ヲタが多いんじゃないの?
昔はWindowsプログラミングを覚えるためにC++始める人が
多かったけど、最近はなんか違ってきたと言うか。
boostなんて現場での実用性ゼロのライブラリが注目される辺りから
そんな気がしてる。
>boostなんて現場での実用性ゼロのライブラリ

2へぇ
boostもろくすっぽ使いこなせないのにboostをけなすヤシが約一名。
>>288
お前が使えば実用性が無くなるかもなw
まさかこの後、釣れた(
boostってSTLの委員だった人たちが次期標準を視野に入れて作ってるんじゃないの?
現場でSTL使ってるならboostも役に立つと思うんだけどどうなんですか?
>>293
似たような文章だがおれじゃあない。
大体boostなんて非標準なライブラリは小規模、かつ
開発者全員がそれに馴染んでいる場合には使えるが
それ以外のケースにおいてはそんなもん使われては困る。
ModernC++Designにおいて示されているような
解決したい問題が先にあって、そのためのテンプレート
ライブラリの使用なら分るんだが、言語ヲタクの場合は
boostを使いたいとかいう自己満的ニーズが先行してやいないか?
胸に手を当てて一度考えてみてはどうだろう。
>boostを使いたいとかいう自己満的ニーズが先行してやいないか?
いいえ。
自分が思い描く言語ヲタの生態をいくら詳細に語っても
「言語ヲタが多い」ことの証明にはならないわけだが。

以前どっかのスレで「お前らboostのうちどれ使ってる?」という質問が出たとき、
regexやshared_ptrやdirectory_iteratorやformatに回答が集中したっけな。
実際の使用と言語的な興味(C++でどこまで行けるか)は切り分けてるだろう、
多くの人間は。
言語ヲタクの存在自体に文句があるわけじゃない。勘違いするな。
多言語の話題がさもスレ違いであるかのように指摘した287に答えたまで。
また、C++プログラマにおける言語ヲタクの割合が、昔と比べて高くなったと
いうのは個人的な感想。こんな物に反論してどうする。
それからboostに関しても同じようにその存在に文句があるわけじゃない。
ただ使う人間に勘違いしてるようなのがいるということ。然るべきスキルある
人間が、適切なケースで使う分にはなにも問題ないと考える。
×多言語 ○他言語
じゃあ書くなよ。
独り言板がふさわしい。
むしろおまいらのboostの有用性に関する必死な反論ぶりが
ちょっとおもしろかったな(w。スレ違い。さげ
>>288では「現場での実用性ゼロ」と断言してるのに
>>297では「適切なケースで使う分にはなにも問題ない」と
やんわりまろやかになったところに自己弁護の必死さを感じた一幕だった。
>>301
297の「適切なケース」に288の「現場」が含まれていない
という主張の可能性はどうだろう。
>>288=>>294=>>297 が必死だな、ということでFA?
適切なケース」が だな。typoばっかり。
おれはなんて必死なんだろう(藁
>>302
そんな主張をしたらますます必死さがにじみ出てしまうのではないだろうか。
「実用性ゼロ」と書いてしまった時点で墓穴を掘っていた。
ゼロは言い過ぎたと後悔しているだろう。
>>297
> 言語ヲタクの存在自体に文句があるわけじゃない。勘違いするな
誰も「言語ヲタクの存在自体に文句がある」なんて解釈はしていないわけだが。

苦し紛れに「勘違いしているという勘違い」か。ブザマ。
any optional spirit graphなんかはまずつかわねーし、
spiritとか言われてもオナニーにしか見えないな。
使いこなしているかは別として、いくつかは使ってはいるけど。
>>308
graphとspiritは便利だと思うけどなぁ…。
310ヽ(´ー`)ノ:04/01/30 20:53
graph は使う人と全然使わない人がいるからなぁ。
split は使うぐらいなら俺は flex 使うが。
ゲーム屋ですがrandomは便利ですよ。
肝心のところが出来ていないアホは確かにいるが
regexとか0から実装してたらそれもアホだ
わりぃ。randomはあたりまえすぎてboost使ってるって意識もなかったわ。
graph使ってますよ?
テンプレートライブラリって自分で書いたほうが早いと錯覚させられるところがあるよねぇ。
リンクしなくてヘッダだけだからな
boostのライセンスってどうなってるの?
>>314
graphってどんな使い方してるか教えて。
最短経路問題を解くみたいなアルゴリズムとして
使うんでしょ?
diffなんかgraphで実装できそうだけど…。
>>315
そんな香具師いねえよ
ものによるだろ
メタプログラミング系は勘弁
BOOST_PP_結構いいんで使ってます
Cですけど。
321デフォルトの名無しさん:04/01/31 08:38
色々なプラットフォームでDLLやSOを使ってクラスオブジェクトの受け渡し
をしたいと思っています。このDLLを使うアプリケーション内では将来クラスの仕様が
変更される可能性があります。(関数やオペレーターのみ)
仮想関数以外のメンバ関数を含むクラス(派生無し)を定義した時、そのオブジェクトの
メモリ上の実体はメンバ変数だけなのでしょうか?
つまりメンバ変数は全く同一でメンバ関数だけが異なる別のクラスに強制キャストしても
危険性は無いのでしょうか?お願い致します。
322デフォルトの名無しさん:04/01/31 08:49
C++例外でどうしても腑に落ちない点があるのでご教示願いたく思い投稿しました。

class UserEx : public exception {
protected:
  string msg;
public:
  UserEx(string& msg) { this->msg = msg; } // ★1
  virtual const char* what() const throw() { return msg.c_str(); }
};
  try {
    throw UserEx(string("!!! exception !!!")); // ★2
  } catch (exception& ex) { // ★3
    cerr << ex.what() << endl;
  }

★1 - string& から string へ =演算子を使用した場合
参照が指す先の値をコピー(生成)するのでしょうか?
★2 - string("!!! exception !!!") で生成した string の寿命(ライフサイクル)は
 いつからいつまででしょうか?
・string("!!! exception !!!") のように
 生成したインスタンスを変数に入れないという使い方に抵抗を感じています。
・UserEx::UserEx(string&) にあるように参照渡しで string を渡しているので
 string("!!! exception !!!")のデストラクタが呼ばれたら無効になるのでは?<疑問
★3 - ★2で UserEx のインスタンスが生成されますが try ブロックから抜けたら
 デストラクタが呼ばれないのはなぜか?
 デストラクタが呼ばれたら catch(exception&) でキャッチしたときに 無効になってしまうのでは?

以上、よろしくお願いします。分かりにくい点がありましたらご指摘下さい。
危険が無い実装が多いだろうけど
それは保証されているわけではない
http://news2.2ch.net/test/read.cgi/news7/1075213041/
【ネタ?】西村博之氏、「私のニュース板」で次期管理人希望者応募中【本気?】

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 04/01/30 23:14
   お金がある人だけお願いします。
   おいらばっかり働くのはずるいし。。。
>>322
1- yes マニュアル読もうや。
2- この場合、参照渡ししても内部で(1で)コピーされてるので関係なし。
3- てか、そこで例外オブジェクトのデストラクタ起動したら、例外実装できじゃん。

えらいひと補足してくれ。

>>321
[PDF] C++ COM
第 1 章 よりよい C++ としての COM
http://www.ascii.co.jp/bookmart/pdf/47561/4756130666.pdf
http://www.ascii.co.jp/bookmart/pdf/47561/4756131662.pdf
これ読んでみたら?
EffectiveC++くらい読もうぜ
あ、Moreの方だったかな?
ExceptionalC++じゃないのは確か。
>>325
そこのC++ COMの出典って何ですか?
何かの本の中身でしょうか?
330325:04/01/31 15:30
初心者ですみませんm(_ _)m

int InputData(char file[]){

  ifstream fin(file);
  if(!fin){cout<<"cannot open input file .\n";return -1;}

  fin.unsetf(ios::skipws);
  do{
     cout << "(゚д゚)ェェー";  
  }while(!fin.eof());
  
  fin.close();
  return 0;
}

int main(){
 InputData("data.txt");
retun 0;
}

てやったら、do whileを無限ループしちゃうんですけどどうしたらいいですか?

前に進んでないんだから
叫び声が終わることも無い
"(゚д゚)ェェー""(゚д゚)ェェー""(゚д゚)ェェー""(゚д゚)ェェー"

char s[100];

fin.unsetf(ios::skipws);

do{
fin >> s;
cout<<"(゚д゚)ェェー";
}while(!fin.eof());

を加えてみたけど叫びつづけますT-T
なんで!fin.eof()なの?(fin)でええやん。
getとかreadをつかう
入力された結果を叫ぶように変更する
よくわからないけどもう少し頑張っています。
叫び声が怖くて眠れません
>330
More Effective にあったが
338330:04/01/31 17:27
>>337
すまんかった。家で確認するわ。
Effective C++のパチモンで買う価値のあるのってどれとどれあたり?
多分Effective C++が一番はずれ
テンプレート関数にクラスが来た場合と数値が来た場合の処理を分けて書きたいのですがどうすればいいでしょうか?

試しに下のように書いてみると「2 番目の引数を 'class foo<float>' から 'int' に変換できません。」と言われ、
typename T2::selfの箇所をT2だけにすると「2 個のオーバーロード関数があいまいで最適な変換ができません。」と言われどうしたらいいものやら。

template< class T >
class foo {
public:
  typedef foo< T >self;
  typedef Tvalue_type;
  value_typevalue;
};

template< class T1, class T2 >
void hoge( T1 & t1, typename T2::self & t2 )
{ cout << t1.value << t2.value << endl; }

template< class T1 >
void hoge( T1 & t1, typename T1::value_type n )
{ cout << t1.value << n << endl; }

int main( int argc, char **argv ) {
  foo<int>foo1;
  foo<float>foo2;

  hoge( foo1, foo2 );
  hoge( foo1, 1 );
  return 0;
}
>>341
boost1.31に入る予定のenable_ifとdisable_ifでも使ってみるとか。
>>341
template <int N> struct Int_to_type{};
template <typename T> struct Is_foo_instance{enum{value=false};};
template <typename T> struct Is_foo_instance< foo<T> >{enum{value=true};};

template < class T1, class T2>
void hoge( T1 & t1, T2 & t2 )
{return hoge_helper(t1, t2, Int_to_type<Is_foo_instance<T2>::value>());}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 & t2, Int_to_type<true> )
{cout << t1.value << t2.value << endl;}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 n, Int_to_type<false> )
{cout << t1.value << n << endl;}

hoge_helperを導入する代わりにhogeを多重定義しても良し。
>>342
文献が少ないのと英語でよく分かっていませんが、>>343を汎用的にしたものという理解で合ってるでしょうか。

>>343
すごいトリックで目から鱗です。ただ、

template <typename T> struct Is_foo_instance< foo<T> >{enum{value=true};};

の部分特殊化がうちのコンパイラ(Visual C++ 6.0)だとネックみたいです。
やはりMSのコンパイラなんか使ってる軟弱者は諦めろということか。
>>344
新しいVSを買いましょう or .NETFrameworkのcl.exeを使いましょう。
>>344
>すごいトリックで目から鱗です。ただ、
そんなあなたにModern C++ Design

部分特殊化が使えないなら、
Is_foo_instanceの代わりにIs_intあたりを用意すればいいんじゃない?
>>346
template <int N> struct Int_to_type{};
template <typename T> struct is_numeric { enum { value = false }; };
template <> struct is_numeric< int > { enum { value = true }; };
template <> struct is_numeric< float > { enum { value = true }; };

template < class T1, class T2 >
void hoge( T1 & t1, T2 & t2 )
{hoge_helper( t1, t2, Int_to_type< is_numeric< T2 >::value >() );}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 & t2, Int_to_type< false > type )
{cout << t1.value << t2.value << endl;}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 n, Int_to_type< true > type )
{cout << t1.value << n << endl;}

ってやってもみんなfalseに飛ぶっぽいです_| ̄|○
>>347
差し支えなければ、参照渡しの部分をすべてconst参照にすれば良い。
それができないなら、int版とfloat版を素直に多重定義するしか…
C++で、コンストラクタを抜けると、構造体のメンバの値がすべて最大になってしまいます。
普通のメンバは平気なのですが・・・

質問があやふやで、申し訳ありません。
謝らなくていいから、もうちょっとわかりやすく。できれば実例を。
自己解決、すいませんでした。。

コンストラクタのオーバーロードが原因みたいでした
>>348
> 差し支えなければ、参照渡しの部分をすべてconst参照にすれば良い。
おぉ、constにし忘れてました。

出来ました!ありがとうございます。
class {
  std::string m_str;
public:
  ...
  std::string getStringA() const { return m_str; }
  const std::string& getStringB() const { return m_str; }
  ...
};

A と B どちらがいいんでしょうか?
stringの実装しだいだけど
Bは安全パイだとは思う。
どちらもまちがいではない
356 :04/02/02 01:41
前から疑問に思っていたのですが、
コンストラクタで適切にインスタンスが初期化できなかったことを
明示的に返す手段というのは、例外を使うか、そのクラス専用の
new 演算子をオーバーロードするしかないのでしょうか?
>>356
まあ、コンストラクタでは何もせずに初期化メソッドを別に用意するという手もあるが。
普通例外を投げる。
後者はちょっと妙なこと言ってないか?
newせずにインスタンス化する場合はどうするつもりだ。

まあそれだけの質問ならとりあえず例外使っておけとしか言えないが。
コンストラクタで例外投げる場合は後始末に注意な。
359 :04/02/02 02:06
>>358 それはできないように、コンストラクタを private にしてしまう、とか。
コーディングルールとかが一般的できちっとしてる
クラスライブラリのお手本になるC++ライブラリってどんなのがありますか?
(複数解答求む)
例Qt
361 :04/02/02 02:11
>>358 なんとなく例外と実行時型情報だけは使いたくない、
という変なポリシーは捨てたほうがいいですか?

例外使うようなかなり上の次元(?)の処理なら
ついでにガベコレも持っているようなOO言語使ったほうが…
なんて思うもので。

あとはコンストラクタを private でアクセス禁止にして、
インスタンス生成はインスタンス生成用の
static なメソッドを用意するとかですかね。

たしかそういうアプローチをとっているOO言語って
ありませんでしたっけ? C++ 以外に OO って Java くらいしか
使ったことがないので「あったような…」ってくらいの
あいまいな記憶なんですが。
エラー処理をきちんとやりたいなら例外使った方がいい。
その場でabortしたくなければ他に戻り値以外の出口はないから。
そのポリシーが単なる先入観と偏見からならなおさらだな。

smallTalk系列じゃクラスメソッドにallocとかcreateみたいなファクトリメソッドを作るな。
オブジェクトを常にnewで作成する考えならGC有りの言語の方が合ってるかも。
>>353
Aの場合・・・
コピーのオーバーヘッド&メモリ消費が気になる

Bの場合・・・
Hoge hoge;
std::string& str = const_cast<std::string&>(hoge.getStringB());
str = "書き込んじゃうよ";
突然な質問ですいません。

a = "abcdefg";
a.mid(2,2)="CD";

とすればクラスaの内容が abCDefg になる
みたいな機能って実装可能でしょうか?
可能です。
366364:04/02/02 06:57
>>365
そうですか。
一晩悩んだんですけど実装の方法がどうしてもわかりませんです。
できれば簡単な説明でいいので教えていただけないでしょうか。
こんなんじゃだめですか?
class string_proxy
{
public:
 typedef std::string::size_type pos_type;

 string_proxy( std::string& target , pos_type begin , pos_type end );

 string_proxy& operator = ( std::string );
 operator std::string () const;

private:
 std::string* target;
 pos_type begin,end;
};
>>367
後はstd::string::replace()か何かを使って代入演算子を
作ればよいね。まあしかしstd::stringにはメンバ関数が多量
に存在するのでBASICのような事をするのにわざわざクラス
を定義する事はほとんどないかもね。
369364:04/02/02 07:30
>>367
元の文字列クラスに対して行ないたいんです。

o_string a = "abcdefgh";
a.mid(2,2) = "CD";

見たいな感じです。
C++標準のstringクラスとほぼ同等にには出来たんですが
上記のような処理をさせようと思うと難しいみたいで。
参照戻り値を使用しないといけないっぽいですが
どうもわかりません・・・。
>>369
> 元の文字列クラスに対して行ないたいんです。

だから、>>367のクラスを実装して、mid()の戻り値にすれば良いだろ。
371364:04/02/02 07:45
>>370
そういうことですか。
すみません。
やってみます。
class Father
{
  Son special_week;
};

class Son
{
  Father sunday_silence;
};


こういう互いのオブジェクトを持ち合ってる場合、どうしたらよいですか?
この例の順序だと3行目で構文エラーになってしまいます
俺、もう、コレいやだよ。
どっかにFAQで転がってないものか・・・。
先頭に class Son;
関数にプロトタイプと定義があるように、
クラスにもヘッダとボディーがあるんです
375372:04/02/02 08:27
レスありがとうございます。

>クラスにもヘッダとボディーがある
すいません、単なる仕様知らずでした。
>>372
Cと同じ。ポインタでメンバを持て。
>>372
「前方宣言」でぐぐれ
そういうのはついてくる暮らすライブラリのヘッダとか探すと参考になるよ
プロキシクラス、未だに理解できず。
380デフォルトの名無しさん:04/02/03 08:16
operatorを使って、
class hoge{
・・・
freind char* operator+(char* s1,char* s2);
};
char* operator+(char* s1,char* s2);

main(){
hoge buffer;

buffer = "A" + "B";
}

して、bufferに"AB"を入れることは可能ですか?
どうすればよいのでしょうか?
381380:04/02/03 08:26
char* operator+(char* s1,char* s2);

の箇所の処理内容と、この宣言でよいかも分かりません。

operatorを使って、int型の足し算はできるみたいですがchar*型の
足し算pぽっい実装は可能なのでしょうか?
組込型同士の演算子オーバーロードは、、
int同士の足し算が出来るのは、、
>>380
stlに実装されているぞ。
<string>
の中のぞけ。

てか、
char* operator+(char* s1,char* s2);
これは、普通に書くとメモリ関連で怪しいこと起きるんじゃないのか?
"A" の型はなんだ?
A型
だとしたら 問題はAとBの性別だな

実装を見てみたいものだ ハァハァ
>>385-386
死ね
>380
buffer = "A" "B";
389380:04/02/03 23:56
>>382-388
ありがとうございました。
実際、標準stringクラスで試してみたところ、文字列の足し算ぽっいのは
駄目でしたので実装はあきらめました。

 std::string buf1;
 
buf1 = "A"+"B";
printf("%s\n", buf1.c_str());

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
tes.cpp:
エラー E2085 tes.cpp 12: 無効なポインタの加算(関数 main() )
*** 1 errors in Compile ***

>>389
するならbuf1 = std::string("A") + std::string("B"); では?
"A" + "B" だと文字列リテラルのアドレスを加算しようと
するからエラーだよ。
std::string("A")
が顔文字に見えた
>>389
std::string buf1="A";
buf1+="B";
これじゃダメなの?
393380:04/02/04 00:40
>>390
>>392
分かっています。

std::string str="A"

cout << "(" << str << ")" << endl;

こういうのを実装できないのだろうかと思いました。
cout,printf()のような不確定引数はoperatorでも可能なんでしょうか?
394名無しさん@Vim%Chalice:04/02/04 00:47
>>393
operatorのオーバーロードを勉強しぃや。
>>393
#include <iostream>
using namespace std;

class BracedStr {
private:
 string m_str;
public:
 BracedStr(const string& str) : m_str(str) { }
 friend ostream& operator<<(ostream& ostr, const BracedStr& bstr) {
  return ostr << "(" << bstr.m_str << ")";
 }
};

int main() {
 cout << BracedStr("str") << endl;
}
396デフォルトの名無しさん:04/02/04 01:03
#include <iostream>
using namespace std;
class CClass {
public:
 int m_i;
};

int main(){
 CClass *d;
 d = new CClass();
 d->m_i = 100;
 delete d;

 cout << d->m_i << endl; // 100が表示される。

 return 0;
}
上のソースコードを実行してみました。
一度 new でメモリを確保し、delete で開放を行ったのち
もう一度アクセスしてみたところ 100が表示されました。
開放してしまったので、アクセス違反が起こるものと思ってましたが、
起きませんでした。
これって d は、ただゴミを指してるわけで 間違いですよね?
>>396
うん。
398デフォルトの名無しさん:04/02/04 01:07
>>397
thx
stringとchar*の暗黙の型変換用意すればいいんじゃないの?


私ならやらないけど
cout << "(" << str.c_str() << ")" << endl;
string は ostream に直接渡せるはずだが。
まぁ、コンパイラが古ければその限りじゃないけど。
std::cout << ( typeid(int) == typeid(const int &) ) << std::endl;

これってコンパイラによって結果が違ったんだけど、
規格的には、真偽どっち?

vc7.0 => 0
gcc3.2 => 1
規格はどうあれ、その例を見る限り
実際的に移植性の無いコードであることだけは
確かなようだね。
>>402
int f(int a, const int & b) {
std::cout << ( typeid(a) == typeid(b) ) << std::endl;
}

int main () {
int a;
f(a, a);
}
ってやるとVC7.0では0なの?
>>404
それは1になった・・・
ためしに、

void f(int a, const int & b) {
  std::cout << ( typeid(a) == typeid(b) ) << std::endl;
  std::cout << ( typeid(b) == typeid(const int &) ) << std::endl;
  std::cout << ( typeid(b) == typeid(int) ) << std::endl;
}

main() {
  int a;
  f(a, a);
}

ってやると、1 0 1 。
変数名を入れると、const & は無視されるけど、
型名を入れると、const & は有効になるみたい。

>>405
1行目で1が返るのなら、
型名をいれる必要は普通ないからどうでもいいのでは。

# > std::cout << ( typeid(b) == typeid(const int &) ) << std::endl;
# これが0なのは気持ち悪いが。
5.2.8/5
The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always
ignored. [Example:
class D { ... };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); // yields true

などと書いてあるが結局どうなるのが正しいのか俺にはよくわからん。
5.2.8 -4- より。
If the type of the type-id is a reference type, the result of the typeid expression refers to a type_info object representing the referenced type.
>>406-408
ありがとです。vc7.0がダメっぽいですね。

templateでtypeid使うときは注意したほうがいいかも?
The C++ Programming Language
↑すいません。ミスです。

↑を他人から借りっぱなしで良い加減自分のを持とうと思うんですが
第4版が出るような話ってありますか?
第3版が出てからだいぶ経っているし、もうそろそろ新しい版が出ても
おかしくないと思うので、今、第3版を買うのはなんか気が引けるんですが
4版なんて聞いたことないし、まえの規格で
大体大枠は決まったようなもんだから、問題ないんじゃない?
あるとしたら次の標準C++の改訂合わせだという気がするが、
その前に日本語版3rd SEがでないとは言えないか。
まぁ、今の版買っても問題ないってことですね。ありがとうございます。
ちなみに英語版と読み比べた方っておられますか?
日本語版の翻訳に特に不満はないんですが、
もし、英語版の方が良いよ、って方がいたら英語版の評価聞きたいです。
一応2003年にちょっと改訂入ったんだが。<標準C++
まぁ実質typo修正と仕様の明確化だけらしいけど。
416デフォルトの名無しさん:04/02/07 19:37
ネタ求めage
>>416
プログラムでも書いてろ。
418デフォルトの名無しさん:04/02/08 14:59
>>411
禿の証言は読んだか?

http://www.research.att.com/~bs/bs_faq.html#4th
419デフォルトの名無しさん:04/02/08 15:07
http://www15.cds.ne.jp/~xak/gotta/z200304.html
ここの2003/4/3の日記にあるような、SAFE_DELETE()ってマクロは
どこ界隈で流行っているんでしょうか?

0をdeleteしようがdelete[]しようが安全なわけだが…
安全じゃない処理系があんの?
421デフォルトの名無しさん:04/02/08 15:12
>420
無関係じゃん。
質問の答えにはなってなかったな
スマン
423419:04/02/08 15:15
>>422
いや、俺はdeleteとdelete[]の混用などしないし、そもそもdeleteも
めったに使わないよ。smart pointerが正解だと思っている。
同僚がSAFE_DELETEなる意味不明な代物を愛用しているので、一応その
発祥を把握しておきたいだけ。
if の部分より、delete したあとに NULL をブチ込むことのほうに意味があるんじゃないの?
425419:04/02/08 15:29
>424
なるほど。ありがとうございました。
昔のコンパイラだと delete 0; がエラーになったこともある気がする。
427デフォルトの名無しさん:04/02/08 16:44
以下のコードを実行すると
segvってしまいます。

#include <vector>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
vector <string> a;
a.reserve(8);
a[0] = string("unko");
return 0;
}

reserveしないで初めから
vector<string> a(8);
としていれば大丈夫なんですが…
この原因と対策をご教授ください。

>>427
a.reserve(8);だけでは予備のメモリが確保されるだけで初期設定されないから、
a.size()は0のままだ。このとき、a[0]の結果は(多分)未定義。
a[0] = string("unko");
の代わりに
a.push_back("unko");
または、
a.resize(8);
a[0] = "unko";
とすべし。
429411:04/02/08 16:52
>>418
読んでませんでした・・・っていうか3版買ってきちゃいました.
でもとりあえずはこれを買って後悔することはないということですね.
ありがとうございます.
>>427
確かにクソみたいな質問だがウンコはやめれ

vector::reserve()は必要な領域を確保するだけ。初期化はしない。
vector<string> a(8)なら初期化もする。

このくらい、ヘルプなりドキュメントなり自分で読むことを覚えろ。
>>428
即レスありがとうございます。
string でなく int ではうまくいってた(今みたらsize()は0でしたが)
ので???と思っていました。
以後気をつけます。
>>431
intでもsegv起こしてくれれば悩まずに済んだのにな。
433デフォルトの名無しさん:04/02/09 18:39
関数finalizeでページ違反エラーが出てしまうのですが、解決策を教えていただけませんか?
やりたい事は、initialize関数でB*にキャストしたAのメモリを、finalize関数で解放する事です。
VC6を使っています。
--

class A : public B {}; //
class B       {}; //


void initialize( B* b )
{
   A* a = new A;
   b = ( B* )a;
}

void finalize( B* b )
{
   A* a = ( A* )b;
   delete a;
}

int main()
{
   B* b = 0;
   initialize( b );
//  ここで b を色々操作します。Aの継承内容に関わらず、操作は同じ物で済むようにしたいのです。
   finalize( b );
   return 0;
}
434433:04/02/09 18:45
あ、すみません。
エラー出ないかもしれません。
お騒がせして申し訳ありませんでした。
まーとりあえずデストラクタをvirtualにしとけ
>>435
デストラクタをvirtualにする理由を教えてあげなさい。
そんなことはどうでもいい。
とりあえずデバッガで一行ずつ進めて、
initialize(b);
の直後、bに入ってる値を見ろ。
>>433
void initialize( B* b )

void initialize( B*& b )
にせよ。
>>435の言うようにvirtualのデストラクタも必要。
それがないと、delete a;ではaがBのインスタンスを指していることが
実行時に解らない。
それ、だせーな
B *initialize(void)
{
   return static_cast<B *>(new A);
}
ってか?

しかし、ほんとこの意味不明なキャストは何をしたいんだ。
441433:04/02/09 21:02
> void initialize( B*& b )

ありがとうございました。
えー?解決したのかよ。
443デフォルトの名無しさん:04/02/09 22:35
gccでダイナミックリンクライブラリ作成する予定です。
DLLを使用する側はC言語で、DLLはC++で作成使用と思うのですが

利用する側で、関数がばらばらになっていると使いずらいので、
関数を構造体とか、クラスをひとまとめにして利用する(extern)
方法はあるのでしょうか?
>>443
まず日本語からやりなおせ。
445デフォルトの名無しさん:04/02/09 22:56
extern void func1();
extern void func2();
extern void func3();

だと管理しづらいので



extern struct hoge; //ここの記述がなぞ。

みたいにして

int main(){

hoge.func1();
hoge.func2();
hoge.func3();

}

構造体、クラスのメソッドみたいな利用法はできますか?

> だと管理しづらいので

名前の衝突が問題ならnamespace使う。
外部参照がめんどくさいならヘッダファイル作る。
数が多いのが問題ならあきらめる。
>>446
あらがとうございます。

クラスor構造体を外部参照にすることは出来ないのですね?
>>447
「外部参照」を何と心得る?
DLL ってそもそも C で利用されることを想定して作られたのでは?
コンパイラ(リンカ)によっては、こんな記述もできるかも。試してないよ。

class hoge_tmpl {
public:
 static void func1() {...}
 static void func2() {...}
 static void func2() {...}
private:
 // no member
};
extern hoge_tmpl hoge;

int main() {
 hoge.func1();
 hoge.func2();
 hoge.func3();
}

実体をどこかに作れば確実だけどね。
COM の真似するのが一番?
そもそも、Cで利用するDLLで、クラスとか使ったら駄目だろ。

利用側で、関数ポインタを羅列した構造体にアドレスをぶち込んでいけば
それっぽいものになるんじゃねの?
わかりますた。
普通にします。
インターフェイスさえ互換性があるのなら
内部の実装なんてどうでもいいじゃん
455452:04/02/09 23:26
>そもそも、Cで利用するDLLで、クラスとか使ったら駄目だろ。

ちょっと足りなかった。
Cで利用するDLL「のインターフェイス部分」でC++の機能を使ったら駄目だろ。
COMはCでも使えるよん
>>454
コレってコピペ?
最近良く見かけるけど。
STLつかうと一気n(ry
クラスがあまりでかいと、おかしくなりますか?
double 型変数を一個足したら、うまく動かないプログラムになりました。
sizeof(クラス) = 18048 byte でした。
それは隠れたバグが表面化しただけ
でも、メンバ変数をひとつ増やすかどうかだけで、
表面化するようなバグを思いつけないのです。
その行をコメントアウトすれば大丈夫なのに、しないといっちゃう。
具体的にその変数を使ってるところもないし。
>>461
double自体には罪無し。
どこかのメモリをその構造体がはみ出して誤って上書きしていることが多い。
>>461
配列が「プログラム全体のどこかで」あふれているときに起こることが多い。
>>458
環境(略)ない。
>>461
1. 初期化していない変数を使ってる箇所が「プログラム全体のどこか」に存在する。
2. 配列かポインタを使ってるときに、添え字や参照先が異常なものになってしまってる部分が
  「プログラム全体のどこか」に存在する。

大抵こんなところ。
>>464
すげ(中略)ルサイズが増え(中略)人。
>461
とにかくエラーメッセージか何かは出てないのか?

俺が思いつくのは単純にスタックオーバーフローとか。
468461:04/02/10 02:24
はぁー、
結構根深いバグのようで、
みなさん、どうもありがとうございました。

The Blob アンチパターン?
初心者な質問ですみません。大きな配列が格納されているクラスmyclassが
あったとして、(myclassはコンストラクタもデストラクタもなし)

myclass *obj=new myclass;
(省略)
delete obj;

としたとき、newで確保された領域全部が開放されるのですか?
>>470
そうです。但しポインタに内部でnewで割り当てていたりしたら
自動では開放されないのでデストラクタに突っ込むべし。
472461:04/02/10 03:37
ほんとに低レベルですみません。
最初はスレッドセーフなC関数しか使わないし、
と思って VC++ で CreateThread を使っておきながら・・・
_beginthread で書き換えてみたら直ったようです。
>>460,462,463,465,467 さん、
C に毛を生やしただけのようなコードしか書けない私に助言してくださって、
ありがとうございます。
C1010: プ(略
>>473
#(ry)。
>>470
あなたが使っているoperator deleteは領域全部を解放しているのですか?
デフォルトのoperator deleteを使っているなら、
そのoperator deleteのドキュメントには何と書いてありますか?

これはユーザ定義。何とも答えようがありません。
>>475

そんな言い方すると、C++のほとんどの挙動はユーザ定義可能であって、
初心者にはまともな質問も回答も難しいだろ。

確かに>>470の質問は勉強不足というか、C++の教本なら絶対に書いてある
内容なので煽りたい気持ちもわかるが、ちょっと大人気ないよ。

これだけだと俺もフレームっぽいので>>470に答えておくと、
初心者の質問ということで「newで確保された領域全部」というのが
本当に把握できているのかどうか疑問だが、
「classで定義されている領域は解放される」。
だが、(コンストラクタ・デストラクタのあるなしにかかわらず)
classが動的に確保した領域は解放されない。
たとえばメンバ関数にポインタを持っていて、なんらかの処理で
このポインタに対して動的にメモリを確保した場合、ここは
解放されない。この場合、領域の解放に加えて、代入や初期化の
副作用の可能性も考慮する必要がある。

ただね、こんなのはC++の基本中の基本なのでもっとちゃんと
学習するなり自分で調べるなりするのを勧める。
もう・・・名前空間とかわけわかんね・・・。

"std::ifsreamからstd::ifstreamへ変換できません”とかわけわからんエラーでるし・・・。なんねコレ
おなじやんか!!!変換しろ!

予想できる原因教えてくださいm(_ _)m

スペルミス
ヘルプ検索すると、新しい<fsteam>について、
『ファイル ハンドルからストリームを作成できません。』
て書いてあるんですが、この辺かな・・・。意味わからん。


問題のプログラムを省略してかくと大体こんな感じのプログラムなんですが、
using namespace std;

int Inputdata(ifstream );//プロトタイプ宣言 内容省略

int main(){

fstream fin("data.txt");

Inputdata(fin);

}

Inputdata(ifstream)にストリームを渡す時にエラーがでてます。
> "std::ifsreamからstd::ifstream
      ~
> ヘルプ検索すると、新しい<fsteam>について、
                   ~

ifstreamになったりfstreamになったり、
ほんとにスペルミスでFA?
それはちがいますw
コピペじゃなくて打ち込んだので、実際のプログラムではそろってます・・・。
basic_fstreamはbasic_ifstreamおよびbasic_ofstreamを継承してないから
>>476
> だが、(コンストラクタ・デストラクタのあるなしにかかわらず)
> classが動的に確保した領域は解放されない。

はぁ ? そういうところを含めて、「ユーザ定義」だろ。
デストラクタで解放するように作ることもできるんだから。

要は、>>475 は myclass の中身がわからんと答えようがないと言ってるだけだろ。
だから、>>470 がホントに回答得たいなら、どっかに class の定義をアップするしかないよ。
ストリーム系のクラスってコピーできないんじゃないっけ?
ifstreamを参照で受け取りなはれ
>>485 ありがとうございます。コンパイルは通りましたm(_ _)m
でも今度はプログラムが固まってしまいます。どなたかお助けを〜環境はVisualStudio.NTEです。

『 Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted. 』

やりたいこと: テキストファイルから指定の文字列を見つけてその行に書かれている整数データを入力し、結果を確認のために出力

<data.txtの内容>
data1: 2 3 5 5 5 12 35
data2: 1 2 3 4 5 6 7 8 9 10 3

関数
int Mystring::InputData(ifstream &fin, char str[ ] ){

char s[100];
int data[51]={0};
int i, n;
int ret;
while(!fin.eof()){//ファイルの終わりまで文字列strを探す
fin >> s;
if(strcmp(s, str)==0){break;}//見つけたらそこで止まる
}

char c[1];
n=0;
fin >>c;

if(c[0] !='\n'){//先頭に空白文字,改行があったら読み飛ばす
data[ n]=atoi(c);
n++;
}

while(fin.peek()!='\n' && fin.eof()==0){ // 改行になったら入力終了
fin >> data[n];
cnt++;
}

for(i=0;i< 50;i++)cout << ' ' << data[i];//確認の出力
return 0;
}

コノ関数をmainのなかで呼び出して、使うと確認の出力まではいくのですがそこで固まってしまいます。

int main(){
Mystring Data;

ifstream fin("data.txt");

InputData(fin,"data1:" );

int end;
cin >> end;
return 0
}
ごめんなさいこの質問なし・・・ あふぉやった・・・。
warota
>>483

>>デストラクタで解放するように作ることもできるんだから。

>>470にデストラクタは作ってないって書いてあるじゃん。
ちゃんと流れを把握しろよな。

>>470の質問
-->>475でoperator deleteに関する突っ込み
---->>476で初心者だからデフォルトの挙動を説明

だろ。ここでデストラクタの話を出してどうするんだ。
>>491
言葉は少々汚いが、根はやさしい奴(・∀・)ハケーン!
493デフォルトの名無しさん:04/02/12 18:21
ocx を作ろうと思うのですが、
VC++とBC++Builderのどちらがよいですか?
MFCを覚えるのが面倒だからBCCの方がよいかと思っているのですが。
VC++でSDK
これ最適解。
bccはヤメトケ
いろんな意味で不幸だ
>>493
VCでもMFC使わずにいけるし、BCCでOWLとどこが違うと言いたいんだ?
497デフォルトの名無しさん:04/02/13 00:51
VC++でATL/WTL
これ最適解。
>>493
ATLに一票。
mingwを使ってますが、DOS窓で表示される
長いコンパイルエラーを全て見る方法はありませんか
>>499
Dev-C++を使ってコンパイルし、エラー出力窓をスクロールして
見る。
>>499
リダイレクトしてファイルに落としてから見る。
>>499
MOREに似非パイプでつないで見る。
>>499
DOS 窓のバッファサイズを大きくする。
cygwin上でなら

$ gcc ..... 2>&1 | less

MSYS は知らん。
というかemacs使うと
M-x compile
C-^
でエラー箇所へ飛ぶので楽だぞ。
>>501-502
Win98のdosなので標準エラーへのリダイレクト・パイプは無理でした
>>500
ありがたう
>>503
試してみる
>>503
プロパティを開いてみましたが、そんな項目はありませんでした
9x系のDOS窓では無理ですかね
>>506
この期に Cygwin を入れてみれ。
>>507
確か 9x 系にはバッファサイズの指定は無かったと思う。
Windows98の dos なら、
command /c make > hoge ってな感じでもう一個 command.com 起動して
リダイレクトしてあげればエラー出力もファイルに書けたような記憶がある。。。
MSYS!
<cstdio>において、bcc5.5やmingwでは
stdoutやstdinがdefineされているのですが、
標準ではstdの名前空間内になくていいものなのですか?
プリプロセッサマクロに名前空間など無い。
そいういうことを言ってるんじゃないだろ...。
>>514 じゃー何を?
例えば GCC だと

 #define stdin ((__getreent())->_stdin)

になってるけど、これだと std::stdin と使うことができない。
これは C++ の仕様として正しいのか?
std::stdin と使えなくていいのか?
という質問でしょう。
namespace std { inline FILE* _std_PFILE(FILE* val) { return val; } }
#define stdin _std_PFILE((__getreent())->_stdin)
とかにすればいいのにナ。
もう一度言う、プリプロセッサマクロに名前空間など無い。
……
stdin が std 名前空間内の識別子、
もしくは、それに展開されるマクロでないのだが、
それは C++ の仕様から許されるのかって質問だろ?
stdin/stdout/stderrは標準Cライブラリのマクロで、C++でも同じものが提供されている。
あとは、>>513
>512です。
レスをくださったみなさん、
言葉足らずな質問で混乱させてしまい、
申し訳ありませんでした。
基本的には>516さんと>520さんの
おっしゃるとおりです。

>521さん
stdin/stdout/stderrはグローバル変数ではなく、
マクロとして定義されていたのですね。
これでなんかすっきりしました。
ありがとうございました。
>>521
ホントだ。マクロって書いてあるな。

じゃ、g++ で printf が std:: なしで使えるのはどうなんだろう?
しかも、std:: なしだとフォーマットチェックの警告が出ないし...。
>>524
C 用のライブラリを使いにくいから...ってことか。
確かにそうだなぁ。
すみません、C++で質問なんですが
2行3列の行列の和を求める関数 int sum(int x[][3],int y[][3],int z[][3])
で仮引数x[][3]をx[][]と出来ないのは何故ですか?

また、この関数だとn行3列の行列の和しか出せないのですが
n行m列の行列の和を出す関数は作れないんでしょうか?
>>526
すでにCのスレが回答が出てるようだけど
C++というよりまるっきりCの質問だね。
というか、マルチイクナイ
>529
すみません;
初めC統合逝って書き込んでみたら一個前のレスが01/18だったもんで廃棄されたスレなのかと
なるほど。
>>530-531
だからと言って方々のスレにマルチする言い訳にはならん
移行した旨を伝えるべきだな。
といっても、今回のは移行するのとほぼ同時にレスが返ってきてるので、
逆にこっちに回答がありましたというべきだったか。
でも、>>527 も意外と即レスだったので...うむぅ。
534デフォルトの名無しさん:04/02/15 03:26
_spawnl( _P_WAIT, "hoge.exe", "-AA temp.txt result.txt" );
プロセスを新しく起動させたくて上のコードを実行しましたが
例外が発生してしまいます。
パスに日本語がない状態で実行しても例外が発生します。

別に新規に上のソースだけバージョンを作って実行すると問題なく完了します。

タイプミスやファイルの有無も確認しましたが、
どうしてもエラーの原因がわかりません。
どなたかご存知ではないでしょうか?
VC++ 6.0 win98
俺は_spawnl使ったことないけど、
↓こうじゃないの?

_spawnl( _P_WAIT, "hoge.exe", "-AA", "temp.txt", "result.txt", NULL );

これでも駄目ならグローバル変数 errno を参照するとか
_spawnl( _P_WAIT, "hoge.exe", "-AA", "temp.txt", "result.txt" );
_spawnl( _P_WAIT, "C:\\a\\down3\\hoge.exe", "-AA temp.txt result.txt" );
_spawnl( _P_WAIT, "C:\\a\\down3\\Sjet.exe", "-AA", "temp.txt", "result.txt" );
フルパス指定してみましたが、これでも例外が発生しました。
かんじんの errno は 0 です。

これ以上手がかりないです・・・
いや、重要なのは最後のNULLなんだけど・・・
素直に CreateProcess 使いまつ
シングルイベントが良かったのだがおおおおおお
MSめぇ手ぇぬいたなぁあああああ
すれ違い
NULL で、できました
どうもありがとうございました。

でも 今日は寝まーす
シングルイベント?
勝手に俺用語定義するな
いや、定義はまだ見当たらないから、未解決参照にして読んだ。
よって今のところ意味不明。
template <class T>
void test(T t){}

template <>
void test<int>(int t){}

みたいに特殊化する時、<int>があるのとないのとでは違いはあるのでしょうか。
あと >>341

template< class T1, class T2 >
void hoge( T1 & t1, T2 & t2 )
{ cout << t1.value << t2.value << endl; }

template< class T1 >
void hoge( foo<T1> & t1, T1 n )
{ cout << t1.value << n << endl; }

でもよくないですか?
544538:04/02/15 20:37
眠かったんだよ
見逃してちょ
シングルスレッド
>>544
#define シングルイベント シングルスレッド
了解。

ところで、普通マルチスレッドというと
1プロセスの中で複数のスレッドが走っている
ことを言うのだが?
546538:04/02/15 21:07
>>545
そのようだが?
547538:04/02/15 21:21
OKOK
やっと分かった
同期させたかった
これでいいかな?
main で処理した結果をテキストに出力して、
それを解析する別のexeファイルを起動させて、テキストに出力して、
main では、解析を待つ状態を作りたかったわけ

中途半端な使い方がいけなかったかもしれん
というわけで
#undef シングルスレッド
_spawnl や CreateProcess はスレッドの数とは無関係なわけで、
>>538の発言は未だに意味がわからない。
549538:04/02/15 21:34
俺の間違い
===終了===
>>549
シングルイベント -> シングルスレッド
シングルスレッド -> #undef

OK?
シャ乱Qかよ
552デフォルトの名無しさん:04/02/15 22:37
シングルスレッドで夢とお前を抱いてるのかよ!
2ch::シングルスッドレ
554デフォルトの名無しさん:04/02/15 22:39
>>551
俺も思った(*^-^*)
ワラタ
556543:04/02/16 00:20
教えてください。おながいします。
>>543
> みたいに特殊化する時、<int>があるのとないのとでは違いはあるのでしょうか。

ないですよ。

> あと >>341
> ・・・
> でもよくないですか?

ダメだったんですか?
558543:04/02/16 00:53
>>547
ありがとございます。
クラスの場合は関数みたいに引数で推論、みたいなことができないので
<int>は必要。であってますよね。
template <> void test<int>(int t){} より、
void test(int t){} の方が優先順位が高い様なのですが
そこらへんのルールってどうなってるんでしょう

341のは、僕は 543でいいと思ったんですけど
意図していることと違うのかなあと思ったので。
>>558
> クラスの場合は関数みたいに引数で推論、みたいなことができないので
> <int>は必要。であってますよね。

あってると思いますよ。

> template <> void test<int>(int t){} より、
> void test(int t){} の方が優先順位が高い様なのですが
> そこらへんのルールってどうなってるんでしょう

こちらに詳しい資料がありますので、どうぞ。→ttp://www.kuzbass.ru/docs/isocpp/over.html

> 341のは、僕は 543でいいと思ったんですけど
> 意図していることと違うのかなあと思ったので。

>>341にテスト用のコードが載っているので、それで試されてはいかがでしょう?
それ以上の意図は、本人に聞かないとわからないでしょうね。
560デフォルトの名無しさん:04/02/16 07:09
Effective C++を今更ながら読んでます。
class固有のnewのオーバーロードについての宣言が

class X {
public:
static void *operator new(size_t size);
...
};

という感じで必ずstaticなのは何か理由があるのでしょうか?
staticじゃないとX からしか new X できないじゃん?
static付けなくても勝手にstaticになるんじゃなかったっけ?
563デフォルトの名無しさん:04/02/16 17:37
初歩的な質問


inline bool operator==(const aaa& str)const{

}

この const ってなんですか?
なぜわからないのに初歩的だと言い切れるのか?
とお決まりのツッコミ。
565デフォルトの名無しさん:04/02/16 17:41
なんでだろう。
>>563
どのconstだ?

>>564
言語仕様に関することだからじゃないか?
567デフォルトの名無しさん:04/02/16 17:44
inline bool operator==(const aaa& str)const{
~~~~~~
です。

何がコンストなんですか?
568デフォルトの名無しさん:04/02/16 17:44
空白はいらないんだった
ここで質問して回答を待つより
入門書を読んだり入門サイトをぐぐって調べたりする方が
ずっと早く疑問が解決すると思うんだけど
570デフォルトの名無しさん:04/02/16 17:48
調べ中...
面倒だから教えてやる。
1番目のconstはstrの指すインスタンスに対して変更できない事を示す。
2番目のconstはthisの指すインスタンスに対して変更できない事を示す。
>>567
二番目のconstだと推測して回答。
class Xのメンバ関数の宣言の後ろにconstをつけると、そのメンバ関数はconst X型の
オブジェクトに対して呼ぶことができる。
これによって状態更新演算と状態取得演算の違いを明示できる。
組み込み型のconstの挙動にあわせるのが普通の使い方だが、
クラスの設計者がconstの意味を定義できると考えてもよい。
mutableメンバも併せて調べるとよし。
573デフォルトの名無しさん:04/02/16 17:55
なるほど。
thisですか。

どうもありがとうございました。
this is unco
> クラスの設計者がconstの意味を定義できると考えてもよい。

よくないと思いますよ。
>>574
is 演算子のある言語ならいけそうだな。
const と mutable の関係。
const と const_cast の関係。
volatile
const volatileを組み合わせるとconstだけでもなく、volatile
だけでもない新しい属性が発生するというこの複雑さ。

お陰でメンバ関数をたーくさん書く羽目に。
this is not manko
i am pen
>>576
演算子の定義できる言語なら(以下略
#define is ->
いままでCしかやったことなくて
今C++を勉強しています。
講座を見ると
using namespace std;
と初めに書いてあるのですが
これは一体なんのために書いてあるのかわかりません。
よほど古いものでない限り
どんな入門書にも
どんな入門サイトにも
書いてあります
>>583
namespace std
{
//ココ
}
の中で定義された関数、クラス等をどこででも、つまり「std::vector<int> ...」
などとしなくても「vector<int> ...」のように使えるようにする操作。名前の
衝突が起こりやすくなるため、グローバル(この場合翻訳単位ということに
なるが)でこれを行うことは推奨しない。面倒臭くても出来る限り小さな
スコープの中で行うことが求められる。ただし、規模の小さなコード、
すなわち入門書の練習問題程度では問題にならないことが多い。
「名前空間(namespace)」について勉強することをお勧めする。
名前空間は全部usingでグローバルに導入して、
衝突の起こったときだけ限定子で明示するってのも
ありのような気がするんだが、推奨されてないのは何か理由があるのかな。
>>586
気持ち悪いYO!

宗教戦争の悪寒…
やっぱ、「偶然の一致」じゃないかな。
typoで意図しないものが呼ばれてしまうとか。
(特に1引数コンストラクタやoperator系)
>>588
なるほど。そこまで考えてなかったよ。
590583:04/02/17 19:42
>>585
丁寧な説明ありがとうございます。
591デフォルトの名無しさん:04/02/17 20:21
deleteについて教えてくださいm(__)m
配列でnewしたオブジェクトのポインタは
delete [] p
で解放しないといけないとダメとのことですが
vc6.0でステップ実行したところ[]を付けても付けなくても
同じoparator::delete()が呼ばれていて、中身はcのfree()
をラップしただけなのですがどういうことなのでしょうか?
>>586
もはやこれは宗教戦争だけど、漏れはstd名前空間だけならグローバルでもいいと思う
>>591
ある環境で動くことが、他の環境でも動くことを保証するわけではない。

まぁ、大抵の場合はデストラクタがない型なら [ ] なくても動くとは思うが、
だからといって書かないってのはダメ。

要するに delete の場合は先頭のしかデストラクタが呼ばれず、
delete [ ] の場合は全てのオブジェクトでデストラクタが呼ばれる。
さらに、new [ ] の場合は(delete [ ] で使うための)オブジェクトの数を
保存する領域も同時に確保することが多く、
new [ ] で返される値と実際に確保されたメモリ領域の先頭アドレスとは
その分だけずれることが多い。

実際のところ、このあたりをどう実装するかは処理系依存で、
デバッグモードでのみデストラクタの有無に限らず delete と delete [ ] の処理が違ってても
何の文句も言えない。
>>591
特定の処理系でうまく行った(ように見えた)としても
規格に合致しているわけではないからdelete[]を使うべき。
vc6での正確な挙動は忘れたが、ただのdeleteで配列全体の
デストラクタが呼ばれるか試してみると良い。
595591:04/02/17 20:59
>>593-594
なるほど!処理系依存なんですね。
デストラクタが呼ばれるかは試してなかったのですが、MFCアプリで[]を
付けずにコンパイルしたらアサーションされたのに、[]を付けたら
走ったので、何が違うのかと思ってステップ実行したら同じoperator::delete
が呼ばれていたので何が違うんだろうと思ったのでした。
ありがとうございました。。。
デストラクタを呼ぶ部分は
operator delete(...) の中には無いからね。
operator delete(...) を呼ぶ前に実行される。
597591:04/02/17 21:03
>>596
あっ、そうか!その部分こそ処理系(実装)依存でソースを
追っていても見えないんですね。
よくわかりました。。。
デストラクタを呼ぶのが
operator delete が呼ばれる前ってのは
処理系依存じゃないんだけど...。
>>598
いやそのこと自体を処理系依存と言ってるわけじゃないだろう。
600591:04/02/17 21:19
あ、大丈夫です
変な書き方してすみません(汗
vector<string> で5000個ほどのデータを管理したいんですがそのまま使うとメモリを
食いすぎてエラーを起こしてしまいます。。
いろいろ調べて new すればいいことまではわかったのですが、肝心の vector<string>
での new の仕方が分かりませんでした。
初歩的な質問であることは重々承知しているのですが、どなたか分かる方がいれば
教えてくださいm(__)m
More Exceptional C++オモシロイ。STLのきわどい使い方や
遅延評価など新しいトピックが満載。感想は「痒い所に手が
届く」といった感じだ。
>>601 難しくないよね。

#include <iostream>
#include <vector>
#include <string>

typedef std::vector<std::string> Vs;

int main()
{
Vs* vsp;

vsp = new Vs(5000);

(*vsp)[4999] = "abcdef";

std::cout << (*vsp)[4999] << std::endl;

delete vsp;
}
604601:04/02/17 21:37
なるほど・・・
さっそく試してみます。
603さんありがとう!ありがとう!
ええと
>>601
何も分かってないべ。
new することに意味は全く無い。

vector<string> でメモリが足らなければ、
少々のことしたくらいではメモリが足りるようにならない。
というか、そんくらいで一杯になるメモリって何?
他の何かがおかしいんじゃないの?

あと、再確保は嬉しくないので
できるなら最初に vector のサイズを指定した方がいい。
>>604
後、参照外しが面倒ならこういう風にしてもいいべ。

#include <iostream>
#include <vector>
#include <string>

typedef std::vector<std::string> Vs;

int main()
{
Vs* vsp;
Vs vs;

vsp = new Vs(5000);
vs = *vsp;

vs[4999] = "abcdef";

std::cout << vs[4999] << std::endl;

delete vsp;
}
>>606
実装次第だと思うけど、vectorの本体も、中身のstringも
ヒープ領域に確保されるという気がするよねえ。5000個とか
数はあまり関係ないような気がする。
>>607
...。Vs& vs = *vsp; なら分かるが。
>>609
&つけて参照しないと、新しいオブジェクトが作られるだけだね。
だから&無しではvs[4999]に何か代入しても(*vsp)[4999]は空のままだ。
ポインタにする意味はないと思うんだけど…
ないよ。全く。
>>611
こうかい?段々プログラムがねじれて行く気がするんだけど・・・・

typedef std::vector<std::string> Vs;

int main()
{
Vs& vs = *(new Vs(5000));

vs[4999] = "abcdef";
vs.resize(10000);

std::cout << vs[4999] << std::endl;
std::cout << "size = " << vs.size() << std::endl;

delete &vs;
}
new する意味が無いと言ってるというのに...。
int main()
{
  std::vector<std::string> vs;

  vs.resize(5000);
  vs[4999] = "abcdef";

  std::cout << vs[4999] << std::endl;
}

で、いいだろ。
vectorの中身はヒープ領域に確保されるんだから。
>>614>>615
やっぱそうだよな。それにしても>>601さんの書き込みが
気に掛かる。。。
617デフォルトの名無しさん:04/02/17 23:15
割り込みすみません。初心者質問ですがおせてください。
よく「VBはランタイムがいる」とか言いますが、cやc++も
ランタイムというかライブラリが要りますが、これは静的に
リンクされているために実行時には不要ということなのでしょうか?
標準ライブラリとかはものすごいデカイので静的にリンクすると
ものすごいデカイ実行ファイルになってしまうと思うのですが。
>>617
LIBファイルの構造による。関数一つ一つをバラバラにしてある
LIBと、いくつかの関連する関数をまとめてパックしたLIBでは
リンクされる大きさが違う。

Cはそういう傾向があるが、C++は継承が多用されているので
ガバッとリンクされる。動的にリンクする事も大抵できるので
お試しあれ。
619617:04/02/17 23:25
>>618
レスどうもありがとうございますm(__)m
なるほど、標準ライブラリといっても複数のLIBに分解されているので
#includeするヘッダによってリンクされるLIBが決まってくると
いうことなのですね。VBあがりの初心者VCプログラマなのですが
VCにはVBのようなランタイムがないのでわかりにくかったのですが
理解できました。
>>619
違う。#includeで決まるわけではない。
「関数を実際に使わないと」リンクされない。
という実装が多いだけだな。
呼び出されていない関数の未解決参照を
「エラーにしなくてよい」というだけの話。
622617:04/02/17 23:34
>>620
あ、なるほど。
ところで、たとえば今ヘッダで
#include <vector>
と書いて、実際に
vector<int> vi;
と宣言して使用したとして、リンカはvectorの実装がどのLIBに
存在するかどうやって知るのですか?

リンクするのは、.cをコンパイルした.objファィル。
LIBは.obj(.o)を集めたファィル。
その中から実際に使われる.objファィルだけがリンクされる
>>622
基本的には暗黙なものを含めて指定されたオブジェクトファイルとライブラリを
全てリンクするだけ。完全に同名の関数が複数あればエラー吐いて終わり。
どこに実装があったかなんか知ったこっちゃない。
625617:04/02/17 23:44
>>621さんもどうもです。
>>623
LIBファイルというのはobjファイルの集合だったんですね。
で、リンカは実装が存在するobjファイルを探して
それだけをリンクの対象にするということですか。
基本的なことがわかってなくてすみませんでした。
みなさんどうもありがとう...。
>>622
vector は テンプレートライブラリだから
他に何もリンクしないと思う。
何か特殊化してるものがあったら分からんけど。

まぁ、そんなことはどうでも良くて、
標準ライブラリであればコンパイラやリンカの方で
自動的にチェックしてくれるのが殆どだと思う。
だから、そのあたりをいじるには、
リンカか何かのオプションをいじればいいと思う。
ちなみにほとんどの実装でstd::vector<>の実装なんてものは存在しない。
>>627
ヘッダに入っちゃってるからってこと!?
STLつかうと一気に実行ファイルサイズが10倍に?!
>>629
おまいのコードはせいぜいレス番程度のライン数
>>629
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>>633
#include "stdafx.h"

後死ね。
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/
>>601
> vector<string> で5000個ほどのデータを管理したいんですがそのまま使うとメモリを
> 食いすぎてエラーを起こしてしまいます。。

たぶんこれが、メモリの食いすぎじゃないんだろうな。
>>634
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
おまえら、いい加減にそのネタから離れろ
容疑者を絞り込むために、小さいテストプログラムを作る事をお勧めする。

int main()
{
 const size_t max_size = 5000;
 vector<string> arr(max_size);
 char buffer1[256];
 size_t i=0;
 for(i=0; i<max_size; i++){
  sprintf(buffer1, "私は、%04dです。", i);
  arr[i] = buffer1;
 }
 
 for(i=0; i<max_size; i++){
  cout << arr[i] << endl;
 }
 
 return 0;
}

ま、結論から言うと、vector<string>に罪はないってこった。
640デフォルトの名無しさん:04/02/18 05:38
n個の整数型定数a[n]が与えられているとき
n個の整数型変数x[n]の値を次のように定める。

数学的な意味での集合として { x[0] , x[1] … x[n-1] }={ a[0] , a[1] … a[n-1] }
任意のi,j(i≠j)に対して x[i]≠x[j]

つまりn個の定数の順列を考えているわけです。
ですから当然n!=n*(n-1) … 2*1個のパターンがあるわけなんですが
これを具体的に設定する上手い方法を思いつきません。

例えばn=3くらいであれば
for(int i=0; i<3; i++){
for(int j=0; i<3; j++){
for(int k=0; k<3; k++){
x[0]=a[i],x[1]=a[j],x[2]=a[k];
if(x[0]!=x[1] && x[1]!=x[2] && x[2]!=x[0]){
cout<<x[0]<<endl<<x[1]<<endl<<x[2]; } } } }

などとすれば一応出来るのですが、一般の個数nの場合ですと
このような方法ではいたずらにソースコードが増えてしまいます。

何か良い方法はないでしょうか。
よろしくお願いします。
>>640
再帰は?
>>640
ここはstd::next_permutationに限るな

#include <stdio.h>

char s[4]={'A','B','C','D'};

void fun(int i)
{
 char c;
 int j,k;
 for(k=i;k>0;k--){
  for(j=i-1;j>0;j--){
  printf("%s\n",s);
  c=s[j];
  s[j]=s[j-1];
  s[j-1]=c;
  }
 }
}

int main ()
{
 fun (4);
 return 0;
}

C++だとどうなるんだろ。
>>642
同意
標準ライブラリに、こんなときに使わなくてどうするって関数があるんだもんな。
645デフォルトの名無しさん:04/02/18 13:40
#include <iostream>
class CSub;
class CBase {
public:
 CBase(){}
 ~CBase(){}
 CSub* CreateSub() { CSub *node = new CSub; return node; }
};
class CSub {
public:
 CSub(){}
 ~CSub(){}
};

int main(){ return 0; }

初歩的ですいません。
上のコードをコンパイルすると
error C2512: 'CSub' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
と でてコンパイルできません。
コンストラクタもデストラクタも定義しているはずなのですが、
どこがいけないのでしょうか?
VC++6.0
>>645
僕も初心者で申し訳ないのですが
class CSubの定義を前方宣言の位置に書くと通りますね。
なんでだろう。。。
647デフォルトの名無しさん:04/02/18 13:57
>>645
空宣言が有効なのはポインタと引数だけ。
インライン関数はダメ。

CreateSubをインライン関数にせずに、CSubの宣言の後で定義すれば大丈夫なはず
>>647
厳密に言えば空宣言を使ってインスタンスを生成するのは違反ってことだな
649645:04/02/18 14:10
>>647,648
YEAH!
前方宣言だったぜ
最近イージーミスが多い いかんいかん
>>649
645とえらいキャラが違うなw
651645:04/02/18 14:23
すいません ギャップが激しいもので
あ、単細胞とか言わないで下さいね。
652デフォルトの名無しさん:04/02/18 14:23
質問おながいします。
基底クラスでデストラクタをvirtualで宣言したとき
派生オブジェクトをdeleteすると、派生・基底ともに
デストラクタが呼ばれますが、virtualの本来の性質から
いうと派生クラスのデストラクタのみ走るべきでは
ないのですか?これはc++の仕様なのでしょうか?
仕様です。
virtual じゃなくてもそうなります。
「デストラクタ」の本来の性質が優先されているわけです。
というか派生しか走らなかったら、抽象クラスならまだしも
基底クラスの要素を削除するやつがいなくなるからな。

それじゃ困るだろ?
655652:04/02/18 14:29
>>653
レスどうもです。
>「デストラクタ」の本来の性質が優先されているわけです。
とすると、よく基底クラスのデストラクタはvirtualとして
宣言しておかないと
CBase *pb=new CDerived();
delete pb;
としたとき派生クラスのデストラクタのみ走って基底クラスのが
走らないミスが言われますが、なぜvirtualでなくとも基底クラス
のデストラクタが走る設計にc++はなってないのでしょうか?
656652:04/02/18 14:32
すみません。
×派生クラスのデストラクタのみ走って基底クラスのが走らない
○基底クラスのデストラクタのみ走って派生クラスのが走らない
でした。
657652:04/02/18 14:34
度々すみません。やっぱり
×基底クラスのデストラクタのみ走って派生クラスのが走らない
○派生クラスのデストラクタのみ走って基底クラスのが走らない
でした。
>>655
効率のため
659652:04/02/18 14:37
スレ汚くしてスミマセン。
ちょっと頭冷やしてきます。
>654
任意に呼び出す事もできるけどな。

設計が悪いのは解っているが、
たまに派生要素の削除の前に基底のデストラクタを呼びたいとき、
派生のデストラクタの先頭で呼び出すことがある。
その後もう一回呼ばれてしまうのが気持ち悪いが。
気持ち悪いと言う程度の問題なのか…
>>655
多分、「なぜデストラクタにはvirtualが必要」ではなく、
「なぜコンストラクタにはvirtualが必要じゃない」が正しい疑問なんだと思う。
理由は、呼び出されるべきコンストラクタのアドレスは全て静的に決定できるのに対し
デストラクタは実行時じゃないとわからないからだと思う。

D* d = NULL;
switch( x )
{
case 0: d = new A;
case 1: d = new B;
case 2: d = new C;
}
delete d;
C++標準がどう考えてるかはARMでも読めばいいとして、
単純な話デストラクタを強制的にvirtual扱いすると、仮想関数が一つもないクラスでもvptrとvtblがくっついちゃって
効率に影響を及ぼすっていう理由があるんじゃないでしょうか。
>>663
complex とかがいい例だね。
perlのcrypt関数と同じ動作をC++でもさせたいのですが、
unistd.hが無いのでその関数が使えません。
どうにかしてC++でcrypt関数を使う事は出来ないでしょうか?
元スレから見てるけど
君の移動すべきスレはこっちだよ
http://pc2.2ch.net/test/read.cgi/tech/1077102238/
668665:04/02/18 20:21
移動します。
669デフォルトの名無しさん:04/02/19 01:26
お願いします。
VC++6.0なのですが、newに失敗してもbad_alloc例外がスローされずに
ヌルポインタが返ってくるのですが、これはコンパイラの仕様なの
でしょうか?
本を読んだら#include <new>すれば比較的新しい処理系(コンパイラ)
は例外を投げると書いてあったのですが。
>>669
VC++6.0はその点では「古い処理系」に当たる。
その他の点も含めて「古い処理系」だな。
>>671
そうだな。確かメンバテンプレートが使えないので
STLのコンテナは軒並みデフォルトのアロケータが
使えなかったような記憶が。
宣言部(でいいんだっけ?)で実装すれば
一応メンバテンプレートも書ける。
VC++6.0付属のヘッダとかには一応bad_allocの定義とかあるし、
CRTのソースにはなんかあるような気配なんで、どっちかつーと過去互換の
問題っぽいけどな。
一応bad_alloc投げさせたい場合は_set_new_handler()ってことになってるが。
Dinkumware の ver3.08 にはVC++6.0でも動く
std::set_new_handler があってちゃんと動作する。
概念的な話になって申し訳ありませんが、
privateな仮想関数ってどういう風に使うんですか?
クライアントコードからは多様的に使えないわけで、
既定クラス・派生クラス間で単に同じ名前の関数がある
(両者になにか関連があるというわけではない)というだけ
になるんでしょうか。

template method。
>>676

普通は使わない方がいいとされてる。
派生クラスでprivate関数の振る舞いを変えるのは基底クラスの意図しないところであるから。
679676:04/02/19 07:37
template methodはprotectedの方がよくないですか?
それ以前に、private・protected・publicは、
派生クラスでの属性変更が可能では?

protected→public
public→protected

というか、コンパイル時しか関係ないような事に
神経つかうのは時間の無駄ですよ、きっと。
私、経験ありますから(w
private な仮想関数は多分使ったことないな。
オーバーライドするときに、
基底クラスの仮想関数を派生クラスで呼ぶことを禁止する、
ってな状況であれば使うこともあるかもしれんが。

>>680
>というか、コンパイル時しか関係ないような事に
>神経つかうのは時間の無駄ですよ、きっと。
には全面的には同意しかねるが、
今回のことに関してはそうかもな。
template methodとしてしか呼び出されたくないが純粋仮想関数ではなく
デフォルトの実装を提供したければprivateじゃないとダメじゃないか?
そのデフォルトの動作を派生クラスで使いたい場合は
protected にする必要があるけどね。
class I_vfTCB
{
friend class vfTCB_Manager;

public:
I_vfTCB(void) : next(0),prev(0),Order(0) {}
virtual ~I_vfTCB() = 0 {}
private:
virtual void Run(void) = 0;
virtual void Remove(void) {}
I_vfTCB *next;
I_vfTCB *prev;
unsigned long Order;
};
こんなので使ってました。
686ahoneko:04/02/19 13:46
#include <iostream>
#include <string>
using namespace std;

class Neko{
string name;

public:
Neko(){}
Neko( string n ){
name = n;
}
void ShowName() const{
cout << "I'm " << name << "." << endl;
}
};

void GenerateNeko( Neko *neko ){
neko = new Neko( "TAMA" );
}

int main(){
Neko *x;
GenerateNeko( x );
x->ShowName();
}
どうしてこんなコードは、駄目なのにゃ〜。
ブルーバックスの「これならわかるC++」読んだけどわかりにゃせん。
687ヽ(´ー`)ノ:04/02/19 14:03
GenerateNeko() がおかしい。
main() の x と、GenerateNeko() の neko とじゃ刺してる先が違うぞ。

やるんなら、

Neko* GenerateNeko() {
return new Neko("TAMA");
}

x = GenerateNeko();

か、

void GenerateNeko(Neko** neko_ptr) {
*neko_ptr = new Neko("TAMA");
}

GenerateNeko(&x);

ポインタについて勉強しる。
GenerateNekoのインスタンスをだれが破棄するんだ?
689ahoneko:04/02/19 14:16
687さん、ありがとうです。うまくいきましたわい。
ボインダについて勉強しましる。
ぼいん、ぼい〜ん〜
>>687
std::auto_ptr
boost::scoped_ptr
692ヽ(´ー`)ノ:04/02/19 16:57
言われなくたって分かってるよ(ノД`)俺じゃなくて質問者に言えよ
>>689
これでもいいよ。ポインタのリファレンス。

void GenerateNeko(Neko*& neko)
{
neko = new Neko("TAMA");
}
int main()
{
Neko* x;
GenerateNeko(x);
x->ShowName();
}
Newって遅いのか?
mallocを使うべきなのか!?
教えてください
>>694
newもmallocも遅い。
>>695
多用してはいけないと…
697デフォルトの名無しさん:04/02/19 19:01
メモリ管理は自分で書きなさい!
ポインタって何よ?

なんで必要なの?
いらない。窓から投げ捨てろ
C++ではできるだけnewを使う方がよい(コンストラクタの呼び出し
をしてくれる)。内部的にはnewはmalloc()を呼び出しているよう
だけどね。
ポインタがないと Hello, world! も書けない。
ポインタなんてなくても
次のアドレス指定するコード書けばいいんじゃないの?
そうでもないの?
>>701
putchar 使えば書けないことも無いけどな。
C++ だと参照で事足りることも多いから、
C の頃よりはポインタを使う機会は少ないけど、
それでも結構使うな。

特に配列を受け渡すのやメモリの動的確保は参照だと不便だし、
ポインタだと NULL かそうでないかで処理を変えることができるのが便利。
あと、アドレスを途中で変更する必要があれば
ポインタを使わざるを得ない。
>>704
C++ではNULLでなくて0ね。念のため。
>>705
C でも 0 が使えるが...。

C++ だと #define NULL 0 なんで、
NULL も 0 も同じことだ。
mainの関数へのポインタが使われてるし。
>>707
const_castみたいなもんだな
つーか多態使うのにポインタ使わんとどうしようもないだろ。
参照で事足りる事も多いけどね。
ポインタ乱用されたソースは、
かえって素人っぽいソースに見える罠。
そこでSmart_pointer
>>712
DLLでexportできねー。いや、C++前提ならともかく・・・。
そんなあなたに COM
stringクラスについてなんですが、

i = 10という結果が得られ、そこから hoge010 という文字列を作るときに

現在では

string piyo = "hoge"
char buf[10];
sprintf(buf, "%03d", i);
piyo += buf;

というようにstringクラスとcharを使い分けてます。

これをcharを使わないで実現する方法はないのですか?
>>715
std::stringbuf

boost::format
std::ostringstream out;
out << hoge;
out.width(3);
out.fill('0');
out << i;
std::cout << out.str();
>716-717
ありがとうございます
class a{
private:
int** ary;
public:
int& operator [][](int n1,int n2) {
return ary[n1][n2];
}
};
のような事がしたいんですが、エラーになります。
添え字演算子を2つオーバーロードして、2次元配列のような物を作る方法はないでしょうか?
class a1 {
private:
 int* array;
public:
 int& operator[](int n) { return array[n]; }
 …
};

class a2 {
private:
 a1* array;
public:
 a1& operator[](int n) { return array[n]; }
 …
};
もしくは

class a {
private:
 int** ary;
public:
 int* operator[](int n1) {
  return ary[n1];
 }
};

で妥協するか。
722719:04/02/20 22:20
>>720-721
なるほど・・・
どうもありがとうございました。
http://pc2.2ch.net/test/read.cgi/tech/1075217631/743
こんなコードを書いたんですが、規格違反だそうです。
(http://pc2.2ch.net/test/read.cgi/tech/1075217631/744 さんの指摘)
#include <vector>以外に規格違反のところと、論拠となる規格書の
項目を教えてもらえると幸いです。結構検索かけてみたのですが
ピンと来ませんでした。お願いします。m(_ _)m
724デフォルトの名無しさん:04/02/21 15:23
変数の範囲に関する質問なんですが
ある環境でint型が-32767〜32767までの表示を持つとします。
このとき例えば400*100という計算をさせると結果はおかしくなるわけですが
複雑な計算を行っている状況において、どの段階で値の上限をオーバー
してしまったかを判定する方法はないでしょうか?

具体例として次のようなソースは文法的には間違いではないわけですが
aの値によっては計算結果に意味がなくなってしまいます。
こういう状況があるときに、最終段階になって結果がおかしいということではなく、
値の上限を超えた段階でエラーを拾いたいわけです。

int a;
cin>>a;
int b=400*a;

みなさんよろしくお願いします。
>>724
C++ でオーバーフロー検出って出来たっけな。

C# 使え。
checked ってキーワード使えばオーバーフロー時に例外投げてもらえるから。
726724:04/02/21 16:10
そうですか、C++ではこのようなことは出来ないんですね・・・

どうもありがとうございました
>>723
14.3.1(Template type arguments)の2
>>724
自分でチェックつきクラスを書くしかない。たとえば、
#include <limits>
#include <stdexcept>
#include <cstdlib>
#include <iostream>
template <typename Base> struct Checked
{
    Checked(Base b) : base(b) {}
    template <typename OtherBase>
    Checked operator*(const Checked<OtherBase> &other)
    {
        using namespace std;// absが組み込み型に対しても動作するように
        if(other.base == 0)
                return Checked(0);
        if(std::numeric_limits<Base>::max() / abs(base) > abs(other.base))
                throw std::overflow_error("nullpo");
        return Checked(base * other.base);
    }
private:
    Base base;
};
int main() try
{
    int a;
    std::cin >> a;
    Checked<int> ca(a);
    Checked<int> b = ca * Checked<int>(200);
}catch(std::exception &e)
{
    std::cout << e.what() << '\n';
}
729728:04/02/21 16:33
>if(std::numeric_limits<Base>::max() / abs(base) > abs(other.base))
不等号が逆ですた。正しくは、
if(std::numeric_limits<Base>::max() / abs(base) < abs(other.base))
移植性捨てていいならインラインアセンブラ使うのが簡単。
キャリーか
>>724
俺なら飽和演算があれば迷わず使う。移植性がどうたらと言うならインターフェースを作って。
なければ危険な演算を始める前に、オーバーフロー予測させるだろうな。
a を何倍までしていいのか? のように。
>>732
飽和演算だと結果が変わるからこの場合不適当だろ。
>>728
そこまでする必要あるの?
>>733
724がエラーを拾ってどうするつもりか考えたわけだが、
其処もとの指摘どおりか否かはあいつの返答しだいだな。
其処もと・・・
>>727
thx
738デフォルトの名無しさん:04/02/22 09:03
#include <iostream>
#include <vector>
using namespace std;

void sub( int *i )
{
 i += 100;
}
int main()
{
 vector<int> m;
 for( int i=0; i<10; i++ )
  m.push_back(i);

 vector<int>::iterator p = m.begin();
 while(p != m.end())
  {
   sub(p);
   cout << *p << " ";
   p++;
  }

 cout << endl;

 return 0;
}
739738:04/02/22 09:03
実行結果
0 1 2 3 4 5 6 7 8 9

関数sub内で、イテレータを用いて 変数を書き換えるのですが、
関数subを出ると、変数がもとの値になっています。
これって iterator の使い方間違っているのでしょうか?
コンパイラは VC++6 です。
>>739
*i += 100;
>>739

#include <iostream>
#include <vector>

void sub(std::vector<int>::iterator& i)
{
*i += 100;
}

int main()
{
std::vector<int> m;
for (int i = 0; i < 10; i++)
m.push_back(i);

std::vector<int>::iterator p = m.begin();
while(p != m.end()) {
sub(p);
std::cout << *p << " ";
p++;
}

std::cout << std::endl;
}
742738:04/02/22 09:16
イテレータについて勘違いしていました。
どうもでした。
743738:04/02/22 09:22
>>741
VC++6.0 だと 上のソースの void sub(int *i);
でコンパイルが通るのですが、.NET だとコンパイルが通らないそうなのです。
(.NET 所持者いわく)

やはり void sub(int *i); は文法的に間違っているのでしょうか?
間違ってはいないが、void sub( std::vector<int>::iterator &i );
の方がベターなのでしょうか?
連続質問ですいません。
>>743
1. 間違ってない。.NETは知らんが独自ルールがあるんではないの?
2. ベターということもない。汎用性が失われるので微妙。
以下のようなソースコードで、

void hoge(void)
{
  int In_hoge;

  {
    int In_hoge_at_scope;
  }
}

変数In_hoge_at_scopeがスタックに確保されるのはいつですか?

関数hogeが呼ばれた時点で確保されるんですか、
それとも、スコープに入った時点ですか。
>>745
> 変数In_hoge_at_scopeがスタックに確保されるのはいつですか?
一般論としては何も決まってない。そもそも、自動変数をスタックに確保する
とも決まってないし。
>>745
その識別子を使ったアクセスができるのはスコープの中だけということしか言えない。
その外における挙動は未定義。
748745:04/02/22 10:46
>>746-747

ありがとうございます。
>>743
void sub(int *i);
この部分自体は間違ってない。けど、

std::vector<int>::iterator と int* は本来は違うものなので、
std::vector<int>::iterator を受け取るつもりで int* を使うのは間違い。
int* を受け取るつもりで std::vector<int>::iterator を使うのも間違い。
たまたまVC6だと両者が同じ型なんでうまくいっているだけ。

俺ならこうするか、
 void sub(std::vector<int>::iterator i)
  { *i += 100; }
こうする。
 void sub(int& i)
  { i += 100; }
 std::vector<int>::iterator p = m.begin();
 while(p != m.end()) {
  sub(*p);
  ++p;
 }
か、std::for_eachを使うけど勉強中ならまだfor_eachは気にせんでいい。
>>743
iterator を受ける関数を作るときは、テンプレートにしておくと楽だ。
ポインタでも iterator でも動くしな。

>>744
vector の iterator はポインタの typedef とは限らないぞ。

vector の実装として、今の規格では
連続領域を取っているという保障もないんだっけかな?
でも、この規格は問題視されてて、
連続領域であることを規格で保障すべきだという意見が出てるんだっけ?
で、実際連続領域にしてない実装はないんだっけ?
と、うろ覚えで話す無責任さ。
詳しい人、間違いがあったら指摘してホスィ。
>>750
確か2003版では補遺として保証されるようになってる
>>744
std::vector<int>::iterator == int* なのが独自ルール
何のためにわざわざ iterator なのか考えたこともないからこそ後置++に何も感じないわけだな
>>750
>連続領域であることを規格で保障すべきだという意見が出てるんだっけ?

詳細きぼん
>>749
そういや、sub の実装でポインタ使う必要性ないね。
参照で十分だ。
やるね。
755744:04/02/22 10:57
>>752
あーsub側だけについて問題なしって意味で書いてたよ。
呼ぶ側がiteratorをいきなり渡すのはsubとは関係ない問題だが
そっちが主問題だったね。

ただ書き換え目的だから、subは参照で受けてiteratorは参照はずしして
渡すようにするべきかな。
>>751
ほー。最新情報ありがd。
757744:04/02/22 10:58
って749で出てたか・・
>>750
ISO14882-2003::23.2.4/1
> The elements of a vector are stored contiguously, meaning that if
> v is a vector<T, Allocator> where T is some type other than bool,
> then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

どうでもいいが meaning 以下はそこだけ見ると、例え連続領域じゃなくても
& 演算子をオーバーロードしちゃえばそういうProxy作れてしまう気がしなくもない。
そういう意味でないのはわかるんだけど。
759758:04/02/22 11:03
あー、でも operator[] に条件があるからProxyは返せないか。失敬失敬。
>>758
vector<bool> が除外されてるのは何でだろう?
>760
vector<bool>は色んな意味でママコだからね。
762738:04/02/22 11:50
>std::vector<int>::iterator と int* は本来は違うものなので、
>std::vector<int>::iterator を受け取るつもりで int* を使うのは間違い。
>int* を受け取るつもりで std::vector<int>::iterator を使うのも間違い。
>たまたまVC6だと両者が同じ型なんでうまくいっているだけ。

>std::vector<int>::iterator == int* なのが独自ルール
>何のためにわざわざ iterator なのか考えたこともないからこそ後置++に何も感じないわけだな

なるほど、小さな親切 よけいななんとやらですね。
(頼っていた私が悪いのですが)
iterator は、コンテナの中身を指す為のポインタのような感覚で使ってました。
現在のソースの書きなおしから入ります。

>std::for_eachを使うけど勉強中ならまだfor_eachは気にせんでいい。
一通りSTLの本は 読んだので存在は知っていたのですが、いかんせん名前が
思い出せなかったもので、
巡回、イテレータ、アルゴリズムなど 検索したのですが、なかなかヒットせず
一人でもがいていました。
もう質問はないです。ありがとうございました。
イテレータを受け取る関数をつくるならば
テンプレートにして受け取ればよい。
764738:04/02/22 12:02
テンプレートは まだ狙って使えるレベルではないです。
テンプレートを極めていくと ジェネリックプログラミングに通じていくのかな?

とりあえず、精進します。
>>762
sub(&*p); と呼べば一応引数がポインタの関数にも渡せるよ。
vector<int> a;

vector<int>::iterator p;
for(p = a.begin(); p < a.end(); p++) {
if(// 条件) { a.erase(p); }
}
このコードは正常に動きますか?(特にp < a.end();の部分)
>>766
// 条件

/* 条件 */
に変えれば動くと思われる。
vector<>::iteratorはRandomAccessIteratorだから、<で比較できることが保障されている筈。
>>766
vector::iterator は RandomAccessIterator なので、OK。
769768:04/02/22 15:00
ゴメンナサイ
>>767
どちらにしろ条件式がないじゃんかw
そんなところはどうでもいい。

>>766
正常に動かない。
p を a から消去した場合、p を進めてはいけない。
>>766
eraseの戻り値を使わないとまずいんじゃない?
!=でない理由もよくわからない。
>>766
てか、remove_ifしてeraseだろう
STL portにはイテレーターをあえてポインタじゃないように実装して
チェックできるようにるすマクロなかったっけ?
775766:04/02/22 16:49
>>767-768
ふむふむ。

>>770-771
なるほど、言われてみれば、理屈としておかしかったです。

>>772
eraseによって、endが1つ減って、pがインクリメントされて、
!=だと無限ループになるんじゃないか思っていたんですが、
770で指摘があったとおり、そもそも考えが間違ってました。

>>773
remove_ifを知らなかったので、検索してみたんですが、
いまいち使い方が分かりません。
単にeraseの戻り値を使うだけでは、駄目ですか?


>>775
>>773の事を含め、おまいさんはEffective STL読んだ方が良い。
今読めば収穫も多いハズ。
777766:04/02/22 17:31
>>776
3,200円は高いので、googleの検索で頑張ろうと思います。


皆様、教えていただきありがとうございました。
778773:04/02/22 17:31
>>775
Effective STLの第32項を読め。絶対に買え。
a.erase(
remove_if(a.begin(),a.end(),/*条件*/),
a.end()
);
とするのが慣用的。慣用的方法を覚えないと周りの人間は読みにくい。
…携帯でコードは書きにくいなぁ…
(´Д⊂
779766:04/02/22 17:49
>>778
絶対に買った方がいいですか・・・

前にlistでfindを使っているコードを見たことがあるんですが、
その感じだと、remove_ifはfindに近い物と見ていいですか?
766に書いたコードは、最初から削除したい対象があるわけではなく、
vectorに詰め込んだデータを、1つずづチェックして、場合によっては削除するって感じなので、
emove_ifがfindのような物だとすると、remove_ifは、不適切だと思うのですが、どうでしょう?

いずれにしても、vector関係の事をもっと勉強してきます・・・。
>>779
グダグダ言う前に remove_if の定義を調べろよ。
>>779
>vectorに詰め込んだデータを、1つずづチェックして、場合によっては削除するって感じなので、
remove_ifはまさにそのために在る。

>いずれにしても、vector関係の事をもっと勉強してきます・・・。
勉強すべきはvectorではなくて<algorithm>についてだな。
783766:04/02/22 20:56
>>782
おお、良いサイトですね。
なんとなく分かってきました。

>>780-782
vector<RECT> a;
vector<RECT>::iterator p1;
vector<RECT>::iterator p2;
for(p1=a.begin();p1!=a.end()-1;p1++){
for(p2=p1+1;p2!=a.end();p2++){
if((*p1).top==(*p2).top&&(*p1).bottom==(*p2).bottom&&(*p1).right+1==(*p2).left){
(*p1).right++;
ZeroMemory(p2,sizeof(RECT));
}
}
}
RECT rect={0,0,0,0};
a.erase(remove(a.begin(),a.end(),rect),a.end());

なんか766で考えてた方法と変わっちゃいますけど、
実際にやりたい事はこんな感じです。
removeとかの使い方、あってますよね?
>>738>>766も、STLをちゃんと使うんなら、
Effective STLは*本当に*読んでおいた方がいいよ。
無駄な努力というか、やらなくていい試行錯誤とか、
勘違いによる「大量のたまたま通ってますコード」を
書かなくてすむし。

Effective 3冊は(Moreは確かに訳に難ありだけど)
C++を使うんなら絶対に手元において頭に入れておくべき。
2chの質問系スレでも、「読めば載ってる」ネタがとても多い。

>>783
remove&eraseのところはそれでいいが…

iteratorをZeroMemoryとかに渡したらダメ(-_-#)
iteratorはポインタではない実装もあるから、渡したければ&(*p2)を渡す。
iteratorはポインタだとか抜かす奴とは縁を切った方がいいぞ。
大体ZeroMemory(p2,sizeof(RECT));のところはは先にRECT rect={0,0,0,0};を
しておいて*p2 = rect;とすればいいだろうに。

それからfor文書くなら
for(vector<RECT>::iterator p = a.begin(); p != a.end(); ++p)とせい。
できるだけ前置インクリメントを使うこと。効率が悪くなる場合がある。

つい携帯で見てられなくなった。試験前なのに…(鬱
>>783
他の人と俺の意見は違うみたいだけど、最初は無理してSTLの
アルゴリズム使わずに、自分でiteratorとforでループを回してみた方が
いいんじゃないかと。ループにも色々パターンがあることがすぐ
見えてくると思うから、そしたら for_each とか find_if 辺りから使い始めりゃいい。

# いきなり remove + erase から入るのは無謀だと思う…

// RandomAccessIterator依存
struct adj_of {
 RECT a;
 adj_of( const RECT& a ) : a(a) {}
 bool operator()( const RECT& b ) const {
  return a.top==b.top && a.bottom==b.bottom && a.right+1==b.left;
 }
};

vector<RECT>::iterator s=a.begin(), e=a.end();
while( s != e ) {
 e = remove_if( s+1.e,adj_of(*s) );
 if( s != e ) ++s;
}
a.erase( e, a.end() );
>>786
俺もそう思う
だから、まずSTLそのものを勉強しろよ
ほれ、
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
取り敢えずこれを通読しろ
WEBをあっちこっち漁るより遥かに効率がいいぞ
789784:04/02/23 02:25
>>785

効率を云々するのなら、

>>for(vector<RECT>::iterator p = a.begin(); p != a.end(); ++p)

のコードも詰めが甘い。

コンテナの内容が変わらないのなら、終了条件のa.end()は
事前に別のiteratorのインスタンスに格納してそちらと
比較すべき(>>786みたいに)。

あなたの例ではループのたびにa.end()の一時オブジェクトの
生成と削除を繰り返すことになる。
おっちゃん、ループごとの比較から追い出したいなら
const_iterator使わないとダメなんじゃないですか!?
791785:04/02/23 03:01
>>789
確かに。うっかりしてた。何かに載ってたがどこだったか…スマソ
792766:04/02/23 08:16
>>784
やはりEffective STLは読むべきですか。

>>785>>786
なるほど。

>>788
じっくり勉強してきます。


Effective STL買うなり、>>782>>788のサイト読むなりして、STLを勉強してきます。
皆様、どうもありがとうございました。
793デフォルトの名無しさん:04/02/24 00:28
クラスがオブジェクトを生成して返すにはどうしたら良いのでしょうか?

例えば

class CNumber {
 public:
  CNumber(int n = 1);
 ...
}

class CCalc {
 public:
  add(CNumber a, CNumber b) {
   return new CNumber(a.num * b.num);
  }
}

とかいう感じで、CCalcクラスのaddメンバー関数の中で
作成したオブジェクトを外で利用したいんですが
Effective C++とか読んでると、そんなの無理
とかいう気がしてくるのですが・・・
普通にインスタンスを返せばいいじゃん
>>793
なぜ無理と思うのだろう?
>>793
コピーを返しちゃだめなの?
const CNumber add(CNumber a, CNumber b)
{
return CNumber(a.num * b.num);
}
でいいと思うんだけど?それにこの形式のreturnだったら
まともなコンパイラでは「戻り値最適化」(調べてみて)が
行われてコピーのオーバーヘッドは殆どなくなるから。
生のポインタは、戻り値の受け手がdeleteする必要がでてきたり
してバグ(メモリリーク)の温床だから避けた方がいいよ。
それから、Effective C++持ってるなら恐らくあなたが読んだと
思われる項目の最後のページに正しいコードと解説が書いて
あるよ。本はもっときちんと読みましょう。というかこれが
主題の項目じゃん!
javaの経験者かな?
>795
たぶん、C++の入門書をちゃんと読んでないから
Effective C++が理解できない。
というかoperator+でいいんでは
>>798
>クラスがオブジェクトを生成して返すにはどうしたら良いのでしょうか?
ってのが質問の趣旨だし、operator+では不味かろう
800デフォルトの名無しさん:04/02/24 02:22
どのコンパイラがテンプレートにどの程度対応してるか書いてあるページありませんか?
exa) 明示的な特殊化、分割コンパイルモデル

適切にコンパイルできない具体的なソースもあると更に幸せ。
>分割コンパイルモデル

ほぼ全滅
>>802
Intel C++ 800, VC++ 7.1, GCC 3.2 以降 が成績いいね。
特に前2つ。
VC7.0から7.1でかなり強化されてるからなぁ
>>804
リリース間隔は異常に短かったのにね。
しかもアカデミックはアップグレード対象外ときたもんだ...。
>>805
ありゃ単にVC7で間に合わなかっただけだと思うが。
当初の予定ではVC7で標準C++への対応強化する予定だったらしい。
VC5 買ってすぐ VC6 が出たのでスルーしたら
物凄く長いことまたされて、
やっと出たと思って VS.net 買ったら
すぐ VS 2003 が出やがったんだよな...。
アカデミックでも無料アップグレードさせて欲しかった。
貧乏学生をあんまりいじめんといてくれ、M$ よ。
808800:04/02/24 03:47
>>801
そうなんだ・・・。
本にででーんと載ってるからそれなりに使えると思ってますた。

>>802
これってコンパイラのテンプレートとboostへの対応度を知るには便利ですけど
テンプレートのどの部分でコンパイルがひっかかったかはどうやって調べるのでしょう。
Failのあるテストを試して、boostを見るっていうステップかな?
結構大変な作業になると思うんですけど、
皆さんどうやってテンプレートの動く動かないのノウハウを蓄えてるんですか?
自分が間違ってるのか、コンパイラが対応できてないのかの指針が欲しいです。
指針は、規格を参照すれば OK 。
動く動かないは、やってみれば分かる。
とりあえずVC++7.1とC++BuilderXでテストコード走らせて通るかどうかぐらいだな。
BuilderXはPersonalですらデフォルトで2種類のコンパイラ積んでるからこういうとき
だけは楽。
>>808
Failになっているものは、テスト時に出力されたエラーメッセージが参照できます。
コンパイルエラーなら普通にファイル名と行番号がでてるから、
boostのアーカイブと照らし合わせればいいです。
照らし合わせるには、バージョン(1_31_0 or CVS HEAD)に注意したほうがいいでしょう。
(巨大なHTMLへのリンクになってるから、これもちょっと気をつけたほうが良いかもしれません。)
>>808
> 自分が間違ってるのか、コンパイラが対応できてないのかの指針が欲しいです。
とりあえず経験的にだいたい標準準拠してる(と言われている)
VC++7.1とgcc3.3、あとComeauのオンラインテスト
 http://www.comeaucomputing.com/tryitout/
あたりで試してみて、ダメだったら自分のコードを疑って規格と
にらめっこする感じ。

exportみたいな明らかに対応してない機能だと、コンパイラが
エラーメッセージで「exportは使えません」くらいは出すので
それも指針にはなる。
813デフォルトの名無しさん:04/02/24 11:52
かなりビギナーなので初歩質問になのかもしれませんが、
newしたものは、必ずdeleteしなければいけないのでしょうか???
deleteしないとバグになってしまうのでしょうか、
それとも問題なしなのでしょうか???
>>813
しないとメモリリークするからしなきゃだめ。
>>813
deleteする癖を付けといたほうがいい。
newしたときにはメモリ確保以外にもコンストラクタでなんらかの初期化が行われている可能性があり
その場合、後始末がdelete経由のデストラクタで行われるはずだから。
816デフォルトの名無しさん:04/02/24 13:04
813です。
>>814さん
>>815さん
早速の回答ありがとうございました!
基本的にnewとdeleteはセットなんですね、分かりました。
ドモ
あら?
いつもならここらへんで「スマートポインタ使えごるあ!」って
人が必ず一人は居るんだけど,今日はお留守なのかな?
818ヽ(´ー`)ノ:04/02/24 15:41
俺も思ったけど、
> newしたものは、必ずdeleteしなければいけないのでしょうか???
…が質問の肝だから、そういうレスを付けるのはどうかな、と思ってやめた。
>>818
それが正しい態度
このトリップつけたら禿げそう?→◆nrBjarne.g
                     ↓>>1-820

       (  ::::::::::::::::::::::::^:::::::::: :::::: :(
     丿::::::::::::::::::::::::::::::::::::::::::::::::::::: :::: (
     /::::::::::/ノ::::::::ノ::::::::ヽ:人::::::::::ヽ::::::::::)
     (::::::::::/  ):::ノ::::ノ ) ソ ヾ::::::::::::丶ヽ
    (:::::::::/ 彡  ノ   ノ  :: 彡:/)) :::::::)
   (::::::::::/彡彡彡彡彡   ミミミミミミミ ::::::::)
   ( :::::::// ̄ ̄ ̄ ̄ヽ===/ ̄ ̄ ̄ ̄ヽ |::::::)
    | =ロ    З  ‖ ‖  З  ロ = |
    |:/ ‖    / /ノ  ヽ \     ‖ ヽ|ヽ
    /|/  ヽ`======/  ⌒ ` ========ノ   | |
   (||         .(● ●)          |ノ
    |         : :: :::l l: ::: :::          |
    |      _:: :二 M二__::::::.. .        |
    |     : ::: : ::: ::  ===  ::: :: :: ::::     )
    \ :::   :::::::::::  ::::::::::  ::::::::::::::   /|
    /|ヽ  ヽ:::: _- ::::: ⌒:: :::::::: -_   ノ
   / || 丶\_::_:::::_:::: :::::_/:::: /
      | | \ \ ::::::::::: :::::::::: ::: :: _/
   / ̄\ 丶  ̄ ̄ ̄ ̄ ̄ ̄ ̄   
荒らしについて
掲示板上で、意味不明な言葉やアスキーアートの連続書きこみなど荒らし
行為に遭遇した場合は、その場で諌めたり挑発したりなど、むやみに対抗し
ないようにお願いします。
荒らし行為を行う人物は、利用者の反応を楽しむ愉快犯が大半ですので、
逆効果になる可能性が高いからです。
削除依頼掲示板などでご報告いただければ、削除人が削除にあたります。
冷静なる判断をお願いいたします。

削除ガイドライン
http://info.2ch.net/guide/adv.html
トリップチェンジsage
std::ostringstream hoge
int fuga = 100, piyo = 200;

hoge << "fuga " << fuga;
cout << fuga.str() << endl;

hoge << "piyo " << piyo;
cout << piyo.str() << endl;

とすると、

fuga 100
fuga 100piyo 200

となってしまいます。

これを新しいostringstreamを宣言することなく

fuga 100
piyo 200

とするにはどうすればいいですか?
825824:04/02/24 21:02
失礼

fuga.str() と piyo.str() は hoge.str()の間違いです。
hoge.str("");
純粋仮想関数( =0 とするやつ)って、何のためにあるんでしょうか?
仮想関数だけで十分な気がするんですが。
>>827
基底クラスではインターフェースのみ定義し実装は派生クラスで行う。
この場合、「この関数は派生クラスで実装が必要である」ことをはっきりさせるため。
実装を忘れたらコンパイルエラーになる。
ひとりで開発してるわけじゃないーのさ
>827
抽象クラスってわかってる???
抽象データ型ってわかってる???
>>827
デザインパターンについて勉強すると、
そのあたりの有用性が分かってくるんじゃないかな。
>>827>>828
>実装を忘れたらコンパイルエラーになる。

漏れの場合、むしろ、それがウザくて
純粋仮想関数を仮想関数に修正した経験さえある。
試しつつ実装を加えていく場合には、邪魔このうえないのだが。
>>832
PURE というマクロを定義し、
これを場合によって = 0 か { } かを切りかえれば良い。
似たようなものに、INLINE を切り換えるやつもあるね。
inline 関数をまとめたファイルを作り、
ある場合は inline にしてヘッダファイルでインクルードし、
ある場合は消して .cpp ファイルでインクルードする。
基本的には純粋仮想は設計者の自己満足用だ
>>836
実装のないスーパークラスを作るためだろ
そのために Java にはインタフェースがある

スーパークラスとサブクラスは同時に開発することが多いので
(多態性が目的のため)
設計者の自己満足というわけではない
純粋仮想がなかったとしても
それができないわけではないからな
やはり自己満足だな
「できないわけではない」は反論になってないな。
マシン語以外の言語が存在する理由と同じく、「より良くやる」ために
存在してるわけだからな。
84056:04/02/25 15:52
>>838
ちみが自己満足だと思っているのならそれでよいと思うよ。

実際、ぁぁぁなんでぃ、純粋仮想にしやがってよう、まったく自己満足だっちゅーの
といいつつ、そこを実装するわけで、そのお陰でバグが減ったり、メンテナンス性が
上がったり…することを期待してるんだが。

コンパイル通らないからといって深く考えずにヘッダー直すのはドキュと…。
>>837
>スーパークラスとサブクラスは同時に開発することが多いので

そういう時こそ、より一層ウザイのだが・・・。

スーバークラスAのサブクラスが複数あった場合を考えてみる。
とりあえず関数を追加して、ある1つのサブクラスBだけを
優先的に試行錯誤しつつ組み上げていきたかったとする。
・・・にも関わらずだ。
後回ししたいサブクラスC、サブクラスDも
ちゃんと同時進行で記述してやらないとコンパイラがごねる。

同時に3つのクラスの実装を想定して作業できるのだろうか?
多態化が目的なのであれば、仮想関数lだけでも十分と思うが。
純粋仮想関数はC++に中途半端に慌ててゴタゴタ付けた多態への
支援機能の一つで、使わなくてよい。
今の段階では「よりよい」というほどの事もない。
個人的には、まさにJavaのInterfaceのように、
基底の仮想関数は全て純粋であるべきだと思っているんだが。
>841
クラスごとにソースファイルが分かれていれば、何ら問題がないと思うのだが。
>>844
・・・まあ、確かに。
1つの出力ファイルに複数のサブクラスが必要なければね。
84656:04/02/25 16:48
>>842
>使わなくてよい。
とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ


いらんと思っているのなら使わなければヨイ。
よいと思えば使えばヨイ。


漏れはC++のそんないい加減で中途半端なところが好き。





>>846
激しく同意








>>使わなくてよい。
>とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ


>いらんと思っているのなら使わなければヨイ。
>よいと思えば使えばヨイ。

とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ
たぶん >> 842 は、「使わなくてもよい」って言いたかったんだけど、
日本語が苦手だから「使わなくてよい」って書いちゃったんだよ。
間違っただけなんだよ。あんまり責めなくてもよい。
しかし=0は不細工だよな。
purevirtualキーワードでもつくればよかったのに。
>>850
オレもそう思う
852デフォルトの名無しさん:04/02/25 18:51
>>849
そんな人心の機微が判ることがこれからの(rya
853デフォルトの名無しさん:04/02/25 18:55
>>850
同意
854デフォルトの名無しさん:04/02/25 18:58
>>846
そんなに改行しなくてよい。
>>850
同意
何もさしてない関数ポインタを
void (*pFunc)(void) = 0;
とするから、なんかそんな感じになったんだろうと勝手に推測。
>>854
同意
基本的に無能なんだよ、禿は。
無理に同意しなくてよい。
>無理に同意しなくてよい。

とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ
56は荒らしなんだから放置放置
gccでコンパイルしたオブジェクトファイルとc++のソースをg++でコンパイルすることは
できないのでしょうか。オブジェクトファルをg++でコンパイルし直せば大丈夫なんですけども。
>>861
コンパイルという用語の使い方が微妙…
ってそれはおいといて、extern "C" で本か何か調べれ。
863861:04/02/25 21:36
>>862
サンクス。コンパイルできました。
コンパイルの使い方微妙ですか。
うう、よく分かんないです。
>>862
すげぇな・・・。
俺には861がなに言ってんのかさっぱりわからんかったぞ・・・。
865デフォルトの名無しさん:04/02/25 21:50
>>862
すげーな・・・
Cの関数をC++から呼び出すには・・・と聞けば誰でも分かっただろうが。
866865:04/02/25 21:51
おっと、逆だ。
>>841
>>833
あと、適当な戻り値も指定できるといい。

#ifdef DEBUG_ABSTRACT
#define ABSTRACT { }
#define ABSTRACT(ret) { return ret; }
#else
#define ABSTRACT = 0
#define ABSTRACT(ret) = 0
#endif

開発中は DEBUG_ABSTRACT を定義して、
ちゃんとしたテストを行いたい時やリリース時には
DEBUG_ABSTRACT を定義しなければ良い。
PURE は M$ が定義してることもあるので避けた方がいいかもしれない。
>>863
コンパイル+リンク=ビルド と呼んでいるケースが多いようだが、
用語の使い方がどうのと言う論点ではこれも五十歩百歩だ、そんな煽りは気にするな。
プリプロセッサやらリンカやら各翻訳段階を何と言おうが同じことだ。
869Not 862:04/02/25 22:20
あれを煽りと受け取るとは・・・・はぁ・・・・
>>862はIQ180
>>868はIQ76
IQなんか持ち出すあたりに低い知性を感じるね。
>>871==868
必死だな。
>>870-872
(・∀・)ジサクジエーン
==なんか持ち出すあたりに低い知性を感じるね。
ということで、純粋仮想関数使う奴は馬鹿
使わない奴は変態ということでいいでつか?

レスを暮れなくても良い
純粋仮想関数は純粋な心を持った人間しか使ってはいけません。

日本では俺の他に何人使えるかなぁ。
インターフェースとその実装クラスの関係って
やっぱり template methodパターンに含まれる
のでしょうか?

インタフェースを利用してるデザインパターンは
腐る程あるけどね。
>>877
それを言ったらメソッドのオーバーライドを含む継承は皆それになってしまうのでは。
テンプレートメソッドパターンの場合、構造よりもその使われ方に着目してるんだと思う。
>>876
純粋仮想関数は純粋じゃないから君にも使える。
不純だ・・・
不純異性交友関数 f(sex)
純粋妄想関数 f(;´Д`)
class Otaku: public Mania
{
private:
famiry Oyaji;
family Mama;
family Aniki;
void Kyabakura_Girl(Yen Money);
protected:
MANIAC Anime[ ];
MANIAC Comic[ ];
friend:
MANIAC &Doushi(MANIAC collections);
public:
virtual love Maid(String Command)=0;
virtual love Imouto(void)=0;
};

このクラスを継承し、実装して僕をインスタンス化してください。







不純異性交遊 (* 女)(男) ;

死ねや 変態ども!
class C884 : public Otaku
{
public:
love Maid(String Command){ return NULL; }
love Imouto(){ return NULL; }

RESULT Work(){ return FAILED; } // 仕事
RESULT Life(){ return FAILED; } // 人生
};






delete new C884; // いらない
いずれもヘタクソ極まりないクラス設計だな
このスレはマ板の腐海の中に埋葬されました
俺は =0 という表記自体は美しいと思う。

使う目的は・・・
assert() みたいなもんかな。
DLLを作るとき純粋仮想関数使っとかないと、
コンパイラ間でアボーンするとか、俺の呼んだPDFには書いてあった。

おとなしくCOM使えって?
ごもっとも。
892デフォルトの名無しさん:04/02/26 11:15
placement newでインスタンスを作るときに初期化するにはどうしたらいいんでしょうか?

Hoge* p = new Hoge("hoge", 1);

を、placement newでやりたい。
Hoge* p = (Hoge*)malloc(sizeof (Hoge));
new(p) Hoge("hoge", 1);

...

p->~Hoge();
free(p);
new と malloc 混ぜて使うのはあまり好きじゃないな。
placement newって与えられたロケーションそのまま返せばいいだけじゃない?
>>894
単なる例なんで。
別に malloc だろうが char 配列だろうが
GlobalAlloc だろうが何でもいいんだけどね。
897デフォルトの名無しさん:04/02/26 17:08
質問です。
ストリームで、場合によってファイルと標準出力を切り替えることって
できますでしょうか。
以下(stdio)のストリーム版ですが...
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
FILE* fp;
char* filename = argv[1];

if(strcmp(filename, "-") == 0) { //"-" なら結果をstdoutへ
fp = stdout;
} else {
fp = fopen(filename, "w");
}
fprintf(fp, "Hello\n");
}

よろしくお願いします。
898デフォルトの名無しさん:04/02/26 17:11
a
ストリームの切り替えってiostream / fstream / stringstreamあたりの話か?
そりゃ基底クラスへのポインタか参照で管理してれば切り替えられるが。
900892:04/02/26 17:46
class Hoge {
public:
 Hoge() {}
 Hoge(const char* str, int i) : m_str(str), m_i(i) {}
 static void* operator new(size_t size);
private:
 const char* m_str;
 int m_i;
};

void* Hoge::operator new(size_t size)
{
 return ::operator new(size);
}

int main()
{
 Hoge* p = new Hoge;
 new(p) Hoge("hoge", 1);

 return 0;
}

コンパイルできないのですが何が足りないのでしょうか?
修行
どういうエラーかぐらい書けよ
903892:04/02/26 17:54
>>902
不適切でした。すいません。
new(p) Hoge("hoge", 1); の部分で

error C2660: 'Hoge::operator new' : 関数に2個の引数を指定できません。

と出ます。

>>901
_| ̄|○
>>900

class Hoge {
public:
  Hoge() {}
  Hoge(const char* str, int i) : m_str(str), m_i(i) {}
  static void* operator new(size_t size, void* p);
private:
  const char* m_str;
  int m_i;
};
void* Hoge::operator new(size_t size, void* p){
  return p;
}
int main() {
  Hoge* p = new Hoge;  // ← ?
  new(p) Hoge("hoge",1);
  return 0;
}
>>897

#include <iostream>
#include <fstream>

int main(int argc, char** argv) {
std::ostream* osp;
std::ofstream ofs;
char* filename = argv[1];

if(strcmp(filename, "-") == 0) { //"-" なら結果をstdoutへ
osp = &std::cout;
} else {
ofs.open(filename);
osp = &ofs;
}
(*osp) << "Hello" << std::endl;
}
>>900
そのエラーはplacement newを使うためのヘッダファイルがincludeされてないんだろうが
そもそもすでに初期化済みの領域をplacement newで再初期化するのは狂ってる
ていうかoperator newの中でメモリ確保するならplacement new使う意味ないじゃん
908892:04/02/26 20:15
>>906
つまり、placement newをオーバーロードするときは
allocatorをnewの中に用意するのが根本的な設計ミスってことでしょうか?

>>907
長々とアロケータ部分を書いてもしょうがないかなと思って省きました。
// ここで実際はアロケートする!
とかでも書いたら良かったですね。
スマソ。
>906
>900じゃないけど、そういうことかー!
#include <new>
910897:04/02/26 22:36
>>905
バッチリです。
ありがとうございます。
>>908
Hoge* p = new Hoge("hoge", 1);

じゃだめなのか?

途中で再初期化したいのなら、
一度デストラクタ呼ばないとだめだぞ。

Hoge* p = new Hoge;
p->~Hoge();
new(p) Hoge("hoge", 1);

再設定するためのメンバ関数を作った方がいいとは思うけど。
あとは一度 delete する、だな。

Hoge* p = new Hoge;
delete p;
p = new Hoge("hoge", 1);

ま、このコストを嫌がってるんだろうけど。
Bjarneの本読みながら勉強してたけど、ふと彼のHP見てみたら足を机に乗せて禿げてて偉そうだった
ちょっとやる気がなくなった。
すごい人間観だね
>>913
偉そうというよりはむしろお茶目な感じが。
>>913
お前!
ハゲをバカにすんな!
あの高橋名人だってツルッパゲだぞ!
>>913
バカヤロー!オマエだってじきに禿るんだぞーっ!!
テンプレートを使うと禿げるってホントですか?
>>918
あまり関係ないようです。
ttp://www.boost.org/people/people.htm
>>919
・・・そうか?
一般的な禿げの率がわからんことには
なんとも結論の出しようが
922 :04/02/27 02:54
データベースを管理するクラスを用意します。そのデータを参照する人(書き込みもする)
がいたとします。排他制御はデータベースクラスでやるとします。このデータベース
クラスに、データ参照用のインターフェースを作ると、そのインターフェース経由でアクセス
する人がたくさん板場合、それらの人はみな new interface して、インスタンスを持たないと
いけないのでしょうか?もっとスマートなやりかたありますか?
学校でオブジェクト指向についてしっかり教える学校が日本にあるのだろうか?最近の新人をみているとそんな感じがする。かく言う私も職場で構造体やらオブジェクト指向を覚えた口だが。

どうよ?とくに現在学生さん。大学、専門を問わずに
ま、そんな質問はスレ違いってこった。
>>922
"interface とは" というところからまずは調べてみてはいかがでしょうか。
COM とか Java とかが参考になるのかな。
なんらかのインスタンス(DBへの接続等)があって、それを元に interface を得るのが普通です。
new interface というように instance を作成するこという使い方はありません。
そういう意味で interface って言葉を
使ってるんじゃないんじゃないかな?
分からんけど。
いや、"インターフェイス経由で" とか new interface とポインタを意識したりしているあたり、
そういう意味なんじゃないかと思うんだけど・・・
なんか被ってる香具師はみんな禿
でないと俺の気が治まらん。
>>923
現在学生で大学でそれなりにやった
オブジェクト指向の概念はわりと当たり前になった
930ヽ(´ー`)ノ:04/02/27 10:52
>>923
それなりに。でも学生の何割が理解してるんだろう(笑)。
Java のクラスは使えても C の構造体やら C++ やらは使えない、
って奴が多いんじゃないかな。
要するに、考え方やメリットは理解できてない、タダ Java が使えるだけ(それも怪しいが)、と。

>>918
髪と引き換えに便利になるなら安いもんだろ。
自分でひとつクラスライブラリなりテンプレートライブラリなりを
書いてみないことには分らない気がす
>>923
大学に関して言うと、最近だいぶましになってきたけど、まだまだ不十分。

学校だと使えない奴切れないからな。
最低ラインの学生のレベルに合わせて教えないといけないし、面倒。
それに国公立だと授業へたくそな教官の首も切れないし。
そういう話題はマ板でやってくれよ〜
934デフォルトの名無しさん:04/02/27 17:01
もまいらお仕事ご苦労さまです!
質問おながいします。
C、C++のコンパイラメーカ各社(MS、Borland等)は
STLとかの標準ライブラリの実装を自前でやっているのですか?
それともC++の標準化協会みたいな所でソースを共有
していたりするのですか?
>>934
コンパイラベンダで実装は違うよ。
バージョンによってもちょこちょこ変わったりしてる。
ってゆーかおまえ釣りだろ!同じような奴を過去スレで見たぞ!
前略)10倍に!?
まぁ、STLに関してはSGI系(STLport,gcc)、Dinkumware(VC++)、Rougewave(Sun,bcc 5.5以前)
つー感じでコンパイラベンダが作ってるわけでもなかったりするが。

いちおうどれも標準化委員会に提案されたHPの実装を基にはしてるな、大抵。
>>937
前略)使っても使わない時と比べ10Kほどしか増えない。
>>939
(前略)ンクし(中略)が増え(後略)
941スメルジャコフ:04/02/27 19:58
質問です。
staticはクラスメンバ関数って何の役に立つのでしょうか?
具体例を書いている書籍を持ち合わせていないのですが。
>>941
クラスをインスタンス化していなくても呼び出せる
943デフォルトの名無しさん:04/02/27 20:06
>>941
ここは、文法を教えるとこじゃないんだよ。とっとと帰りやがれ。
本をケチる奴には教えたくないよ。
C言語のstatic関数ってなんの役にたつの?
生まれは葛飾柴又の〜
Cのstatic関数はスコープだけかな
948スメルジャコフ:04/02/27 20:14
>>943
へ、へ、へ。
まさに文法についても議論する場だと思いますがね。
リンケージ
>>941
メンバ関数でpthread_createしたい時とか
>>948
>>941はさすがに初心者スレ該当だと思うが
>>948
無粋かもしれんが「へ!へ!へ!」はスヴィドリガイロフではなかったか。
953スメルジャコフ:04/02/27 21:22
>>951
おっしゃるとおりでさ。へ、へ、へ。

>>952
それもおっしゃるとおりで。えぇ、そのとおりですとも。
ま、たいした意味は無いよ
>>941
そういう本を探すほうが困難だと思われ。
もしかして持ってる本はCOBOL?
>>955
多分、開発環境の入門書しか見てないんじゃないかな。
言語そのものの参考書は持ってないと。
957デフォルトの名無しさん:04/02/28 02:29
いまメンバ変数のポインタを返すメンバ関数を実装するとします。
ここで返すポインタの指すメンバ変数の内容は見れても良いが、いじれないようにする場合
const obj * cmyclass::get_obj()
{
   return &m_obj;
}
とやればよいのですか?

あと
obj * cmyclass::get_obj() const
とか
obj * const cmyclass::get_obj()
とかいうのも見かけます(勘違いかも)
それぞれどういう意味、使い方なのでしょうか?
教えてくださいませ。
>>957
メンバーでなく自身を基底クラスへキャストできるようにする
というのなら判るんだが。
あるいは生成して新たなインスタンスを値で返すとか。
メンバーへのポインタ返してしまったら自身のデストラクタの実行後も
参照されてる危険があるじゃんか。
>>957
その場合は参照のほうが適切な気はするがそれは置いておいて。
メンバ関数の後につくconstはそれがメンバ変数を変更しない
(+メンバ変数の非constなメンバ関数を呼ばない)ことを保証する。
非constなメンバ関数はconstな参照/ポインタからは呼び出せない。

*の後ろにつくconstは普通の変数のconstと同じだが、返り値につけても意味はないな。
MSのVSを使っています。
クラスにメンバ関数&メンバ変数を沢山詰め込むと
補完候補が多くなって使いずらいと思いました。
そこで必要なメソッドのみを純粋仮想関数のみで
記述したクラスから派生させて実装しているんですが
これって普通ですか?
961r:04/02/28 02:43
>>957
class C {
void f1() const {} // f1は、thisでさされたオブジェクトを変更しない
const int *f2() {} // f2の返すポインタでさされたオブジェクトは、変更できない
int const * f3() {} // f2とおなじ
int* const f4() {} // 返り値として使われた一時オブジェクトのポインタ値を変更できない(?) / 正直、あんまり意味のない書き方なんでやったことない
};
962r:04/02/28 02:45
>>960
動機が尋常じゃない。

まあ、実際にやってるのは「インタフェースと実装の分離」だ。
それ自体は普通。

でも、繰り返すが、動機が普通じゃない。
>>962
まあ、いいんじゃない。
これで少しは分割することを覚えればw
964デフォルトの名無しさん:04/02/28 02:51
>>958-961さん。どうもありがとう。
なるほど〜。

つまりメンバを見せたいだけなら
const obj & cmyclass::get_obj()
という書き方をするということですね。

>メンバ関数の後につくconstはそれがメンバ変数を変更しない
obj * cmyclass::get_obj() const
{
  m_obj = 1;
  return &m_obj;
}
とやったらコンパイルエラーがでるという意味ですね。

無視してたけどすんごい意味があったんだな。



書籍について質問してもよろしいでしょうか。

(0)C++についてそう初心者でもないと思うのですが、
「Essetial C++」は買って得をしますか?

(1)コンパイラ作成者ではありませんが、
「Inside the C++ Object Model」は必要となることが
ありますか?

(2)今からARMとD&Rを買って読む価値はありますか?

(3)「C++ Templates」は読むと衝撃を受けますか?

アマゾンの書評を読んでもパッとしませんでした。
以上、いずれか1つでも、お暇があれば主観的な
意見でもお願いします。
>>965
あえてこちらに書いたのかもしれんが、
書籍専門スレがある。
http://pc2.2ch.net/test/read.cgi/tech/1076851442/
>>965
(0) 1行目に情報量がないので判断できん
 自称・中級者というのはほとんど当てにならん
 何か客観的な内容を示せ

(2)(3) あんたを知らんから判断できん
 知らないで無責任な発言をすればいいのなら,「人によりけり」
スレ汚し申し訳ありませんでした。
書籍専門スレに逝って参ります。
続いてはこちらのトリビアです。

「ANSIで売られているISO/IEC 14882:1998(C++国際規格)の
規格書のPDFの2ページ目の下の空白には

『(C)ISO/IEC 1998
All rights reserved. Unless otherwise specified, no part of
this publication may be reproduced or utilized in any form or
by any means, electronic or mechanical, including
photocopying and microfilm, without permission in writing
from the publisher.
ISO/IEC Copyright Office Case postale 56 CH-1211 Geneve 20 Switzerland
Printed in Switzerland』
の文字列が隠れている。」

これ何へぇ〜?
>>965
(3)だけど、一応英語版について書いておく。
結論から言うとそんなに衝撃的な内容ではない。C++の文法から
逸脱しているわけではもちろなないし、Lokiのような高度な内容でも
ない。

ただ、「templateでもっといろんな事がしたい」という中級者の悩み
をかなり解決してくれるものではある。デザインパターンへの応用
編もある。スマートポインタ自作編もある。

むしろtemplateの初心者に読んでもらいたい内容。どの解説書を
読んでも関数templateやクラスtemplateの簡単な例題に触れて
終わり、というパターンで前進のない人には格好の本だ。
マルチうぜ〜
C++は駄本と良本がはっきり分れているので迷う要素などなにひとつない。
本を買うか迷うようなやつは所詮その程度。

>>980
スレ立てよろしこ
しかし、「Inside the C++ Object Model」みたいな薄い本を
読んで何を知りたいのか、俺はそちらの方が興味ある。
面倒臭がり屋さんがしばしば、
「すぐにわかる○○」、「○日でマスターする○○」などの、
端折った本を買う訳だが、C・C++に関する限り、
分厚い本を買うべきだな。端折りようがないだろ?<C・C++
あの本読むぐらいならコンパイラのアセンブリ言語出力を
解読する方がよっぽどためになるような。
書店に行ってもそういうしょぼい本ばっかで、専門書が全然売ってないのはどういうこと?
K&Rさえも売ってない。
>>976
定番なら手にとって確認する必要もないので通販でいいんでない?
>>976
田舎なんだろ?諦めろ( ´,_ゝ`)プッ



_| ̄|○ オレモナー
>>970,973
レスありがとうございました。参考に
させていただきたいと思います。
>>969
本当だ!!!
>>973>>979
「Inside the C++ Object Model」はそんなに薄くないぞ。英語版
で304ページもある。内容は、クラス、仮想関数付きのクラス、
多重継承をしたクラスなどのvptrやメンバのメモリ内での配列
の仕方が詳しく説明されている。

それからCtor、Dtorの意味論や詳細な使い方の章もあるな。
全体的にこの本にはCtor、Dtorに関する章が多いな。だから
そちら方面の知識がまだ曖昧模糊としている人にお勧め。

(1)のEssential C++はC++に初めて触れる人がC++ 3rdや
C++ Primer 3rdの分厚さにびびってしまった時の定番本。いず
れはそれらの本も読まなければいけないが、手っ取り早くC++
を使えるようになりたい人へお勧めの本だ。ベストセラーの
「独習C++ 3rd」に近い内容。
禿ストラップの本の6.4のサンプルプログラムがコンパイル通らん。
あの禿野郎・・・
>>982
アレは禿げてる人にしかコンパイル出来ないらしいよ。
>>982
「6.4コメントとインデント」?どこにサンプルが?

次スレおねだりage
985某スレ:04/02/29 01:15
ネタスレ立てるくらいならこのスレの次スレを立てるべきだったか・・・
986某スレ:04/02/29 01:16
某スレの1と書くつもりが
987某スレの1:04/02/29 01:26
埋めてみる。
埋め立てage
>>1
991990:04/02/29 12:51
_| ̄|○
992デフォルトの名無しさん:04/02/29 12:51
>>991
素で間違えたのか
>>992
このスレ用に出した書き込みウィンドウ消し忘れてた ̄|_|○
994デフォルトの名無しさん:04/02/29 13:10
記念カキコ v(^-^*)
埋め
埋め
埋めとこう
ダ
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。