C++相談室 part14

このエントリーをはてなブックマークに追加
この時間に見てらっしゃる方>> 562を看ていただけませんでしょうか
>>578
「cin >> num」 は num じゃなくて cin を返すわけだ。
あとはわかるだろ?
>>578
std::cin >> num はEOFもしくはエラーを検出したらfalseを返す。
それを念頭においておけば簡単。
template<typename T>void typeof(T t){
typedef T TYPE;
}
このTYPEにアクセスできたら・・・
>>562
・コンパイラは何なのかは必ず書けい。
・#include< iostream.h> よりは
  #include <iostream>
  using namespace std;
 にしておこう。
・↑と、return0; を return 0; に直したら VC++7 と bcc5.51 と gcc3.2 では
 何回数字を入力しても終わらないようにちゃんとなったが。

>>579
cin はエラーが発生してなければtrue扱いになるように
キャスト演算子が定義されてるわけだが。
>>581
引数とTYPEに結合がなく戻りがvoidじゃ無理だろうな
object* dup(object* org)
{
if(mona* p = dynamic_cast<mona*>(org))
{
return p->create();
}
else if(giko* p = dynamic_cast<giko*>(org))
{
return p->create();
}
else if(zonu* p = dynamic_cast<zonu*>(org))
{
return p->create();
}
else if(baya* p = dynamic_cast<baya*>(org))
{
/*
  ■■ ■■ ■ ■ ■■
  ■■ ■■ ■ ■ ■■■■■■■■
 ■■ ■■ ■■■■■■■■
■■ ■■ ■■■■■■ ■■ ■■
■■ ■■ ■■■■■■ ■■ ■■
■■ ■■ ■■ ■■
*/
return p->create();
}
else
{
return 0;
}
}
>>578
マルチがうざいので答えもマルチしてやる。

C++のストリームは一度eofbitが立ってしまうと、明示的にクリアしてやらないと
元に戻らない。下のプログラムのようにしたらどうか。

#include <iostream>
int main()
{
int num;
do {
while (std::cin >> num)
{
}
std::cin.clear();
} while (std::cin >> num);
}
586579:03/01/14 23:56
>>582
漏れが何か間違った事書いたかい?
operator>> が bool を返すとか言わないよな?
寝るぞ
>>586
operator>>をcinの文脈で使えばcinが返るが、ブール式中で使うと
operator *() が適用されてtrueかfalseを返す。
ソース:C++標準ライブラリ、P573、§13.4.3
スマソ。operator ()ね。
operator *()なんてのは無い。
>>588
>>operator *()
ヴォケ
>>585
見せて頂きました、おなじかたなのでしょうか、こちらでは見てのとおりの対応を受けております…
返答を頂、うれしかったです
>>589
>operator ()
ヴォケ
double faultぢゃstupid!
>>592
あの・・・・・そしたら、C++標準ライブラリP573、§13.4.3に書いてある事は
デタラメって事でしょうか?真面目に質問します。
594582:03/01/15 00:17
>>588
operator void* () ではなかったっけか。

>>593
その本読んだことはないが、 本当に operator() と書いてあるなら
誤植か何か。 if( cin ) ... とは書けても if( cin() ) は無理っしょ?
>>594
あっその通りです!operator void* ()と書いてあります。
勝手に書き換えてしまってすみません。
>>595
え?
operator bool じゃないのか?
>>596
これは多分ストリームの変換演算子なんですね。
C++第3版で言うと、P706、§21.3.3に書いてあります。
operator bool()は整数に変換されてしまうので、
boolの文脈のみを許可したい場合にはoperator void*()を使うことがある。
>>593
これだ. . . 自分で確かめも考えもせずに何を撒き散らしてやがる
while(cin>> num)のどこがどんな根拠でどのようにoperator()の呼び出しになるのか書いてみろや
600デフォルトの名無しさん :03/01/15 00:32
f(char * x)関数を呼び出すときは
f(y)の引数yの型は何にすれば良いですか?
>>597
実験したら、そのようだ。

けど、何でそうなってるんだ?
if() の中では operator bool が真っ先に呼ばれるのに、operator bool を実装
してない理由がわからない。
602601:03/01/15 00:34
>>598 を読んで納得しますた。
>>587
だめ
>>600
char* 型以外の何で呼びたい?
今度こそ寝るぞ
606デフォルトの名無しさん:03/01/15 00:40
>>604
yをchar*型にしても、
xの値がyに反映されないのですが、どうしてでしょう?
>>605
まだ
"operator void*() reason"でgoogleで検索したら、たくさんヒットした。
何か的確な理由がないかどうか探している。
>>606
引数が参照渡しではなく値渡しだから。
f(int x) に int y を渡して、y を変更できると思うか?
>>610
今そのリンク読んでみました。
なるほど、void*なら、ポインタの演算ができませんから、使われる場所を
限定する効果があるのですね。
ありがとうございました。
612デフォルトの名無しさん:03/01/15 04:03
テンプレートの型引数で int を受け取った時に
unsigned int になるような型って取れないですか?

template <typename T> class Hoge{
 typedef unsigned T UnsignedType;
};
ではダメみたい(VC++6)なのですが。
templete の < > が不等号の記号と間違われてコンパイルエラーが出ることがあるんだけど
どういう場合に出るんだっけ?
<>まわりの空白の有無で回避できるんだけど。
614デフォルトの名無しさん:03/01/15 06:08
>612

template <typename T> class Hoge{
unsigned int UnsignedType;
public:
Hoge(T x){
if(typeid(T) == typeid(int)){
UnsignedType=static_cast<unsigned int>(x);
}
}
};

こんな感じでいいんじゃない?
615デフォルトの名無しさん:03/01/15 06:34
template <int> class Hoge{
 typedef unsigned int UnsignedType;
};
特殊化スレ
616デフォルトの名無しさん:03/01/15 14:15
メモリリークを見つけるツールとかってあるのでしょうか?
Visual C++.NETを持っているのですが、そのデバッガの使い方は
まったくわかりません。
もしデバッガでできるのでしたら、その方法を教えてください。

よろしくお願いします。
DEBUG_NEW
BoundsChecker とか。
C++Builder買ってCodeGuard使え!最強だぞ。
620デフォルトの名無しさん:03/01/15 16:53
cout.flush()ってたとえば↓のような場合、どういう役に立っているのですか?

例:
cout<<"test\n";
cout.flush();
621山崎渉:03/01/15 17:43
(^^)
622C++厨:03/01/15 19:36
>>620

streamのflushれす
MSDNでも見ればわかるよ
>>620
バッファのフラッシュ(書き出しみたいなモン)たとえば
cout<<"test\n";
cout.flush();
BugFunc();
とあって、 BugFunc() の実行でプログラムが落ちても
test
は出力される。
624デフォルトの名無しさん:03/01/15 20:49
>622-623
親切丁寧な解説Thanxd
理解できました。
MSDN読んでも判んなかった物で…
>>623
普通は '\n' がきた時点で flush されるから、
その例だと cout.flush(); あってもなくても変わらなくない?
>>625
> '\n' がきた時点で flush される
そいつぁ初耳
>>626
きっとstdioが下請けになってるとでも思い込んでテストもしてないんだろ
628デフォルトの名無しさん:03/01/15 22:31
ダイアログのピクチャーボックスに描かれた絵をウインドウを閉じたり、縮小しても消えないようにしたいです。BITMAPINFOHEADERやStretchDIBitsを使えばいいのかなとおもうのですけど、やり方がいまいちわかりません・・教えてください。
私が足したプログラムは次のだけです。
void CMy00000View::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

int x, y;

CWnd* h = GetDlgItem(IDC_FIGURE);
CRect r;
h->GetClientRect(r);
CDC* pDC=h->GetDC();
x = r.right/2;
y = r.bottom/2;
CPen p(PS_SOLID, 1, RGB(255, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(0, y); pDC->LineTo(2*x, y);
pDC->MoveTo(x,0); pDC->LineTo(x, 2*y);
pDC->SelectObject(oldp);
h->ReleaseDC(pDC);
マルチ
(・A・)イクナイ!
630デフォルトの名無しさん:03/01/15 22:46
Comeau C++ってコンパイラ使ってる人います?
C++→Cのトランスレータ機能があるっぽいんですが、実際のところ
どんな感じで出力されるんでしょうか?
もしくはほかに現在入手できるC++→Cのトランスレータってあります?

・・・ってスレ違い?
例外や継承はどう実装するんだ?
632とけますか?:03/01/16 13:48
下記のコードで、標準出力に Giko の所持金が正しく表示されるように、
クラス Human を修正せよ。
クラス Giko および main() 内部を変更してはいけない。

#include <iostream>

class Human {
public:
int getMoney() { return 10000; }
};

class Giko : public Human {
public:
int getMoney() { return 10; }
};

int main() {
Human* usual = new Human();
Human* giko = new Giko();

cout << " usual : " << usual->getMoney() << endl;
cout << " giko : " << giko->getMoney() << endl;

delete usual;
delete giko;

return 0;
}
>>632
宿題スレいけよボケ
二度と来るな。
634632:03/01/16 14:06
いきました。
どうもどうも。
635デフォルトの名無しさん:03/01/16 15:32
632ではないが

class Human {
 virtual int getMoney() ;
};

class Giko : public Human {
 int getMoney() ;
};

のようなときに派生クラスのgetMoney()はvirtualつけなくていいけど
派生クラスだけ見たときに仮想関数かわかりにくいのとコピペで書くから
virtual つけちゃうんだけど、これってよくないの? vtable とか大きく
なったりする?
>>635
親クラスのgetMoneyがvirtualなんだから自動的にGikoのもvirtualになる。
vtableのサイズは変わらん。
お作法的にはvirtual付けるべき。
637635:03/01/16 17:53
>>636
どーも、
>vtableのサイズは変わらん。
パフォーマンス的には変わらないんですね?
>お作法的にはvirtual付けるべき。
これからもコピペでつけ続けます。アリガトーゴザイスマタ
638デフォルトの名無しさん:03/01/16 19:58
int *d = new int[size];
として
delete [] d;
とするとエラーが出てしまいます。
何が原因でしょう?

>>638
1. 途中で、d の値が書き換わってる
2. d で確保された領域の前後が書き換えられている
のいずれかだと思われ。
おそらく、2. の方。
640デフォルトの名無しさん:03/01/16 23:02
char m_IdNumber[10][20];
の中に文字列を代入し、

void A(char*)のパラメータに渡すにはどうすればいいんでしょうか?
A(m_IdNumber)とするとエラーになります。
よろしくお願いします。
>>640
A((char*)m_IdNumber);
期待した動作になるかどうかはわからんが。
>>640
やりたいことを小一時間考えなおして、もう一度きちんと書け。
643デフォルトの名無しさん:03/01/17 01:46
auto_ptrをlistやmapの要素にすると、
insertでコンパイルエラーになるのですが、そういうもの?
>>643
だからあれほどauto_ptrをコンテナの要素に使うなと……
詳しい理由はそこらじゅうに書きまくられていることなので省略。
>>643
Effective STLの第8項を読むよろし。
646C++厨:03/01/17 14:41
>>640
A(m_IdNumber[0]);とかじゃなくて?
647デフォルトの名無しさん:03/01/17 15:18
最近暇になったので久々にC++に触ろうと思います。
が、最後に触ったのが1995〜1996あたりなので、
すっかり浦島状態です。

んで、どんな拡張がされてきたか解説してあるサイトがあったらおせーて
とりあえずTCPLの第3版が出てるから、
それを読んでみるのがいいと思う。
649デフォルトの名無しさん:03/01/17 22:55
すみませんただの興味なんですが、

typename* data = new typename[3, 4];

とかすると何が起こってるんでしょうか。
650デフォルトの名無しさん:03/01/17 22:59
new typename[4];
と同じ
予約語?
カンマ演算子やね
653デフォルトの名無しさん:03/01/17 23:03
>>650
サンクス。
じゃあ初めの引数は何のために書けるようにしてるんですか?
654デフォルトの名無しさん:03/01/17 23:06
>>652
理解しました。というか変数宣言とかでも普通に使うモノでしたね。
なんか変わった所に使うと分からなくなってしまう。
655デフォルトの名無しさん:03/01/17 23:09
コンストラクタの初期設定子で配列の要素が初期化できないのは
C++構文の仕様のためなんですか?
wara::wara() : morara[0](mona), morara[1](giko), morara[2](zonu)
{
}
とかなってたとして
wara::moraraのサイズをどう管理する罠??
657デフォルトの名無しさん:03/01/17 23:36
>>656
ちょっと分からないんですが、安全のためできないようにしているという
ことでしょうか。
int morara[3]のようにサイズ指定していても無理なんですか。
いや初心者で申し訳ないですが。
3を2にしたり10000にしたり
お客さんの注文ってのはぐちぐち(板違いすまそ
659i = 10 + 20 + 30;:03/01/17 23:46
i = 10 + 20 + 30; は、一般のコンピウタでは、
(イ)、(炉) のどちらになるのでつか?

(イ) i = ( 10 + 20 ) + 30;

(炉) i = 10 + ( 20 + 30 );
660 :03/01/17 23:49
教えてください

C++でsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。
ここにもか。
>>659
一般のコンピュウタかどうかじゃなくて、
その文を解釈するルールに依存する。

>>660
glibc
>>660
マルチはやめれ!
>>655
結論から言うと無い。が、漏れも欲しい。
Hoge::Hoge():m_array({1, 2, 3}){ }
って書けたら便利なのに。
>>659
ここはC++スレであるからその文がC++であると仮定すると、必ず (イ)になる。

>>664
同意。C99には (int[]){1,2,3} みたいに配列リテラルを作れる機能が
ついたのでいずれC++にも流れてくると思うけど、より一層文法が
酷いことになりそうなのが少し怖い。
C99ってあいまいなところを整えた反面、
妙な文法を変に導入されてるのが怖いよ・・・
つかgcc3がc99をデフォにしてるのってどうなのかなあ
例外処理を最近触り始めたのですが、
アセンブラコードを吐かせたらとても悲しいコードになってました。
こういうものなのでしょうか。
>>667
処理系によって異なる。
669デフォルトの名無しさん:03/01/18 02:36
ものすごく簡単なのかもしれませんが
コンソール出力で小数を出力する場合に、
特定の桁で四捨五入して出力させることはできませんか?
d = 0.12345 とあったとして、coutで
0.123と表示したいのですが。
670デフォルトの名無しさん:03/01/18 02:52
表示する小数点以下の桁数をしてやればよいです
671デフォルトの名無しさん:03/01/18 02:56
std::cout.precision(3);
って感じに。たぶん。
LPCTSTR str[] = {"aaa","bbb"};
この配列の要素の数を返す関数を教えて下さい。
この場合だと、1か2を返す関数です。
>>672
関数でなくても
sizeof(str) / sizeof(str[0]); でいいのでは。
あ、だめかもしれん。スマソ。
LPCTSTRってのがchar*のtypedefなら、
sizeof(str) / sizeof(str[0]); で行けるよ。
できました。
sizeof(str) / sizeof(str[0]); で、要素の数の2が得られました。
しかし、理由が分かりません。
解説キボンヌ。
あ、わかりまそた。ありまん。
>>676
(1).sizeof(str)で、str[]全体のサイズがわかる。
(2).sizeof(str[0])で、str[]の要素一個当たりのサイズがわかる。
(1)を(2)で割れば、str[]の中にある要素の個数が求まる。
#define ELEMOF(array) (sizeof (array) / sizeof *(array))
とかすると便利でつ。

全体のサイズを各要素のサイズで割れば要素数が得られるというわけです。

ELEMOF にポインタを入れると破綻することに注意。
>>674が気になる。
Unicodeとかでも関係ないよね?
>>680
関係ないというか、ポインタの配列なんで完全に無関係。

でも、もちろん文字列バッファの長さを返すこともできるわけで、
その場合 MBCS でも Unicode でもちゃんと要素数を返してくれる。
だから、TCHAR buf[128]; とか使ってるときに
sizeof buf とかで要素数を得ようとしちゃダメなのね。
>>680
だめな事はあるのだろうか?
例えばchar str[][5] = {"abc", "defg"}; のような場合でも、
sizeof(str) / sizeof(str[0])) で行けるはずだ。
きめうちで良いじゃん。それが嫌ならCなんかやめれ。
>>683
マジックナンバー厨は(・∀・)カエレ!!
しかたないじゃん。Cがヘボいんだから。
#define ARGOF(s) (sizeof(s)/sizeof(*(s)))
俺は↑だけど、
struct {
char buf[256] ;
int i[5] ;
} TEST, test[10] ;
ARGOF(test);
ARGOF(test[0].buf); /* ARGOF(test->buf) */
ARGOF(test[0].i); / *ARGOF(test->i) */
でも、ちゃんと配列の数を取れるYO!
>>682 ポインタじゃなくてもそうやるんだね。
今コンパイルしてそれで出来ました。ありまん。
688デフォルトの名無しさん:03/01/18 08:44
int sw;
scanf("%d\n",&sw);
printf("読み込み完了\n");
というコードなのに2回数字を読み込まないと
”読み込み完了”が表示されません。
なぜなんでしょう?
fflush(stdout);をprintfの後にいれてみて
690638:03/01/18 09:26
>>639
確保された領域と前後に関係ありますか?
どういうこと?
通常、new/mallocで確保される領域は
返されるポインタの直前に、サイズと次の領域へのポインタを持っている(実装依存)。
ここが壊れるとdelete/freeが異常終了する。
>>690
639じゃないが
メモリ領域を確保するとき、メモリ領域の前後に
管理用のデータを入れている処理系もある
これが壊れると管理もぐちゃぐちゃになってエラーがおきる場合もあるだろう
たとえば
[アロケートサイズ][アロケート領域] を確保して、new が アロケート領域を
返すとき[アロケートサイズ]が狂えばどうなるか…ということ

639じゃないから違うかもしれないが
693デフォルトの名無しさん:03/01/18 09:41
>>688
scanf("%d\n", &sw)の\nは"入力ストリーム中の次の空白でない文字とマッチ
するもの"なのです。従って、"2回数字を読み込まないと"ではなく、"1回
数字を読み込み、空白でない文字と\nをマッチさせる"ということになりま
す。わかりましたか?
694638:03/01/18 09:41
>>691,692
なるほど。
でも692で言うところのアロケート領域(よく分からないけど・・・)
の破壊を防ぐ方法ってあるんですか?
695638:03/01/18 09:47
>>694
アロケート領域のところはアロケートサイズの間違いでした。
>>694
コードをちゃんと書くこと
int *d = new int[size];
d++; // ←こういうの!
delete [] d;
のようなタココードにならないように
697638:03/01/18 10:05
>>696
d++はないようで、
何が原因なのか分かりません。
他に可能性としてどういうのがありますか?
>>679
どこで見たか忘れたけど、配列だけに適用される (つまりポインタに
適用するとエラーになる) サイズ取得関数
template<class T, int N>
inline int ARRAY_SIZE( T (&)[N] )
{
return N;
}
ただし、VC++ では使えない。
>>697
dより前(後)にmalloc/newされたメモリ領域へのアクセスでのバッファオーバーラン。
誤ったポインタ演算。
>>697
int *d = new int[size];
int giko[1];
giko[1]=0; // ←こういうのは?
delete [] d;
>>700
それと似たようなことに一度遭遇したことがあるよ
自分書いたコードが原因じゃなかったから死ぬほど焦った
702C++厨:03/01/18 15:20
おい、皆さん
例外安全をどう思われますか?
>>702
重要と思われます。
704669:03/01/18 16:00
>>670 671 さんありがとうございます。
その応用で出力先をファイルにしたいと思い
ofstream fout
でファイルに書き込もうとしたのですが桁数がどうしてもしていできません。
ソースは

string a;
double d;
string g;

fout << a;
fout.precision(3);
fout << d;
fout << g << endl;
という感じで書いています。
つまり一行にstringと桁数指定したdoubleを書き込みたいのです。
このまま実行すると書き込みはしてくれるのですが桁数が指定できません。
どこがちがうのでしょうか?よろしくお願いします。
705デフォルトの名無しさん:03/01/18 16:27
>>704
<iomanip> ヘッダファイルと setw と setprecision を調べてみれ。
706デフォルトの名無しさん:03/01/18 16:53
int *pp
と、ポインタの宣言をしてその後値を代入すると
値が割り当てられていないローカルな変数 'pp' に対して参照が行われました。
とエラーが出てしまうのはなぜ?
template<typename T> struct C1 {
  void operator = (T) { }
};

template<typename T> struct C2: public C1<const T *>{
  // wow!
  // void operator = (const T * a) {
  //   C1<const T *>::operator = (a);
  // }
};

int main(int ac, const char *av[]) {
  C2<char> c;
  c = "foo"; // <-!!??
  return 0;
}

C2::operator = () を定義してやらないと "!!??" の部分で
コンパイルエラーになるのが悔しくて悔しくてアタシ夜も眠れません。
エラーメッセージはこんな感じ ( g++ 3.2 )

> no match for `C2<char>& = const char[4]' operator

g++ も VC++ も同様なのでコンパイラのバグじゃないと思うんだけど
これはれっきとした仕様でしょうか?
>>706
int *pp;
*pp = 2;

とかやってませんか? pp は「数値の入れ物のありか」を指すだけで
実際にはどこにも「入れ物」は存在していません。

int i; // <- 数値の入れ物
int *pp; // <- 入れ物のありかを示すもの
pp = &i; // <- ありかを示す
*pp = 2; // <- ok.
>>707
仕様だな。

http://www.kuzbass.ru/docs/isocpp/over.html#over.ass
> Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user,
> a base class assignment operator is always hidden by the copy assignment operator of the derived class.
710709:03/01/18 17:24
>>707
template<typename T> struct C2: public C1<const T *>{
  using C1<const T *>::operator =;
};

定義しなくてもusing宣言でいける。
これで眠れるか?
711709:03/01/18 17:28
アァ、
using したら、

struct B { void operator = ( int ); };
struct D : B { using B::operator =; };
void f()
{
  D d;
  B b;
  d = b;
}

これが通っちまう。
定義するしかないやも知れぬ。
712デフォルトの名無しさん:03/01/18 17:41
error LNK2001: 外部シンボル ""int __cdecl LeastSquare_GA
(double *,unsigned int *,unsigned int *,unsigned int *,unsigned int *,int)"
(?LeastSquare_GA@@YAHPANPAI111H@Z)" は未解決です
というエラーはどうすればよいですか?
何が未解決なのでしょうか?
>>712
LeastSquare_GA とかいう名前の関数のありかが未解決。

宣言だけ書いて定義を書き忘れてるとか、定義を書いたファイルを
コンパイルし忘れてるとか、定義の入ったライブラリをリンクし忘れてるとか、
だろう。
>>709-711
サンクスコヽ(´ー`)ノサンクスコ
今日はいい夢が観られそうです。
・コンストラクタ
・デストラクタ
・代入演算子関数
・friend属性
は継承されません。
716デフォルトの名無しさん:03/01/18 18:24
>>713
コンパイルもしてるし、
extern宣言もしてるのにダメです。
他に何が原因なのでしょう?
>>716
extern C とかかな。

その関数は自分が作ったもの?
718709:03/01/18 19:33
>>715
継承の問題じゃなくて、派生クラスで暗黙に定義される operator= が
基底クラスのやつを隠してしまうという話。
719718:03/01/18 19:34
スマソ。718 は 709 じゃない。「709じゃないが…」と入力しようとして
手がすべった (w
>>718
なるほどそういう事か。
物の本には、デフォルトの代入演算子が基本クラスの代入演算子を「隠す」
という表現の代わりに、「継承されない」という表現を使っているが、同じ意味
なのだな。
operator=をvirtualにする意味ってありますか?
mem_funの存在理由がマジわからん。
なんでこんなものが必要なんだ?
最初の目的は、メンバ関数の呼び出しをカプセル化して、
リストのforeachに適用するためのもんだと思った。
>>722
仮想関数をアルゴリズムに渡す時にないとマズイ。
>>721
あまりない。どうせ=演算子は継承されないから、再定義が必要だし。
>>722
class Timer {
 vector<EventHandler*> handlers;
 void on_timer() {
  std::for_each( handlers.begin(), handlers.end(), mem_fun(&EventHander::fire) );
 }
};

とかなんとか。
>>724
あと関数オブジェクトにしておかないと、not1 みたいな関数アダプタが
使えんし。
728デフォルトの名無しさん:03/01/19 13:40
質問でーす。
テンプレートクラス A があって、
unsigned char と signed char で特殊化している時に
A<char> と書いたら unsigned char 版にも signed char 版にもならずに
特殊化していない方で展開されるのは仕様でしょうか?
仕様
>>728
仕様だと思うよ。ちなみに配列にした場合その要素数が異なると
異なる型とみなされます。これは関数オーバーロード(このときは
char*とみなされる)とは違ってくるので注意が必要かも。
って俺だけか。。
731729:03/01/19 13:49
理由:char, signed char, unsigned char はそれぞれ別の型だから
signed char と unsigned char と char は別の型ということですかね?
733C++厨:03/01/19 13:54
>>722
Effective STLにmem_fun, mem_fun_refの使い方が載ってますよ

# 余談ですがこの本(ESTL)を読んでいる時は日曜洋画劇場でファントムという
# よくわからない映画をやっている時でした。
734728:03/01/19 14:14
>>729, 730
char は別の型なんですね…知らなかった。
てっきり signed char か unsigned char の別名だと思ってました。
(どっちの別名なのかが環境依存なだけだと思ってました。)

別の型ならどっちにもかからないのが正常ですね。I Understood.
ありがとうございました。
mem_fnはもうboostのを標準にしてもいいんじゃないかな
モスバーガーでやってる
tea plus plus(お茶にもう一品)
はC++のもじりなのではないかと小一時間…(略

ガイシュツだったらスマソ
昔のライブラリを引っ張り出して使おうとしたら新しいコンパイラになってて(borland の5.5)
さっぱりわかならい。

basic_ostreamなんちゃらってなんなんだ……例をコピペしてもうまくいかないし。
<<のオーバーロードって、テンプレートつかってるときは駄目なんでつか?
>>734
> てっきり signed char か unsigned char の別名だと思ってました。

C++ でなくて C ならば、その認識で合ってるよ。
え?
740デフォルトの名無しさん:03/01/20 14:29
憂鬱本のC++コードってかなり糞だよな?
741デフォルトの名無しさん:03/01/20 18:30
デバッグ用にcout使ってDOS窓に文字列出力してるんだけど、
文字の色を変えることって出来ないの?

環境によって違う??
VC6です。
742C++厨:03/01/20 18:45
#include <conio.h>
textcolor(YELLOW);
cprintf("まんこ\r\n");

前bccで遊んだときはこうですた
>>740
あれはC++の本ではないので深く考えてはいけません。
744デフォルトの名無しさん:03/01/20 20:31
//---------------------------------------------------------------------------

#include <conio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
textcolor(YELLOW);
cprintf("YELLOW\r\n");
return 0;
}
//---------------------------------------------------------------------------
745741:03/01/21 10:34
それはネットで検索してすぐみつかったからやったんだけど
textcolorが宣言されてないって言われるよ。
conio.hの中もみたけど無かった。

コンパイラは何ですか?>>744
746デフォルトの名無しさん:03/01/21 10:54
ifstream input(INPUTFILE);
input >> fftData.in[i];

みたいな感じで、標準入出力してるソースがあるんですけど、
inてのはメソッドでしょうか演算子でしょうか。
受けてるメソッドが見あたらないんですが、
クラスに対して標準入力されたときの動作を教えて下さい。
fftData オブジェクトのクラスの定義を見なさい。
748デフォルトの名無しさん:03/01/21 11:29
>>746
なんか勘違いしてる気がする
in[] ならともかく、in がメソッドではないのは明らかだろう。
>>746
fftDataの中身は知らんが、
in[]はfftDataのクラスなり構造体なりのメンバ変数。
メソッドなら()とかつくし、少なくともそんな名前の演算子は俺は知らん。
あと、標準入力じゃなくて入力ファイルストリームからの入力。
inがなにがしかのコンパイラ拡張のプロパティという可能性はありうるな。
この場合のinの実体はメソッドだ。
struct {
 class {
  int data[10];
  public:
  int& operator [](int n) {
   if (n < 0 || (sizeof(data)/sizeof(data[0])) <= n) {
    throw なんちゃら_error();
   }
   return data[n];
  }
 } in;
} fftData;
753746:03/01/21 15:01
thanx>>752
でも、operatorの文字は無いみたい。

http://sourceforge.net/project/showfiles.php?group_id=51043&release_id=134725
から拾いますた。
fftDataは、inていう実数の配列を持っとるわけだが。
755746:03/01/21 18:48
>>754
あ、本当ですね。有難うございました。

なんか、inという名前と標準入力で混乱してました。
756デフォルトの名無しさん:03/01/21 20:27
今さ、ふっと
「テンプレート使えば Power(べき乗)をコンパイル時に計算できるなぁ」と
思ったんだけど、なんかうまくいかない。

考えがうまくまとまってないんだけど、だれかアドバイスくんない?
以下、書きかけのコードね。
template <typename T, int X, int Y>
struct Power
{
public: enum
{
Value = Power<T, X, Y - 1>::Value * X;
};
};

template <typename T, int X>
struct Power<1>
{
public: enum
{
Value = X;
};
};
よろしくおながいします。
>>756

template <int N>
struct Power {
enum { Value = Power<N - 1>::Value * N };
};

template <>
struct Power<1> {
enum { Value = 1 };
};

int main()
{
Power<10> p;

std::cout << p.Value << std::endl;
}
前VCで再帰テンプレートやったら
あきまへんでー言うエラー吐かれた気が。
C++の規格ではどうなってるんでしょ?
759C++厨:03/01/21 21:25
>あきまへんで

(*゚∀゚)=3
大阪まだ〜?
>>756
ちょっと前にいろいろ作ったなぁ・・・。
最大公約数、最小公倍数、フィボナッチ数、log、順列、組合せ、etc. ...
もっと応用範囲はありそうだけど、ここよりはtemplate統合スレ向きの話題かも。

>>757
インスタンスつくらなくても、
std::cout << Power<10>::Value << std::endl;
でいける。
761756:03/01/21 21:53
>>757
引数減ってるじゃん?っていうか、それは何を求めてるんですか?
>>757
はべき乗ではなくて階乗を求めていると思われ。
ワロタ
べき乗ならこうでは?

template <int A, int N>
struct Power {
enum { Value = Power<A, N - 1>::Value * A };
};

template <int A>
struct Power <A, 1>{
enum { Value = A };
};

int main()
{
std::cout << Power<5, 3>::Value << std::endl;
}
ちなみにこういうのはコンパイルが通らない。

template <typename T, T A, int N>
struct Power {
enum T { Value = Power<T, A, N - 1>::Value * A };
};

template <typename T, T A>
struct Power <T, A, 1>{
enum T { Value = A };
};

int main()
{
std::cout << Power<double, 5, 3>::Value << std::endl;
}
>>765
enum T ってのは何か意味あんの?タグ名?
どちらにしてもenumはdouble型にはならんわな。
768デフォルトの名無しさん:03/01/22 03:51
>>760
うぷキボソヌ
情報系の人間ではないんですが、ソフトの改良をすることになり困っております。
処理した画像を連番で指定したフォルダに保存するようにしたいのです。
どのように考えればいいかだけでもご指導お願いします。
>>769
画像を処理する→連番で指定したフォルダに保存

ってかんじでOKかい?
771C++厨:03/01/22 15:35
for (uint i = 1; i < 10; ++i) {
&nsp;ostringstream os;
&nsp;os<<"hikky"<<i<<".jpg";
&nsp;ofstream fo(os.str().c_str(), std::ios::binary | std::ios::out);
&nsp;//君のofstreamに入りたいハァハァ...
}

みたいなのはどうでしょうか?
772C++厨:03/01/22 15:37
ナンカチガウ(-_-)
773760:03/01/22 15:48
>>768
>>760
> うぷキボソヌ
家帰らんとコヲド持ってこれん。
明日まで待ってくれ。
>>771
&nbsp;
例えば最大公約数なら

#include <iostream>

template <int M, int N>
struct GCD {
enum { Value = GCD<N, M % N>::Value };
};

template <int M>
struct GCD<M, 0> {
enum { Value = M };
};

int main()
{
std::cout << GCD<121, 77>::Value << std::endl;
}
最大公約数を利用して最小公倍数を求める:

template <int M, int N>
struct LCM {
enum { Value = M * N / GCD<M, N>::Value };
}
フィボナッチ数を求める:

#include <iostream>

template <int M>
struct Fibonacci {
enum { Value = Fibonacci<M - 2>::Value + Fibonacci<M - 1>::Value };
};

template <>
struct Fibonacci<0> {
enum { Value = 1 };
};

template <>
struct Fibonacci<1> {
enum { Value = 1 };
};

int main()
{
std::cout << Fibonacci<8>::Value << std::endl;
}
順列とか組み合わせはどういう考え方で行くのかな・・・・・
スマソ。フィボナッチ数を若干修正。

template <>
struct Fibonacci<1> {
enum { Value = 1 };
};

template <>
struct Fibonacci<2> {
enum { Value = 1 };
};
アッカーマン関数

#include <iostream>

template <int M, int N>
struct Ackermann {
enum { Value = Ackermann<M - 1, Ackermann<M, N - 1>::Value>::Value };
};

template <int N>
struct Ackermann <0, N> {
enum { Value = N + 1 };
};

template <int M>
struct Ackermann <M, 0> {
enum { Value = Ackermann<M - 1, 1>::Value };
};

int main()
{
std::cout << Ackermann<3, 4>::Value << std::endl;
}
こういうテンプレートプログラムを書いていると、感覚的にはPrologで
書くのとよく似ていると思うのは俺だけか?
>>781
漏れは関数型言語(Haskellとか)で書いてるような気がしてくる。
・・・と思ったら他の方がいろいろ書いてくれてますね。

>>778
残るは順列と組合せだけ。記憶を頼りに書いてみます。

#include <iostream>

// 順列
template<int M, int N> struct P {
  enum{ value = M * P<M - 1, N - 1>::value };
};

template<int M> struct P<M, 0> {
  enum{ value = 1 };
};

// 組合せ
template<int M, int N> struct C {
  enum{ value = C<M - 1, N>::value + C<M - 1, N - 1>::value };
};

template<int M> struct C<M, 0> {
  enum{ value = 1 };
};

template<int M> struct C<M, M> {
  enum{ value = 1 };
};

int main() {
  std::cout << P<5, 3>::value << ", " << C<5, 3>::value << std::endl;
}
784760:03/01/22 16:59
スマソ>>783>>760です。
上のコードはg++ 3.2で通ることを確認・
>>783>>784
ああなるほど、順列と組み合わせは、順列の数とnPr組み合わせの数nCrを
求めるだけなのか。
どうやって(1,2,3)のような表現をするのかと悩んでいますた。
786デフォルトの名無しさん:03/01/22 19:31
標準入出力が無いOSで、コンパイル通すためにダミークラス作ろうと思います。
std::cerr
みたいなのはネームスペースstdにcerrという変数かメソッド(どっち?)用意するとして、
std::cerr<<"realFF
みたいな標準入力受けたり出来ますか?
787ブラシさん:03/01/22 19:53
実行と終了を繰り返すと、OSがフリーズします。怪しい部分を書きます。
このソースでのブラシの使い方で問題点があったら指摘してください。

 case WM_RBUTTONDOWN:

  hDC = GetDC(hWnd);

  hBrush = CreateSolidBrush(255);
  rect.left = 10;
  rect.top = 10;
  FillRect(hDC, &rect, hBrush);
  DeleteObject(hBrush);

  hBrush = CreateSolidBrush(128);
  rect.left = 20;
  rect.top = 20;
  FillRect(hDC, &rect, hBrush);
  DeleteObject(hBrush);

  ReleaseDC(hWnd, hDC);

 break;
>>787
ここじゃないと思うが・・
>>787
rect.right と rect.bottom は初期化してますか?
790デフォルトの名無しさん:03/01/22 21:03
loki の SmallObject を試してみたら
標準のアロケータより遅い。圧倒的に遅い。

みんなのところは本当に早くなってる?
ちなみに VC6Std と BCC5.5 と gcc-2.91.57 で試したが
全部標準のアロケータの倍近く時間がかかってるみたい。
791790:03/01/22 21:04
ちなみに ThreadingModell は外した状態ね。
シングルスレッド同士のガチンコ対決だけど遅いのです。
そりゃシングルスレッドだったら標準のが一番はやかろーもん
>>792
malloc(), free() と比較すると、そうとも言えんよ。STL のアロケータだと、最初から
かなりキッチリ最適化されてるヤツが多いけど。

>>791
比較環境が良く分からん…
794デフォルトの名無しさん:03/01/22 22:21
C++始めたばかりなんですがクラスがいまいち理解できません。
クラスを詳しく説明してるサイトはありますでしょうか?
ここにあるような、高度なテンプレートの使い方を解説しているサイトはありますか?
797794:03/01/22 22:29
>>796
RPG系はあまり好きじゃないんで、すいません
>>795
そんなに高度でもないと思うけど・・・・・
こちらの方が高度かも

http://pc3.2ch.net/test/read.cgi/tech/1037795348/l50
>>796
なんでやねん ( ´∀)fつ
>>795
金を払って書籍「Generic Programming」と「Modern C++ Design」でも読むのが近道。
>>800
ありがとう。
802ブラシさん:03/01/23 00:43
>>788,789
書いてなかった rect.right と rect.bottom はまともな数字が入っています。
別の部分でのバグのようなので、他を探してみます。
ありがとうございました。
SelectObjectが必要と言われるかもしれないと思っていました。
803769:03/01/23 00:45
>770
現在のプログラムでは、撮影して画像処理した後に自分で名前を付けてBMP形式で保存するようになっています。
それを何とか連番で自動保存したいのです。
804デフォルトの名無しさん:03/01/23 00:57
throwがある関数は必ずtry{}でくくらないと駄目なんでしょうか?
例外を捕捉しなくても良いときもあるのですが、
今はそんなときにもtry,catchをしてます。
これは無駄なような気がしているのですが…
>>804
補足しなくても良いときがあるならくくらなくて良いでしょ
806756:03/01/23 01:04
みんなありがとん。
<ストライク>パクらせて</ストライク>参考にさせてもらいました。
807ブラシさん:03/01/23 01:10
オーバーフローの問題。
型を超える数字計算は、計算の途中で型を超えても、
型に納まる範囲内の結果は正常に得ることができるのか

例えば、クリックするたびに、3の累乗の1の位の値を
表示するというプログラム。
3, 9, 7, 1 ............

static BYTE byte = 3;
char buf[10];

 case WM_LBUTTONDOWN:
  wsprintf(buf, "%u", byte);
  MessageBox(NULL, buf, "", MB_OK);
  byte*=7;
  break;

これは byte が255を越えてからも正しい結果を得られるんでしょうか?
808804:03/01/23 01:11
>>805
そうすると、プログラムは終了してしまいますよね?
…私のthrowの使い方間違ってるのかな…?

例えば、
mallocでメモリ確保失敗してもNULLが返るだけですが、
newだと例外が発生するのでtry,catchしないと終了してしまうのではないかなあ、と。
>>808
その通りです。
例外が発生してcatchしないとunexpected()が呼び出されて
異常終了します。
>>808
間違ってない。
ってゆーかどういう動作を期待してるわけ?
newの失敗を無視してどうやってプログラムを続けることができるだろうか?
アクセス違反で即アボンじゃん
811768:03/01/23 01:28
>>760をぉ、色々サンクスコ。家帰ってまた何かあったらヨロシコ。
812808:03/01/23 03:31
>>809-810
返答ありがとうございます。
Cから移ってきたばかりなので、C++の作法がまだよくわかってないみたいです…

>>808では、例えでnewを出しただけでして、
実際は自作の関数にthrowを導入することを考えてました。

少し調べてみたのですが、BCBやVC++にはnew(nothrow)という
例外出さないnewもあるみたいですね。
こういうことをやりたかったのですが、ヘッダファイルを見る限り
今の私には手に負えそうに無いです…
もう少しC++の勉強してからまたチャレンジしたいと思います。

ありがとうございました。
>>807
オーバーフローすると正確な値は得られんよ。
例えば4ビットのコンピュータで8があるとする。
1000
4倍すると
100000
しかし、4ビットだから右の0000しか得られない。
8の4倍と0の区別ができないから。
オーバーフローは例外でトラップできないからチェックするには計算のたびに
いちいちキャリーフラグ調べないといけないんだよな。 めんどくさ。
>>813
> 型に納まる範囲内の結果は正常に得ることができるのか
ということだから、>>813 の形だと「できる」ってことになるね。

でも、これってどんな CPU 、どんなコンパイラを使っても
そうなるって保証されてることなのかな?
足し算引き算は大抵大丈夫だと思うけど、掛け算はどうなの?
816レゴ:03/01/23 04:45
あちらの方から飛んで来ました。
実行結果をファイルに出力するやり方を教えて欲しいです。
自分でずっとやってるんですが、中々うまくいきません。
計算の途中ではいったんintに拡張されてその後元の型に押し込められる・・・はず
818レゴ:03/01/23 04:47
#include <iostream.h>
#include<stdio.h>

void main()
{
FILE *fp,*fc;
fp=fopen("素数−実行結果.txt","w");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
fc=fclose("素数−実行結果.txt","w");
}
ここから、どう直していけば良いのか分からないんです。
>>818
宿題スレ行け。つーか、どう直すも一から書き直せって感じだが。
820レゴ:03/01/23 04:49
817>>
はい。何か、エラーが出ました。
変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。って・・・
>>818
予想以上だな・・・
とりあえずこっち来たってことはC++風の書き方がしたいわけだな?
822レゴ:03/01/23 04:53
でも、一応
#include <iostream.h>
#include<stdio.h>

void main()
{
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
}
だけなら、普通に動くんですよ☆
プロcなんてしらんが、まずC言語というのでやってみたらどうだ?
824レゴ:03/01/23 04:58
ファイル名がcppなだけで、
殆ど、C言語で書いてるんだと思います。
あんまし理解してないので、今死でやってたんですけど。
825レゴ:03/01/23 05:00
今あるプログラムを出来るだけ形を残しつつ、
テキストファイルに出力出来るようにしたいんです。
とりあえず
822の1行目を
#include <iostream.h>

#include <fstream.h>

に直し、
void main()
{
の次の行に
ofstream cout( "素数−実行結果.txt" );

を挿入するだけで君の期待する物は得られる
>>826
えーそうなのー?簡単だね。
>>825
多分だけど時間がありそうだから、「C言語 fopen」とかで検索して
関数の使い方を調べてみたらどう?
そこまで組めたならチョコっと調べたら出来ると思うんだけどなー
828レゴ:03/01/23 05:07
凄いです!
coutの部分が全てファイルに出力されてました。
どうしてそんなに分かるんですかぁ〜?凄いですねぇ〜。

後、最後の printf("%d個です。",c);
という部分も結果としてテキストへ出したいのですが、
ofstream printf( "素数−実行結果.txt");
って書けば良いんですかね?
>>828
ちゃうちゃう
cout に出力してるところと同じ方法で出力すれば良い
上の方で
cout << i << "は素数です。" << endl;
とやっているのだから、
同じように
cout <<*************(宿題)****************

しかしその分だとC++どころかCの文法もあいまいなようだし、
なぜcout << で文章が出力されるのかもわかってないっしょ?
そのままだと今後厳しいだろうからちゃんと入門書読んどいたほうが良いよ
830レゴ:03/01/23 05:18
はぅ〜
頑張ります☆
831レゴ:03/01/23 05:20
出来ましたぁ〜!
めっちゃ感動です!!!
壮大なネタだったな
833レゴ:03/01/23 05:23
#include <fstream.h>
#include<stdio.h>

void main()
{
ofstream cout( "素数−実行結果.txt" );
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}

cout << "素数は、" << c << "個です。" << endl;
}
こんな感じです。
本当にありがとう御座いました。
本当に感謝してます☆ありがとう御座いました。
>>833
(*⌒ー')ノやったね♪
>>829
C++には便利な関数あるのね。勉強になった。 
835レゴ:03/01/23 05:32
ネタって・・・、
こっちは、訳分かんなくて、必死だったんですよぉ。
色々、ありがとう御座いました。助かりました。
結局coutのままか…
そういえば前sendmail?が判らないって駄々こねてた人がいたんね。
838レゴ:03/01/23 05:41
今から、爆睡したいトコなんですが、
他の課題が在るので、そっち頑張ります。
また来た時は、宜しく御願いします。
御休み為さいです☆☆
もう来なくていいよ(・ε・)
そういえばC++を勉強し始めた頃はcoutが出力を行っているんだと思っていた。
coutはCのstdoutみたいなもので、出力を行っているのは<<なんだよな。
>>840微妙
>>840美乳
>>840陰毛
>>840微尿
>>840飲尿
>>840美称
847ブラシさん:03/01/23 09:41
>>813,814
ありがとうございます。キャリーフラグはアセンブラでないと無理みたいですね。
848ageMAN:03/01/23 10:00
ファイルをドロップした時、ドロップされたウインドウを一番手前に
持ってくるには特殊な処理が必要だと思うけど、そういうすごいテクニックを
やってるソースはどこかにないかな?
>>848
別にすごくないよ。
>>レゴ
 ちゃんと勉強しろ…っていいたくなる人だね
>>790
亀レスだが、
Loki のスモールオブジェクトは
VC++.NET でリリースビルドすると、標準 new よりやや速くなる。

852840:03/01/23 11:24
>>842-846
なんなんだよあんたたちは(T_T)
>>852微妙
>>852
美乳
>>852陰毛
856デフォルトの名無しさん:03/01/23 15:59
fstreamでテキストファイルを開いてstring型変数に
行を読み込む処理はどうやればいいですか?
f>>s;とやっても行の途中までしか読み込めません。
>>856
std::getline(f, s, '\n');
858C++厨:03/01/23 16:05
std::getline(f, s);

とかで、どうよ。
>>856
やっぱり
std::getline(f, s); でいいや。
860C++厨:03/01/23 16:12
( ゚∀゚ )ぱぱぱぱ〜ん
ぱぱぱぱ〜ん
ぱぱぱぱ、ぱぱぱ〜
ぱぱぱぱ、ぱぱぱ〜
I love you forever
I'll want you to fuck me

ついに俺もケコーンの時期が北か(*゚∀゚)
>>857-858ハァハアx
>>860
C++の標準ライブラリを理解している人が増えてきてうれしいよ。
862856:03/01/23 16:22
>>857-858
ありがとうございます。見落としていました。
ifstream::open/getにstringが渡せないのは不便ですが
char*/string両方サポートするのは面倒ということなんでしょうか。
>>862
面倒というより、開発してきた経緯があって、多分別々のスタッフが
担当していたので整合が取れてないだけの話では?C++のライブラリ
にはそういう面がいっぱいある。
basic_stringはSTLだがiostreamはSTLじゃない
元々別のライブラリだったものを同じstdネームスペースに突っ込んでるだけ
basic_stringもSTL由来じゃないだろ。
866山崎渉:03/01/23 20:00
(^^)
        iostream, ... : C++ 標準ヘッダ
                ↓
vector, list, ... : STL → std ← char_trait : basic_string, ...
868デフォルトの名無しさん:03/01/23 20:32
おまいら
using namespace std;
はもちろんデフォだよな?
>>868
付けてません。
>>868
付けてません。
>>868
まさか。*.cpp 内で

using std::vector;

とか並べることはあるが。
>>871
同意。
>>868
氏ね
874868:03/01/23 23:37
何で付けないんだよ。ブルッてんのか?
なんも実害ないだろ。
名前空間の外はできるだけ綺麗にしておきたい。
使わないなら using namespace って何のためにあるんだ?
宗教戦争
>>876
初心者&なまぐさ坊主のため。
879474:03/01/23 23:52
>>876
ライブラリのサンプルコードをすっきりさせるため。
>>874
> なんも実害ないだろ。
いや using namespace std; するとコンパイルが通らなくなるソースは、すぐに
書けるだろ。

> 使わないなら using namespace って何のためにあるんだ?
歴史的事情
using〜 を
ヘッダに書く奴は馬鹿。
ソースでグローバルに書くのは好きずき。
関数の中で書くのはデフォ。
882876:03/01/24 00:08
>>877
一億光年くらい納得した。
>>880
書こうと思えば書けるが、標準で使われてしまっている名前はなるべく避けるのが
常識じゃないか?
とすれば、名前の衝突はそうそう発生しない。
おいおい、ここで宗教戦争始めるのか?
なら ↓ こっち逝ってくれ。
http://pc3.2ch.net/test/read.cgi/tech/1031355713/l50
うちの会社はstd::を付ける事にきまってるので、using使ったソースを
納入した場合全部書き直しとなります。
それはマ板のネタ
887デフォルトの名無しさん:03/01/24 01:16
ある保守を任されたソースに書かれてることについて疑問があるのですが、
クラス内においてメンバ関数の処理を記述してあるようなもの。
これの宣言にinlineがついているのですが、これってなにか意味があるんでしょうか?
クラス内のメンバ関数宣言にinlineがつくというのは、クラス定義の
外側で関数定義するときにinlineを省略できる。このためだけに使うものだと
思っていたのですが、他になにか理由があるのでしょうか?
しばらくするとstd::を書くのが快感になってくるんです
>>887
> 外側で関数定義するときにinlineを省略できる

省略できたっけ?
>>889
中で関数定義する時にinlineを省略できると間違えたと思われ。
>>888
禿同
>>888
同じく。時々手が震えて::が;;になったり:::になったりするのがまたイイ。
893デフォルトの名無しさん:03/01/24 01:29
class CLS{
inline char get();
};
char CLS::get(){
こういう書き方ができるとC++Primerには書いてあるんだけど・・・
>>893
それはインラインにならないんじゃ・・・・
>>893
げっ、こういう書き方も有効みたいだ。初めて知ったよ。
規格書ではどの辺を読めばいいのだろうか。
896デフォルトの名無しさん:03/01/24 01:42
で、、、なにか理由があるんでしょうか?
>>896
普通外部で関数を定義するとinlineにならないが、クラス宣言の所で
inlineと書いておくと、外で関数を定義してもちゃんとinlineになるみたいだ。

規格書読んだけど目がちかちかしてどこに書いてあるのかわからなかった。
識者のレスをきぼん。
898デフォルトの名無しさん:03/01/24 01:50
>>897
クラス定義の中でメンバ関数の処理が書いてあるということは
inlineキーワードは付いても付いてなくても無条件でinlineに
なるから、意味ないですよね?ネームスペーススコープで
メンバ関数を定義するときは上の例みたいにいろいろと
あるみたいですが。。。
それともinline関数にはちゃんとキーワードを付けた方が
コードが見やすいから、これをコーディング規約にしてしまおう
なんてのがあったのかな。その辺のドキュメントが残ってないから
ちょっと分からないのでなんともいえないですけどね。
>>897 9.3.3
>>898
class内部でメンバ関数の定義を書いてしまった場合は、そのメンバ関数
はinlineになりますが、class外部でメンバ関数の定義を書いた場合、その
関数がinlineになるかどうかは、メンバ関数の宣言の所にinlineと書いて
あるかどうかで決まるようです。

>>900
thanks.
>>898
そのため、クラスの内部に定義を書こうと、外部に書こうと常にinlineに
なるように、クラス内部でメンバ関数全部にinlineと書くことに決めてある
んじゃないでしょうか。
>>902
やっぱりコーディング規約的な話ですかね。
関数の処理実体があるかどうかなんて一目瞭然だと
思うのだけど、C屋さんには紛らわしかったりしたのかな。
とりあえず、このことは忘れて作業に戻ります。
みなさんどうもでした。
903です902さんのよく読んでませんでした。
クラス定義においてinline関数にはinlineキーワードを
付けることを必須と決めておけば、メンバ関数を外に
出したときにinlineキーワードを付け忘れてもinline化
されるという意味ですね。この規則ってC++的常識から見て
どうなんでしょうかね。
>>904
どうなんだろ
俺はコンパイラの最適化を盲信してinlineはどこにも使わないけどな
>>904
>>900さんの規格書の項目を読んでみられるといいよ(英文だけど)。
拙い和訳をすれば、「メンバ関数をinline化するにははクラスの宣言部に
inlineと書いても、定義部でinlineと書いてもよい。」のような意味になると
思います。

規格書にちゃんと書いてあるので、文法的にも正しいはずです。
というか俺もこれから使わせてもらいますね。
次スレのテンプレ、いいの作ったからスレ立ては>>907に任しとき
>>883
常識、で済めば話は簡単なんだがな…
909デフォルトの名無しさん:03/01/24 12:58
コンストラクタの暗黙の変換は役に立たないのか?

#include<iostream>
using namespace std;

struct A
{
A(int){}
};

void F(double i)
{
std::cout << "F(double)";
}

void F(A a)
{
std::cout << "F(A)";
}

int main()
{
F((int)123);//F(double)
}
それは無理なんじゃ。。
Fのパラメータを評価する段階でint型の値をAにマッチさせる
理由はないわな。
オーバーロードの解決では、標準変換 (int => double) のほうが
ユーザ定義変換 (A(int) {}) より優先するからね。C++3rd 7.4 参照。
912デフォルトの名無しさん:03/01/24 19:45
すみません。質問させてください。
プログラムからファイルの名前を変えたり、ファイルを削除する必要がでてきました。
環境はWindowsですが、なるべく「標準」でやりたいと思います。
ところが、調べてみると、C++でどうするか書いてある本が見当たりません。
Cでは、removeやrenameが使えるようなのですが、他にC++らしい方法はないのでしょうか。
ご存知の方、お願いします。
>>912
std::remove
std::rename
914デフォルトの名無しさん:03/01/24 21:41
#pragma comment(linker, "/nodefaultlib:\"libc.lib\"")
#pragma comment(linker, "/entry:\"DllMain\"")
↑を使ってビルドすると、
すごく小さいサイズのファイルが出来上がって、
普通に動作してる気がするけど、
他の環境で使ったときに不具合がでるとか
何か問題ってあるのでしょうか?
>>914
pragmaつかっといて、他の環境ってどういうこと?
まぁまずはスレ違いダナ。VCスレいけば?
916デフォルトの名無しさん:03/01/25 01:06
#include <unistd.h>
main()
{
int i,j;
printf("program start");
j=fork();
if(j>0)
{
printf("parent-1");
sleep(5);
printf("parent-2");
sleep(5);
printf("parent-3");
}
if(i==0){
printf("child-1");
sleep(8);
printf("child-2")
}
return(0);
}

すみませんがエラー1になるのですが、実行の仕方を教えてください
>>916
UNIX板へ逝け。
#include <cstdio>
#include <unistd.h>
int main(){
int i,j;
printf("program start\n");
j=fork();
if (j>0) {
printf("parent-1\n");
sleep(5);
printf("parent-2\n");
sleep(5);
printf("parent-3\n");
}
if (i==0) {
printf("child-1\n");
sleep(8);
printf("child-2\n");
}
return(0);
}
#include <cstdio>
#include <unistd.h>
int main(){
int i,j;
std::printf("program start\n");
j = ::fork();
if (j > 0) {
std::printf("parent-1\n");
::sleep(5);
std::printf("parent-2\n");
::sleep(5);
std::printf("parent-3\n");
}
if (i == 0) {
std::printf("child-1\n");
::sleep(8);
std::printf("child-2\n");
}
return(0);
}
本当はこうしないとダメかな??
はわわ〜
921デフォルトの名無しさん:03/01/25 04:15
ファイルサイズを取得するには、C言語ならファイルをバイナリモードで
開いておき、
fseek(fi, 0, SEEK_END);
size = ftell(fi);
のような感じで簡単にできましたが、C++ではtellg()の返す値の型が
std::ios::pos_typeのためにそれができません。
もちろん大概のコンパイラのstd::ios::pos_typeはunsignedもしくは
unsigned longのtypedefなのですが、それに依存せずファイルサイズ
を簡単に取得する方法はありますでしょうか?
ない。
何故なら、「ファイルサイズ」 が環境依存の概念だから。
環境依存でないのなら、それを取得する標準関数が用意されるはずだ。
923デフォルトの名無しさん:03/01/25 04:59
>>922
そうですか・・・・ありがとうございました。
どうしても必要な時はstd::fseek()などを使ってやる事にします。
>>919
いいかげん荒らすのはやめてくれんかね。
925デフォルトの名無しさん:03/01/25 11:03
string型は積極的に使うべき?
やってはいけないことが分かっているなら使うべき
やってはいけないこととは何?
>>927
タイトなループ中で const string& をとる関数 foo() に

 foo("string");

と書くとか。毎回 string オブジェクトのコンストラクト・デストラクトが行われて
泣ける。
なるほど
最適化されるだろ。
コンストラクタ・デストラクタの最適化はうまく逝くのだろうか?
されないだろ。つかされたら困る。
ベンチマークテストでもやってみるべ。
風呂入ってくるから後で。
>>933
ハァァ?ベンチマークとるまでもないだろ。
理性的に考えれば結果は明白。これだからベンチマーク厨は・・・




とかいう芳しいのが別のスレに居た。
>>934
まあそう言わずに、どれだけ実際に違うのか見てみましょうよ。

g++3.2.1(MinGW)で以下の関数を QueryPerformanceCounterで測定。

void dummy(const std::string& s)
{
}

void func1()
{
for (int i = 0; i < LOOP; i++)
dummy("test");
}

void func2()
{
std::string s("test");
for (int i = 0; i < LOOP; i++)
dummy(s);
}
コンパイルオプションは -O3。

LOOP = 500000 で実験。

func1 = 365125
func2 = 1944

ご覧のように、std::stringのコンストラクタを呼んだ方は100倍以上も
遅くなってしまいますた。

-O2だと
func1 = 371604
func2 = 7711

これでも全然遅いです。
933じゃないけど試してみたよ。

VC7, gcc3ともに毎回コンストラクト/デストラクトしてた。
最適化オプションつけたらvc7は5倍ぐらい速くなったけど、
gcc3は1.2倍程度だった。

stringの生成をループの外に持ってったら、
最適化オプションなしで20倍ぐらい速くなった。

ところで、foo()の中身を、引数のstringの長さをグローバル変数に足しこむ
のにしてたんだけど、
ループ外にもってったのをvc7で最適化したら、ループが無くなってました。
gcc3は残ってた。
938937:03/01/26 02:20
書いてるうちに別の方が書き込みを・・・
やってることはほぼ同じです。
>>937
VC7の方もなかなか速いね。gccは-O3にしたらループは
残るものの、callが無くなっていました。

int len;

void dummy(const std::string& s)
{
len += s.length();
}

でやったら、-O3で

func1 = 379483
func2 = 9185

という結果。これがまあ実際の使用上の差かもしれません。
940デフォルトの名無しさん:03/01/26 02:58
enumって何ナノ?定数のtypedef?
継承できないよね?
勝手にできないと思って、拡張するとき
#defineでごまかしてるんだけど。

classにstatic constならべたclassを継承すれば
継承っぽいなぁ。めんどいけど。

詳しい方ご教授ください。
enumに整数以外の型も使えたらなあ・・・
>>940
enum は列挙型で、それ自身独立した型。enum から整数には暗黙の変換が
利くけど、整数から enum や異なる enum 間の変換にはキャストが必要。

おそらく

class Foo {
public:
 enum TYPE1 { A, B, C, ... };
 virtual func(TYPE1 t);
};

なんてのがあって enum を拡張したいのだと思うけど、それは設計が腐ってる。

func() の中で t の値で処理を場合分けしていて、かつ t に対して将来の追加が
考えられるなら、処理自体をカプセル化して別のクラスに括り出すことを考えた
方が良い。

class Cmd {
public:
  virtual func(Cmd& foo) = 0;
};
// enum に対応して Cmd の派生クラスを作っておく
// Cmd 派生クラスのインスタンス生成は Factory パターンでも使って下さい

class Foo {
public:
  virtual func(Cmd* cmd);
};
943C++厨:03/01/26 13:20
enumeration
【名】《【複】enumerations》
(1)数え上げること; 列挙.
(2)目録, 表 (=list).
 by Roboword
944デフォルトの名無しさん:03/01/26 16:16
cygwin 上の g++ で

$ g++ hoge.cpp -I /hogeinc

と書いてコンパイルしてるんですが、この -I /hogeinc を書かなくても
自動的に対象ディレクトリを見てくれるようにするにはどうしたらいいですか?
知らん。
makefile工夫すれば書くのはめんどくさくないと思うが。
>>944
specs に書いておく。gcc -v すると specs ファイルのパス名分かるから、あとは
それをエディタで開いて書き換えましょう。
947944:03/01/26 16:48
>>945
make 使うまでもないちいさなプログラムのテストとかで面倒くさいんです。

>>946
できましたー!ありがとうございます!!
これは gcc ならどんな環境でも有効な方法なんでしょうか?
質問があります。
非常に日本語で表しにくいのですが…
ある範囲内の数値でIDを自動的に生成するようなクラスは
どのように実装したらよいでしょうか?
例えば、Get()で新しいIDを、Release(ID)でIDの解放を行うような
ID管理のクラスを作りたいのですが。
最初はstd::vector<bool>を使って使用中か否か管理しようかと
思ったのですが、intの全範囲で使用可能などとなると管理が
できなくなってしまうので…
皆様のご意見をお聞かせください。
>>948
それしか方法が無いと思うが。
できるのは、容量を縮めるのに bitset を応用できるくらい?
>>949
Get, Release に特定のパターンがあるなら、最適化する余地はある。たとえば
多くの場合、

 まとめて Get
 まとめて Release

するなら、

 ここから、ここまで確保されている (最小 ID と最大 ID のタプル)

っつーのを持たせた方が良い。

何の前提もつけられないとなると、完全に全範囲持たせるしかないよな…
>>948
std::set<int>、で、どう?
953デフォルトの名無しさん:03/01/27 00:33
class A
{
  A();
}
class B : public A
{
  B();
}
この場合手持ちのコンパイラでは
A::A()が先に実行されるのですが
これは規格で保証されてる事なのでしょうか?
>>953
保証されてる。デストラクタがその逆であることも。
>>954
ありがとうございます
>>928->>939の書き込みに感動しました。
実行時間の測定は、gccというかUNIXの場合timeを使うのですよね。
VCの場合、どうやって測定するのでしょうか。
>>956
トリッキーなコード2より転載。windows.hをインクルードして呼ぶ。

int prof(void (*func)())
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);

Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);

func();

QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);

return (int)(end - start);
}
958デフォルトの名無しさん:03/01/27 02:35
>>949
VC++6では既に, std::vector<bool>は1要素1bitで保持してる(はず)。
激しく環境依存だけど。
新スレ立てました C++相談室 part15
http://pc3.2ch.net/test/read.cgi/tech/1043605481/
足りないと思われるものがあるなら今のうちに次スレの
方に貼り付けておいてください。今日はもう寝ます、お休みなさい。
漏れの脳みそは足りないと思うのですが、何を貼り付ければいいですか?
汝には、当家に伝わる秘伝中の秘伝である
ありがた〜い、塗り薬を授けるので
今すぐ、頭をかちわって、脳みそを送るが良いぞ
これから頭をかち割ってみます
v(^・^)v
963 は絶息しますた。
そういえば次スレの案内がないので(またサーバー変わったみたいだし)
C++相談室 part15
http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50
DeveloperStudioってVisualC++.NETについてるの?
いまVisualStudio.NETアカデミックを持ってるけど・・・
968967:03/02/06 03:42
解決しました。ありがとうございました。
age
ちょっと前に、ベンチマークに時間を計る話がありましたよね。
俺の環境では、Cygwinでtimeとするといいと思うんですが、そこで出てくる
real、user、sysの意味がよくわかりません。
実時間、ユーザー時間、システム時間って言葉ではさっぱりです。
ベンチマークになるのは、どれなんでしょう?
boost::timer
> 安く作成

(・∀・)カエレ!
>>970
real … プログラムの起動から終了までの時間
user … ユーザー側の実行に CPU が費やした時間
sys … OS側の実行に CPU が費やした時間

全体の処理時間を評価したいなら real 時間
アルゴリズムを評価したいなら user 時間
OS の機能を評価したいなら sys 時間
sage
975デフォルトの名無しさん:03/03/13 20:30
age
976デフォルトの名無しさん:03/03/14 18:36
ぬるぽ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>976

C++相談室 part15
http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50
978デフォルトの名無しさん:03/03/14 19:10
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/  
 (_フ彡        /  ←>>977

C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/
 | ̄ ̄ ̄|___
 |        ヌノ|
 |______|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
980デフォルトの名無しさん:03/03/15 01:59
 ______
 |__     |
     |レポ   |
     |___|  
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
981デフォルトの名無しさん
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/  
 (_フ彡        /  ←>>980

C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/