5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part8

1 :デフォルトの名無しさん:02/06/25 22:06
(´∀`).。o(関連URLは>>2-5の辺り)

2 :デフォルトの名無しさん:02/06/25 22:13
実数の階乗はガンマ関数ってか?

3 :v(^▽^)v:02/06/25 22:17
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

Boost
http://www.boost.org/
STLport
http://www.stlport.org/
Loki
http://www.moderncppdesign.com/


過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4
http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5
http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6
http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/

4 :デフォルトの名無しさん:02/06/25 22:18
v(^▽^)v

Generic Programming with C++ Template
http://pc.2ch.net/test/read.cgi/tech/1008593126/
●STL スレッド●
http://pc.2ch.net/test/read.cgi/tech/1004287394/


Windowsの話はこちらで

Win32API 質問箱 Build4
http://pc.2ch.net/test/read.cgi/tech/1023361418/


■ VisualC++(MFC限定)相談室 4■
http://pc.2ch.net/test/read.cgi/tech/1021620974/

5 :デフォルトの名無しさん:02/06/25 22:26
■関連スレ■

VisualC++相談室 3
http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4
http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5
http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6
http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】
http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/


6 :デフォルトの名無しさん:02/06/25 22:27
乙カレー

7 :デフォルトの名無しさん:02/06/25 22:28
>>2
過去ログとか書き終わるまで、まてよ


8 :v(^・^)v:02/06/25 22:30
v(^・^)v

9 :shige:02/06/25 22:32
v(^・^)v ←むかつく


10 :デフォルトの名無しさん:02/06/25 22:34
v(^・^)v ←なんすかこれ

11 :デフォルトの名無しさん:02/06/25 22:35
もうC++スレいらないって言っただろ
何で立てるんだよ?

12 :デフォルトの名無しさん:02/06/25 22:35
>>10
俺の顔

13 :v(^・^)v:02/06/25 22:35
v(^・^)v delete >>11;

14 :デフォルトの名無しさん:02/06/25 22:36
>>11
お前が見なけりゃいいだけ

15 :デフォルトの名無しさん:02/06/25 22:37
ドイツ強いな。
fstream系のコンストラクタってなんでワイド文字バージョンが
ないのだろう。変換が面倒くさい。

16 :デフォルトの名無しさん:02/06/25 22:38
destroy(>>11);

17 :デフォルトの名無しさん:02/06/25 22:39
SendMessage(>>11, WM_ITTEYOSHI, 0, 0);

18 :デフォルトの名無しさん:02/06/25 22:44
if (msg.sender == >>17)
 reject();


19 :デフォルトの名無しさん:02/06/25 22:45
if (>>11->temminate())
>>11->deallocate();

20 :デフォルトの名無しさん:02/06/25 22:46
terminate()だった。逝ってきます・・・・

21 :デフォルトの名無しさん:02/06/25 22:54
void >>11::OnDeallocate()
{
 for (;;)
  new >>11;
}


22 :デフォルトの名無しさん:02/06/25 22:57
void >>11::>>11()
{
 this->execute("マンキン.exe");
}

23 :デフォルトの名無しさん:02/06/25 22:57
>>22
Syntax error

24 :デフォルトの名無しさん:02/06/25 23:07
>>23
たしかに>>22はvoidが不要だった。コンストラクタのつもり。

オブジェクトを生成しようとすると、マンキン.exeが実行され、
HDDがあぼ〜んする。

25 :デフォルトの名無しさん:02/06/25 23:09
>>1 乙カレー

Lokiをリンクに入れるのならここもリンクに入れてくれ。

LokiをVC7に移植したLokiPort
http://www.geocities.com/rani_sharoni/LokiPort.html

26 :デフォルトの名無しさん:02/06/26 00:30
C++の参照について質問です。

void A(char **a,char **b){
 *a="a";
 *b="b";
}
main(){
 char *a,*b;
 A(&a,&b)

というように、2つの値を返したい関数があるのですが、
これを参照を使おうと思って、
void A(char &*a,char &*b)
としてみましたが、
エラー:参照型へのポインタあるいは参照は定義できない
と言われてしまいました。やりたいのは参照型へのポインタではなく、ポインタへの参照
だと思うんですけど、どう書いたらいいのか教えてください。


27 :デフォルトの名無しさん:02/06/26 00:32
void A(char*& a, char*& b)

28 :デフォルトの名無しさん:02/06/26 00:37
istreamからvectorに内容をコピーするとき、

istream_iterator<char> i(f), e(f);
advance(e, 15);
copy(i, e, back_inserter(v));

とやってみても一切読み込めません。
指定サイズを読み込む方法って無いんですか?

29 :助けてください:02/06/26 00:39
教科書に
#include"compati.h"
とあったので書き込むと
fatal error C1083: インクルード ファイルがオープンできません。'compati.h': No such file or directory
と出て来ます。
これは何者なんですか?
ほんとのド素人です


30 :デフォルトの名無しさん:02/06/26 00:42
>29
勘だが、その教科書の前のほうにそのファイルが定義されている

31 :デフォルトの名無しさん:02/06/26 00:43
ってゆーか、他の人の方が効きたいんじゃないか>これは何者なんですか?

32 :助けてください:02/06/26 00:44
includeの中身を” ”でくくるっていうのはどういうことなんですか?



33 :デフォルトの名無しさん:02/06/26 00:45
>32
先に近所を読む

34 :助けてください:02/06/26 00:47
それが教授からコピーしか貰ってないから前後が無いんですわ


35 :デフォルトの名無しさん:02/06/26 00:48
その答えはK&Rに。

36 :デフォルトの名無しさん:02/06/26 00:48
>>27
できました!
ありがとうございます。

37 :デフォルトの名無しさん:02/06/26 00:49
教授にそのことを言うか、同じ本を探すか、ですなぁ?

38 :助けてください:02/06/26 00:51
そうですか・・



39 :助けてください:02/06/26 00:52
ちなみに「先に近所を読む」ってどういう意味です?




40 :デフォルトの名無しさん:02/06/26 00:52
compati.hについて書かれてないのならお手上げですな。
ファイル自作してエラーメッセージを見れば、あるいは内容を推測
出来るかも知れん。

41 :デフォルトの名無しさん:02/06/26 00:53
stdio.hとかがあるところを読む前に、自分が作業している
ディレクトリを探すってこと。たいてい標準的なのは<>で囲み、
自分たちがつくったファイルをインクルードするときは""で
囲む

42 :デフォルトの名無しさん:02/06/26 00:54
教授を小一時間、問い詰めろ。

43 :助けてください:02/06/26 00:56
プログラムが80行あるんで順番に書き込んでみてもらってもいいですかね?

44 :デフォルトの名無しさん:02/06/26 00:56
>>28
input iteratorからcopyでは無理。素直にforループを書く。
と思う

45 :デフォルトの名無しさん:02/06/26 00:57
まあ、いいんでない?

46 :デフォルトの名無しさん:02/06/26 00:58
そうだな
まだスレの初めだからいいだろう。

47 :助けてください:02/06/26 00:59
#include<stdio.h>
#include"compati.h"

#define M 5 /*機会の台数*/
#define N 2 /*修理者の人数*/
#define A 10.0 /*平均故障発生感覚*/
#define H 4.0 /*平均修理時間*/
#define DT 0.5 /*時刻増分*/
#define T_END 10000.0 /*シミュレーションを終える時刻*/


48 :助けてください:02/06/26 00:59
void main(void)
{
double tt = 0.0; /*シミュレーションクロック*/
int i; /*待ち行列のforのカウンタ*/
int j; /*機会のforカウンタ*/
int k; /*修理者のforカウンタ*/
int f = 0; /*故障している機械の台数*/
int q = 0; /*待ち行列の長さ*/
int sm[M + 1] = {0}; /*機会jのjの状態*/
int sn[N + 1] = {0}; /*修理者kの状態*/
int sq[M + 1] = {0}; /*待ち行列*/
double p[M + 1] = {0.0}; /*機会がf台故障している時間*/
srand(15);

49 :助けてください:02/06/26 01:00
/*開始*/
while (tt <= T_END){

/*故障発生*/
for(j=1;j<=M;j++){
if(sm[j]==0){
if((1.0 / A*DT) > RAND()){
sm[j] = 1;
q = q+1;
sq[q] = j;
}
}
}


50 :助けてください:02/06/26 01:00
/*故障修理*/
for(k=1;k<=N;k++){
if(sn[k]==0){
if(q>0){
sn[k]=sq[1];
q=q-1;
if(q>0){
for(i=1;i<=q;i++){
sq[i]=sq[i+1];
}
}
}
} else{
if((1.0/H*DT)>RAND()){
sm[sn[k]]=0;
sn[k]=0;
}
}
}

51 :助けてください:02/06/26 01:01
/*表示*/
printf("%7.2f ",tt);
for (j = 1; j <= M; j ++) printf(" %2d",sm[j]);
printf(" ");
for (k = 1; k <= N; k ++) printf(" %2d",sn[k]);
printf(" ");
for (i = 1; i <= q; i ++) printf(" %2d",sq[i]);
printf(" ");

/*故障している機械の台数を数える*/
f=0;
for(j=1;j<=M;j++){
if(sm[j]==1){f=f+1;}
}
p[f]=p[f]+DT;

/*時刻を進める*/
tt=tt+DT;
}

/*結果出力*/
for(j=0;j<=M;j++){
printf("p[%1d]=%10f\n",j,(double)p[j]/T_END);
}
}

52 :助けてください:02/06/26 01:01
以上です

53 :デフォルトの名無しさん:02/06/26 01:02

イテレータとかのoperator->() は普通ポインタを返すようになってますが
なんでこれでメンバの参照ができるのですか?

そのまま単純に考えると
(イテレータ)->(メンバ名) は (Tのポインタ) (メンバ名) となるように思われ意味をなさないですよね。

Bjarneは
> p->m = 7; // (p.operator->())->m = 7
てますが、つまりoperator->()は特別扱いってこと?

54 :デフォルトの名無しさん:02/06/26 01:04
srandとRANDぐらい?

55 :デフォルトの名無しさん:02/06/26 01:05
ぱっと見、RAND()くらいしかないような。

56 :デフォルトの名無しさん:02/06/26 01:06
>54
ぽいね。なんとかなりそうじゃん

57 :デフォルトの名無しさん:02/06/26 01:06
55 鬱氏

58 :助けてください:02/06/26 01:06
どういうことですか?

59 :デフォルトの名無しさん:02/06/26 01:06
>>52
>void main(void)
ここだけでワラタ。

60 :デフォルトの名無しさん:02/06/26 01:08
i=1;i<=M ってのがいいね。

61 :デフォルトの名無しさん:02/06/26 01:10
#include "compati.h"
のかわりに

#include<stdlib.h>

double RAND(void)
{
return (double)rand()/RAND_MAX;
}


62 :デフォルトの名無しさん:02/06/26 01:11
>助けてください
#include"compati.h"
の代わりに
#include<stdlib.h>
double RAND(void){return (double)rand()/(double)RAND_MAX ;}
とでもすればよい

63 :62:02/06/26 01:13
げげげ

64 :61:02/06/26 01:13
>62
すまん。

65 :デフォルトの名無しさん:02/06/26 01:13
かぶりまくっているな。

66 :デフォルトの名無しさん:02/06/26 01:14
ふたりが一致したということは、かなり正解ってことかな?

67 :助けてください:02/06/26 01:15
おお!エラーがなくなりました!


68 :デフォルトの名無しさん:02/06/26 01:17
待ち行列か。昔実験でやったよ。

69 :デフォルトの名無しさん:02/06/26 01:19
ケコーン>>61-62

70 :助けてください:02/06/26 01:19
ちなみに実行すると永遠に数字が出るんですがどこ直したらたらいいんですかね・・?

71 :デフォルトの名無しさん:02/06/26 01:20
新たな問題発生

72 :デフォルトの名無しさん:02/06/26 01:20
>70
中身についてはがんばってくれよ

73 :デフォルトの名無しさん:02/06/26 01:21
>70
ここから先は宿題の範疇

74 :助けてください:02/06/26 01:22
ですよね(笑)
っていうかマジありがとうございました!
これで胸張ってあした免許の試験受けにいけます!

75 :デフォルトの名無しさん:02/06/26 01:23
#define T_END 10000.0 /*シミュレーションを終える時刻*/

T_ENDの単位はわからないけど、いつか止まりそう。

76 :デフォルトの名無しさん:02/06/26 01:23
あ、遅かったか。

77 :助けてください:02/06/26 01:26
まだいました

78 :デフォルトの名無しさん:02/06/26 01:28
そうか、あしたがんがれ。

79 :デフォルトの名無しさん:02/06/26 01:29
#define DT 0.5 /*時刻増分*/
#define T_END 10000.0 /*シミュレーションを終える時刻*/

好きにかえればいい。このままだと20000行

80 :デフォルトの名無しさん:02/06/26 01:32
>78
なんかいいひとっぽい。

81 :助けてくださってありがとうございました:02/06/26 01:36
いやー、凄いですね。今大学3年なんですけど
どうやったらそんなにCできるようになるんですか?

82 :デフォルトの名無しさん:02/06/26 01:39
>81
俺は大学4年だよ。Cをはじめたのは9年前だが。

83 :デフォルトの名無しさん:02/06/26 01:40
プログラミングが好きならできるようになる。
試験があるならさっさと寝とけ

  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ ←>>81
 (_フ彡        /

84 :助けてくださってありがとうございました:02/06/26 01:44
りょうかいです

85 :デフォルトの名無しさん:02/06/26 01:51
  .∧ ∧
  (>>53).。oO(氏にたい…)
  /   \
  ⌒|  /⌒
   ノ_ノ


86 :デフォルトの名無しさん:02/06/26 01:54
>>85
イテレータがポインタを返すようになってるから、->演算子はメンバを返す
ように(通常の構造体のアロー演算子のように)オーバーロードされてる
だけの話では?

87 :デフォルトの名無しさん:02/06/26 01:56
>85
自分でスマートポインタ書いてみたらわかるんじゃない?

88 :デフォルトの名無しさん:02/06/26 02:05
class A{
public:
void f(){
puts("A::f");
}
};
class B :public A{
public:
void f(){
puts("B");
A::f();//    ここ
}
};
ここで、クラス名を指定せずに自動的に継承元のメンバ関数を呼ぶことはできないのでしょうか。
perlだとSUPER::を付けると検索してくれるんですけど。


89 :デフォルトの名無しさん:02/06/26 02:05
C++の予約語ってこれ以外に何がありましたっけ?

auto
and
bool
char
class
const
const_cast
double
define
defined
do
extern
explicit
enum
else
elif
endif
export
float
for
int
if
ifndef
include
long
mutable
namespace
or
public
protected
private
return
register
static
static_cast
struct
switch
short
sizeof
template
typedef
typename
using
void
volatile
while
xor

90 :デフォルトの名無しさん:02/06/26 02:07
>>88
多重継承が可能な言語では無理じゃないの?

91 :デフォルトの名無しさん:02/06/26 02:09
>89
reinterpret_cast

92 :デフォルトの名無しさん:02/06/26 02:11
>>88
しかも呼び方が違う

93 :デフォルトの名無しさん:02/06/26 02:11
>>86
operator->()が返すの自体はポインタではないですか・・・
>>87
ただ単に保持しているポインタを返すだけで期待通り動くので何も新しいことは
わからなかったです・・・


94 :デフォルトの名無しさん:02/06/26 02:12
dynamic_castもな。
それから、xorは予約語じゃないぞ

95 :デフォルトの名無しさん:02/06/26 02:13
>>89
あと
import
extends
implements
abstract
native
があります

96 :89:02/06/26 02:14
>xorは予約語じゃないぞ

そうだった(..;)どうも

97 :デフォルトの名無しさん:02/06/26 02:15
>95
なかなかアグレッシブな人物だな。

98 :89:02/06/26 02:15
extensってJavaじゃないでしか?(..;)

99 :デフォルトの名無しさん:02/06/26 02:16
virtual 抜けてるかも。>>89

100 :デフォルトの名無しさん:02/06/26 02:17
>>90
perlは多重継承を可能にするために@ISAが配列になってると思ってたんだけど。


101 :デフォルトの名無しさん:02/06/26 02:19
>>94
orとかandはいいのですか・・・

102 :デフォルトの名無しさん:02/06/26 02:20
>>89
なんか、要るのがなくて、要らんのがあるね

103 :デフォルトの名無しさん:02/06/26 02:20
xor予約語じゃない?
try,catch もある。

104 :デフォルトの名無しさん:02/06/26 02:21
case
break

105 :デフォルトの名無しさん:02/06/26 02:21
>>89はここをみたらどうだい・・・
http://www.kuzbass.ru/docs/isocpp/lex.html

106 :デフォルトの名無しさん:02/06/26 02:22
operator,new,delete

107 :デフォルトの名無しさん:02/06/26 02:23
inline

108 :デフォルトの名無しさん:02/06/26 02:24
friend asm union

109 :デフォルトの名無しさん:02/06/26 02:26
signed unsigned this

110 :89:02/06/26 02:27
>>105
助かりましたありがとう

111 :デフォルトの名無しさん:02/06/26 02:27
ifndefが入っててifdefがないのはどうよ
つーか、プリプロセッサディレクティブもありなのか?

112 :デフォルトの名無しさん:02/06/26 02:33
>89
スキャナでも作る気?

113 :デフォルトの名無しさん:02/06/26 02:36
エディタの強調表示用のキーワード登録とか?

114 :デフォルトの名無しさん:02/06/26 02:37
>113
それ、ありそう。

115 :デフォルトの名無しさん:02/06/26 04:39
実装例があるかは知らないけど、exportキーワードはあるな。

116 :デフォルトの名無しさん:02/06/26 04:48
括弧とか比較演算子とか、記号を奇妙な2文字の組み合わせで表現する方法があったけど、
なんて言うんでしたっけ?
検索キーワードが思いつかず、具体的な表記も分からないので検索のしようがないです

117 :デフォルトの名無しさん:02/06/26 05:01
トライグラフって、C++でも有効なの?

118 :デフォルトの名無しさん:02/06/26 05:55
有効。

119 :デフォルトの名無しさん:02/06/26 09:23
stringクラスを参照ではなくそのまま関数の引数に与えるのは
良くないと言われたんだけど、本当ですか?
なんでも、VC標準のSTLやSTLPortではCopy On Writeになっていないから、だそうで。

120 :デフォルトの名無しさん:02/06/26 09:49
>>119
string の値渡しは、const string& で渡す場合にくらべると、
百害あって一利なしって話だと思う。

あ、一利あった。
渡した先で const_cast されて、呼び出し元のデータが壊される危険性を回避できるな。
そんな理由で効率を落とす気には、普通は、ならんと思うけど。

121 :デフォルトの名無しさん:02/06/26 09:56
>>119
VCのstringはリファレンスカウントしてるよ。

122 :デフォルトの名無しさん:02/06/26 10:36
GCを導入しているC++処理系はありますか?
あったら教えてください

123 :デフォルトの名無しさん:02/06/26 10:43
http://pc.2ch.net/test/read.cgi/tech/1014486422/

124 :122:02/06/26 10:52
まねじだ・・・(´д`;)

125 :デフォルトの名無しさん:02/06/26 11:19
>>122
operetor new, operator delete を自前で定義すれば、処理系に依らず GC を
使えるけど。BoehmGC とか。

(ただし最適化しすぎると、動作がおかしくなったりする)

126 :デフォルトの名無しさん:02/06/26 16:44
Cの初心者です。
ポインタについて学び、使い方は分かったのですが、これを使う理由が
つかめません。どういった場面で必要になるのか、どなたか教えて下さい。

127 :デフォルトの名無しさん:02/06/26 16:54
>>126
文字列の操作、リストの実装、グラフの実装など。
ほとんどの場面で有効。

128 :126:02/06/26 17:07
>>127
即レスthxです。参考にになりました(ノ´Д`)ノ


129 :デフォルトの名無しさん:02/06/26 18:02
>>89
誰もasmキーワードに触れなかったのは何故だろう(w

130 :デフォルトの名無しさん:02/06/26 18:14
>>108

131 :デフォルトの名無しさん:02/06/26 19:08
>>89
規格書を引くと 2.11 Keywords に書いてあるよ。

132 :デフォルトの名無しさん:02/06/26 21:35
>>53よ、くじけるな! 俺も同じ疑問を持った人間だ!
何も考えてない>>86>>87がマヌケなレスをしてるが、
とりあえず確認コードを書いてみるべさ。

class HOGE
{
  void foo(void){cout<<"foo"<<endl;}
};

auto_ptr<auto_ptr<HOGE> > ppHoge(new auto_ptr<HOGE>(new HOGE));

ppHoge->foo();

これでどうよ? 俺もまだ実験してないけど、これで
なにかが分かってくるんじゃないか?
あとで実験報告もするべさ!

133 :デフォルトの名無しさん:02/06/26 22:01
trieコンテナのあるライブラリって無いですか?
指定したノード以下の要素すべて列挙できる物が欲しいのですが。

134 :デフォルトの名無しさん:02/06/26 22:05
純然たる木構造だったら、自分で書いてもたいして手間にならないんじゃない?

135 :132:02/06/26 22:26
VC6SP5での実験結果!
以下のコードが、正常にコンパイルされることがわかった!

(ppHoge->operator->())->foo();
ppHoge->operator->()->foo();
ppHoge.operator->()->operator->()->foo();
(*ppHoge.operator->()).operator->()->foo();
(*ppHoge.operator->())->foo();

で、結論。
ようするに、「new演算子」と「operator new」みたいな関係だ!

(オブジェクト)->(メンバ)

ってのは、「->演算子」の呼び出し。「->演算子」を呼び出すと、
演算子の左側がポインタなら、直(じか)に「->演算」を行う。
演算子の左側がクラスなら、そのクラスのoperator->()を呼び出した後、
「->演算」を行う。それが、
> p->m = 7; // (p.operator->())->m = 7
の意味だっ。
だから、
ppHoge -> -> foo();
はコンパイルされない。こいつは、「->演算子」の右側に引数が来るべき
なのに「->演算子」が来ているから。
うむっ、おっけっ! どこにも矛盾はないぞっ! どうよ?>>53

(´-`).。oO(問題は……これってプロ言を読んだら書いてありそうだなってことだ……)

136 :デフォルトの名無しさん:02/06/26 23:03
>>135
そんな興奮せんでも仕様に書いてあるがな。
An expression x->m is interpreted as (x.operator->())->m for a class object…


137 :132:02/06/26 23:58
>>136
やっぱりかいっ!

(´-`).。oO(やっぱプロ言は買っとかんとあかんかね……)

138 :53:02/06/27 00:03
operator->()を呼び出した場合はさらにそのあとに -> があるかのようにあつかわれるのか?
というのが結局>>53の意図するところであったわけで・・・
漏れは「そうだよ」と言ってほしかっただけちゃうんかと・・・
ありがとう>>135・・・
ARMには>>136のように書いてあったようだね・・・

139 :デフォルトの名無しさん:02/06/27 00:09
endif に誰も突っ込まないのは何故だろう・・・
もしかしてホントにそうなの?

140 :53:02/06/27 00:14
>>137
THE C++ PROGRAMMING LANGUAGE(=プロ言?)にあったのが
> p->m = 7; // (p.operator->())->m = 7
です・・・

141 :デフォルトの名無しさん:02/06/27 00:24
> THE C++ PROGRAMMING LANGUAGE
これ本当にフルネームで言うのが大変。何かいい呼び名つけようか。

142 :デフォルトの名無しさん:02/06/27 00:26
(´-`).。oO(鬱病なのって俺だけかな・・・)

143 :デフォルトの名無しさん:02/06/27 00:26
C++3rd

144 :デフォルトの名無しさん:02/06/27 00:28
(´-`).。oO(俺の他にも鬱病がいたんだな・・・)

145 :デフォルトの名無しさん:02/06/27 00:52
表紙の特徴から・・・Dragon Book、ラクダ本、Red Book
著者から・・・K&R、GoF、Petzold

う〜ん、表紙は各国で違ってるし特徴ないし、著者の名前も呼びにくいし・・・


146 :デフォルトの名無しさん:02/06/27 00:57
>>145
表紙の特徴から・・・東映


147 :146:02/06/27 00:58
スマソ・・・

148 :デフォルトの名無しさん:02/06/27 01:03
いいかも。波しぶき具合が東映ぽくて。

149 :デフォルトの名無しさん:02/06/27 01:23
びあるね本
決定!

150 :デフォルトの名無しさん:02/06/27 01:50
昔のUNIXは3edとかいう名前がついてたと思った。
だからC++3edで十分。つーか既に古い。

151 :デフォルトの名無しさん:02/06/27 04:20
MinGWがgcc3.1になった━━━━━━(゚∀゚)━━━━━━ !!
Dev-C++
http://www.bloodshed.net/dev/devcpp.html

152 :デフォルトの名無しさん:02/06/27 04:35
>>151
gcc 3.x 系列、そろそろ安定した? 3.0.x の頃は、ちまちまとしたバグが出てた
みたいだけど。

(そろそろ乗り換え時か)

153 :デフォルトの名無しさん:02/06/27 12:01
>>152
かなりいいみたいだよ。もっともDev-C++はまだβ版だけどね。
MinGWは実行ファイルのサイズが小さくて幸せ。

154 :デフォルトの名無しさん:02/06/27 16:45
>MinGWは実行ファイルのサイズが小さくて幸せ。
ンなこたぁない

155 :デフォルトの名無しさん:02/06/27 17:28
>>154
そ・・・・それは、、VCとかと比べるとあまり変わらンけど、BCよりは
小さいかなと。msvcrt使ってるから。

でも、gcc3.1になってから、実行ファイルのサイズが大きくなった
ようだし。。。取り敢えずサイズが小さいという言葉は取り下げます。

156 :デフォルトの名無しさん:02/06/27 19:29
http://www.tietew.jp/cppll/archive/3217

このメッセージから始まっているスレッドで、
コンストラクタから例外を出さない方が良いとなっているんだけど
読んでもイマイチ理解できません。

class A {
 char* buf;
public:
 A():buf(new char[100]{}
 ~A(){delete buf;}
};

たとえばこんなクラスで、newが例外をthrowしても、
クラス構築失敗で問題無いと思うんですが。


157 :初心者以前:02/06/27 21:04
これからVC++を始めようと思うのですが、
つくったもの(exeファイル)をネット上で実行ってできるのでしょうか?
ダウンロードして、実行というものはみたことあるのですが
クリックして、ネット上で実行するものをみたことありません。

どうなのでしょうか

158 :名無しさん@カラアゲうまうま:02/06/27 21:09
文字列配列をnewで確保する方法ってこれであってますか?
char** all_line = new char*[n];
for(int i=0;i<n;i++)
all_line[i] = new char[100];

159 :デフォルトの名無しさん:02/06/27 21:23
なぜvector<string>を使わない?

160 :名無しさん@カラアゲうまうま:02/06/27 21:30
>>159
ごめんまだ入門者だから勉強してないんだ

161 :デフォルトの名無しさん:02/06/27 21:52
>>157
「ネット上で実行」の定義を述べて下さい。

162 :デフォルトの名無しさん:02/06/27 22:18
>>161
多分だけど、CGIプログラムのことじゃないかな?

163 :デフォルトの名無しさん:02/06/27 22:27
>>158
いいけど100文字が分かっているなら
char (*p)[100] = new char[n][100] ;
のほうがいいと思う


164 :名無しさん@カラアゲうまうま:02/06/27 22:32
>>163
ありがとうございました。

165 :デフォルトの名無しさん:02/06/27 22:48
>161

Terrariumとか「ネットで実行」にぴったしダネ

166 :デフォルトの名無しさん:02/06/28 01:13
みなさん自前のallocaterとか書いてますよね
俺も頑張ろう...

167 :デフォルトの名無しさん:02/06/28 01:18
書いてないヨ

168 :デフォルトの名無しさん:02/06/28 01:47
>>166
allocator・・・・・・

169 :166:02/06/28 10:42
うわーん孤立しちゃったよ〜

170 :デフォルトの名無しさん:02/06/28 17:16
Windowsでのエラー出力をストリームでやりたいのですが、
(最終的にはOutputDebugString()で出力する)
これって、ガリガリ書くしか方法は無いのでしょうか?

なんかSTL辺りに含まれてそうな気がするのですが(継承して使うとか)...

又、ソースを公開されているページでも良いので、ご存知でしたらお教えください。

trace << "エラー 変数=" << tmp << endl;
みたいに出来ないでしょうか...

171 :デフォルトの名無しさん:02/06/28 17:27
>>170
http://www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
ふぉらよ。あとは自力でなんとかしな。(勝手に引用失礼)

>>166
漏れもやってるよ。気にすんな。
でもインターフェースが気に入らずに結局vectorも自作したがな。
オラ不毛って言えよ!

172 :170:02/06/28 17:31
↑そういうの待ってました!!

どうもありがとうございます。

173 :デフォルトの名無しさん:02/06/28 19:34
詳しい人に質問!たとえば ホームページの管理人つまり制作者はそのホームページに来
ている人のどこまでの個人情報を知る事ができるの?あっipから住所等の個人情報が解る
なんてこという低レベルの回答は無しね。っていうか、ここには低レベルな人はいないとはおもうけど。

174 :デフォルトの名無しさん:02/06/28 19:39
板違い
Web制作板にいけ。

175 :デフォルトの名無しさん:02/06/28 19:48
>>173
その日にしたオナニーの回数や昨日食べた朝飯、
尻の使用回数などまでバッチリ分かりますが。

176 :デフォルトの名無しさん:02/06/28 20:44
//a.h
class a {
private:
  static int m_value;
public:
  static int Get() { return m_value; };
};

//b.cpp
#include  "a.h"
class b : public a {};

void main() {
  b::Get();
};

とすると、リンク時に「Error: 外部シンボル 'a::m_value' が未解決」
となるんですが、なぜなんでしょう?



177 :デフォルトの名無しさん:02/06/28 20:46
スタチックだから

178 :176:02/06/28 20:57
m_valueの実体が定義されてないからでした。

class a {
private:
static int m_value;
public:
static int Get() { return m_value; };
};
int a::m_value = 0;

179 :デフォルトの名無しさん:02/06/28 21:05
>>174
すみません、そっちにいきます


180 :デフォルトの名無しさん:02/06/28 21:39
#defineとconstの違いは何ですか?
constは関数の中などで軽く定数を持たせたいときに使う事でよいですか?

181 :デフォルトの名無しさん:02/06/28 21:44
>>180
Effective C++を買って読もう。君の質問の回答はそこにある。
ついで、将来君が疑問に思うであろう問題の回答の3割ぐらいはそこにあるはずだ。

182 :180:02/06/28 21:45
>>181
どうもです。
財布に厳しい本ですが探してきます。

183 :デフォルトの名無しさん:02/06/28 21:47
C++はプリプロセッサを使わないように改良されている・・・
by effective C++

184 :180:02/06/28 21:54
Effective C++
思ったより値段の安い書籍でしたね。
1万円ほどすると勘違いしてました。

>>183
ナルホドどうもです。

185 :デフォルトの名無しさん:02/06/28 23:38
便乗質問、EffectiveC++は図書館から借りてきて、暗記するほど
読み込んだのですが、Moreの方の評価はどんなもんでしょうか?

どちらかを購入したいのですが、間違いなく良書なれど既読の前者か、
立ち読みした感じ、ちょっと重箱の隅っぽい気がした未読の後者か…。
3800円を出せぬ貧乏人に、せめて知識をお与え下されば幸いです。

186 :デフォルトの名無しさん:02/06/29 00:04
>>185
Effective C++, More Effective C++, Effective STL 三部作は、食費を削っても
買うべき。

187 :デフォルトの名無しさん:02/06/29 00:09
STLもあったのか。買わねば・・・

188 :185:02/06/29 00:18
>>186
スマートポインタや例外処理の解説くらいならとりあえずいいかな
…と思って他のですが、前作に劣らぬ良書なんですねぇ。レスサンクスです。

食費\400/dayか………………(;´Д`)つI アト380ニチ…

189 :デフォルトの名無しさん:02/06/29 00:43
Exceptional C++も死んでも買いなさい

190 :デフォルトの名無しさん:02/06/29 00:48
Modern C++ Designもよろしく。

191 :デフォルトの名無しさん:02/06/29 00:52
C++で書かれたデザインパターンの良本はありませんか?

192 :デフォルトの名無しさん:02/06/29 00:55
>>191
俺の脳内で自動翻訳済みの物がある

193 :デフォルトの名無しさん:02/06/29 01:07
>>191
GoF のデザパタ本で良いと思うが。後は 190 も挙げてるけど Modern C++ Desgin
が template 使ってデザパタしてる。

194 :デフォルトの名無しさん:02/06/29 01:13
191
_φ(。。_) GoFは著者名でしたっけ。ミョウニチ本屋へ足を運んでみます。
ありがとうです。

195 :デフォルトの名無しさん:02/06/29 01:16
>>186 >>189-190
+ C++sardで6冊か(w

196 :デフォルトの名無しさん:02/06/29 01:18
洋書以外だと憂鬱本ぐらいか?(w

197 :デフォルトの名無しさん:02/06/29 01:46
>>195
Inside the C++ Object Model も入れとく。コンパイラの内部動作について理解を
深めるのに最適。STL 使うなら Generic Programming - STL による汎用プログ
ラミングも必読。あとは C++ only の本ではないが Linkers & Loaders も読んで
おいて損はない。

>>196
あれも良い本だよな。OO がらみだと、デザパタ本に憂鬱本、それからリファク
タリングあたりか。

(とりあえず、こんなもんじゃない?)

198 :デフォルトの名無しさん:02/06/29 03:34
憂鬱本って何ですか?

199 :デフォルトの名無しさん:02/06/29 03:59
>>198
『憂鬱なプログラマのための オブジェクト指向開発講座』
C++というよりはオブジェクト指向についての本だが。
わりと具体的に話を勧めていくので分かりやすい。

//しかし、必読書のレベルですらいくらかかるんだ?

200 :デフォルトの名無しさん:02/06/29 04:18
C++コンパイラのインストーラには、
これらの本を理解しているかのテストをするセクションが欲しいね。
クリアしないと絶対にインストールできないの。

201 :198:02/06/29 04:45
>>199
ありがとうございます。

202 :デフォルトの名無しさん:02/06/29 10:18
>>200
実際にやってみながら学ぶことができない罠。

203 :デフォルトの名無しさん:02/06/29 10:30
>>200
ネタにマジレスするのもなんだが、そりゃ辛すぎだわ。コンパイラで
実験してみないとわからん、みたいなこともあるんだし。

>>197
俺、STLに関する本はすでに『C++標準ライブラリチュートリアル&
リファレンス』と『Effective STL』を持ってるんだけど、
『Generic Programming - STL による汎用プログラミング』は、
それでも買ったほうがいいぐらいの本?
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/qid%3D1025313500/250-3796507-7440208
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/qid%3D1025313461/250-3796507-7440208
http://www.amazon.co.jp/exec/obidos/ASIN/4756134416/qid%3D1025313416/250-3796507-7440208
あと、『Inside the C++ Object Model』って、洋書?

204 :デフォルトの名無しさん:02/06/29 11:17
>>203
『Generic Programming ―』は、体系的・抽象的に書かれているので、
ある程度 STL が分かってから読むべき本のように思う。でも、読んでおくと
視野が広がるし、思考の経済というか、他方面への応用も利くと思う。

『Inside the C++ Object Model』は、以前トッパンから訳書が出ていたんだが、
同社の出版事業撤退により絶版状態のようだ。C++ を究めたいという酔狂もの
には必読。

205 :203:02/06/29 12:05
さんきゅ。憂鬱本とあわせて、その2冊も探してみるよ。

206 :デフォルトの名無しさん:02/06/29 22:57
VC7でこんな現象に出くわしたんだが、これってバグだろうか?
下記ソースをコンパイルすると
error C2535: 'Aho<T>::Baka Aho<T>::f(Aho<T>::Baka)' : メンバ関数は、既に定義または宣言されています。
こういわれる。

template<class T>
class Aho {
typedef T::Baka Baka;
//typedef int Baka; // 上の行をコメントアウトしてこの行を有効にするとコンパイルが通る
template<class U> Baka f(Baka baka);
template<> Baka f<int>(Baka baka) { return Baka(); }
template<> Baka f<char>(Baka baka) { return Baka(); }
};


207 :デフォルトの名無しさん:02/06/30 13:57
3行目ですでに使われてるBakaをもう一度使ってるからじゃないの?

208 :デフォルトの名無しさん:02/06/30 16:43
そゆ問題では無いと思う。
テンプレート引数に依存した不明な型Bakaを引数にとった関数は
その特殊化よりも不明な引数の一致を優先して判断されているように
見受けられる。バグかな・・。

209 :デフォルトの名無しさん:02/06/30 17:36
>>208
とりあえず gcc 2.95.3 でも Borland C++ Compiler 5.5.1 でもコンパイルエラー
になることは確認したけど。

210 :デフォルトの名無しさん:02/06/30 18:41
配置構文(゚∀゚)デキタ!

211 :デフォルトの名無しさん:02/06/30 19:16
>>209
するとC++として不正だって事?
なにがダメなんだろ・・・。


212 :デフォルトの名無しさん:02/06/30 19:23
もしかして、
typedef typename T::Baka Baka;
じゃない?

213 :デフォルトの名無しさん:02/06/30 20:09
>>212
だめですた・・

214 :デフォルトの名無しさん:02/06/30 20:54
教えてください。
Cを一通りできるとして
C++を業務レベルまでマスターするには
どれくらいかかるんですか?


215 :デフォルトの名無しさん:02/06/30 21:01
STL3年デザパタ5年

216 :デフォルトの名無しさん:02/06/30 22:23
>>206
 typedef T::Baka Baka;
の意味を考えたらよくわかるはず.
当然,class T ではすでに T::Baka が typedef されている必要がある訳で.
あとは >>212 のいうとおり,
 typedef typename T::Baka Baka;
は必須の気が.


217 :デフォルトの名無しさん:02/07/01 00:40
>>216
いや、結果は変わらないんですよ・・。in VC7
他のコンパイラではどうなんでしょうか?

template<class T>
class Aho {
typedef typename T::Baka Baka;
//typedef int Baka; // 上の行をコメントアウトしてこの行を有効にするとコンパイルが通る
template<class U> typename Baka f(typename Baka baka);
template<> typename Baka f<int>(typename Baka baka) { return Baka(); }
template<> typename Baka f<char>(typename Baka baka) { return Baka(); }
};


218 :デフォルトの名無しさん:02/07/01 02:00
>>217
だ か ら
具体的にどんなインスタンス作ってるか教えれ
答えるのはそれからだ


219 :デフォルトの名無しさん:02/07/01 09:40
>>218
宣言しただけ。
インスタンスは作らない状態でエラーが出ます。

220 :デフォルトの名無しさん:02/07/01 10:46
>>219
VC6 だと何事もなく通るけど。

221 :デフォルトの名無しさん:02/07/01 13:18
>>220
・・本当だ。
つまりVC7のヴァグってことでOK?
ゲイツ氏ね

222 :デフォルトの名無しさん:02/07/01 13:22
・ここではどういう意味で「インスタンスを作る」という句を使っているのか?
・TにBakaを持っていないクラスを渡しているんじゃないか?
・VC6で通って、VC7で通らないことってあるの?

223 :デフォルトの名無しさん:02/07/01 14:18
>>220
今試せないけどソースは上に上げたあれのみです。
typedef Aho<ほにゃらら>
もしてないし、ましてインスタンスの作成もしてないです。

224 :デフォルトの名無しさん:02/07/01 18:17
お取り込み中申し訳ないのですが、新しく質問しても良いでしょうか?

基本クラスのポインタに派生クラスのオブジェクトをもたせている場合、
基本クラスのポインタをdeleteしただけでは派生クラスのデストラクタは
呼んでくれないのでしょうか?今書いているソースでそうなっていて
メモリリークを起こして困っているのですが・・・。

225 :デフォルトの名無しさん:02/07/01 18:22
>>224
基底クラスのデストラクタを virtual にする必要があります。

226 :デフォルトの名無しさん:02/07/01 18:29
>>225
あ、一応やってみています。当然ながらクラスと同名なので、デストラクタの
名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
やってみても呼んでくれてないようなんですが・・・

227 :デフォルトの名無しさん:02/07/01 18:43
>>226
> 名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
もちろん。っつか、大抵の実装では名前なんか見てなくて vptr->vtbl に書き
込まれたポインタを参照するだけだし。

ダメだというそのプログラム、簡略化してテスト用のコードを張ってくれ。

228 :デフォルトの名無しさん:02/07/01 19:07
>>227
ちょっと今取り込んでいるので、もし良かったら夜に張るので
お願いできますか?

229 :アポストロフィーS:02/07/01 19:11
ちょっと質問です。
JPEG画像を縮小して保存するプログラムを作りたいんですが、自分でバイナリ読み取ってピクセル圧縮して色とかも平均出して・・・とかってやらないと駄目でしょうか。
かなり大変そうなんですが・・・ なんか簡単にできるライブラリとかありませんか?

230 :廻し者:02/07/01 19:36
x86 で Windows なら、インテルパフォーマンスライブラリにある、
Intel Image Libary と Intel JPEG Library なんか使ってみては
どうでしょうか。

ttp://www.intel.com/software/products/perflib/

231 :デフォルトの名無しさん:02/07/01 19:57
g++のios::begがあった〜(疲労)
パパこれを探すのに5000ファイルくらい調べちゃったよ

232 :デフォルトの名無しさん:02/07/01 20:12
素直にgrep汁

233 :デフォルトの名無しさん:02/07/01 20:28
>>227
単なる手前のボケでした。平身低頭、申し訳ありません。
一応顛末を書いておくと、基底クラスや派生クラスが親子構造で混在するような
システムを作っていて、deleteする時はデストラクタで子供を次々deleteしていく
ようにして、一変に消せるようにしていたのですが、条件判定に変なものを使って
失敗していたようです。お騒がせしました。

直したら立派に呼んでくれて安心しました。

234 :デフォルトの名無しさん:02/07/01 21:02
>>231
locate ios_base で一発じゃないのか?

235 :234:02/07/01 21:12
まちがえた…
locate '*/ios'
とでもしてくれ。

236 :デフォルトの名無しさん:02/07/01 22:37
>>230
どうもです。しかし・・・英語がむずい・・・;
なんか無理そうだ・・・とりあえず落としてみます。

237 :229:02/07/01 22:38
すいません、236は僕です。あと下げ忘れました。スマソ!!

238 :デフォルトの名無しさん:02/07/01 22:38
libjpegなら日本語解説も沢山ある

239 : :02/07/02 00:03
クラスのメンバ関数の引数の配列の数に変数を使いたいのですが
できますか?
むりなら代わりとなる方法を教えてください

240 :デフォルトの名無しさん:02/07/02 00:06
配列の数って要素数?

241 :デフォルトの名無しさん:02/07/02 00:23
>>239
void A::foo(int array[], int count)
{
for (int i = 0; i < count; i++) cout << array[i];
}
で何か不満でも?

242 :デフォルトの名無しさん:02/07/02 00:54
void A::foo(int arr[N])
の N を変数にしたいってことなのかな。飛躍し過ぎ?

243 :デフォルトの名無しさん:02/07/02 00:54
>>239
vector

244 :デフォルトの名無しさん:02/07/02 01:00
>>241>>239 微妙にスレ違い
void A::foo(vector<int> ints)
{
for (vector<int>::iterator i = ints.begin(); i != ints.end(); ++i) {
hanatanhalahala(i);
}
}


245 :デフォルトの名無しさん:02/07/02 01:01
template<size_t N> void f(int arr[N]);

char a[256];
f(a);

246 :デフォルトの名無しさん:02/07/02 01:05
>>245
動的なサイズ変更に対応できないのでアウト

247 :デフォルトの名無しさん:02/07/02 01:07
引数だと一次元目の[]の中身って意味なさないような。

248 :デフォルトの名無しさん:02/07/02 01:08
ようは、239の質問が微妙ということでいいですか?

249 :デフォルトの名無しさん:02/07/02 01:14
>>246
配列は動的ではない

250 :デフォルトの名無しさん:02/07/02 01:16
>>248 いいです

251 :デフォルトの名無しさん:02/07/02 01:20
>>244
スレ違いを指摘するんなら、もっとスレ違いらしさを出したコードにしとけよ。
void A::foo(vector<int>& ints)
{
  for_each(ints.begin(),ints.end(),hanatanhalahala);
}

252 :デフォルトの名無しさん:02/07/02 01:20
正直、>>239の態度にむかついた。

253 :デフォルトの名無しさん:02/07/02 01:20
超イイ!!

254 :デフォルトの名無しさん:02/07/02 01:22
>>245
へぇ〜。面白いね。配列渡しは通らないけども
#include<iostream>

template < int N >
void f(char (&arr)[N]) {
for(int i=0;i<N;i++) std::cout << arr[i] << "\n" ; } ;

int main() {
char s[] = "2channel" ;
f(s) ; }


255 :デフォルトの名無しさん:02/07/02 01:26
テンプレート引数をそこまで自動で判断してくれるんだから、
次期C++には型推論が導入されたりしてな。

256 :デフォルトの名無しさん:02/07/02 01:33
型推論・・・凄い時代になったものだ
まあ技術は進歩し続けているわけだけど。

257 :デフォルトの名無しさん:02/07/02 01:33
おお、すげえ。

258 :デフォルトの名無しさん:02/07/02 01:36
これ以上コムパイラが対応しきれるかどうか・・・。

259 :デフォルトの名無しさん:02/07/02 01:48
おおーできたー。

260 :デフォルトの名無しさん:02/07/02 01:55
http://pc.2ch.net/test/read.cgi/tech/1008593126/741

261 :デフォルトの名無しさん:02/07/02 02:03
ポインタに対応できないから実用上無意味だけども

262 :デフォルトの名無しさん:02/07/02 02:19
情けないことにどういう理屈なのかわからない。

263 :デフォルトの名無しさん:02/07/02 02:43
void f( const char *p )
{
  std::cout << "pointer" << std::endl;
}
template< unsigned N >
void f( const char (&x)[N] )
{
  std::cout << "template array " << N << std::endl;
}
int main()
{
  const char x[] = "array?";
  f( x );
  f( &x[0] );
  return 0;
}

・・・template バージョンが呼ばれないです。(cygwin g++)
なんで?

264 :デフォルトの名無しさん:02/07/02 02:47
template版よりも、通常のfの方が呼び出しのマッチングに関して優先順位が
高いからじゃないの?

265 :デフォルトの名無しさん:02/07/02 03:01
>>263
こうやったら「曖昧」と叱られたよ。

template <unsigned N>
void f(const char (&x)[N])
{
std::cout << "template array " << N << std::endl;
}

template <>
void f(const char *p)
{
std::cout << "pointer" << std::endl;
}

int main()
{
const char x[] = "array?";
f(x);
f(&x[0]);
return 0;
}

266 : :02/07/02 03:05
面白いな、コレを多次元配列でやるとどうなるんだろう

267 :263:02/07/02 03:06
template< typename T >
void f( T *p )
{
  std::cout << "pointer" << std::endl;
}
template< typename T , unsigned N >
void f( T (&x)[N] )
{
  std::cout << "template array " << N << std::endl;
}

・・・こっちにしてもだめですた。
実行確認せずにこれの結果って予想できるもん?
や、決まってるんだろうけどさ。

268 :デフォルトの名無しさん:02/07/02 03:12
Modern C++ Design買ったんだけど、俺の乏しい理解力では到底内容が
わからなかったので、もう少し易しいtemplateテクニックを満載した本を
誰か出版して欲しい。

269 :デフォルトの名無しさん:02/07/02 03:13
>>268
そーゆー路線だと、結城さんあたりかねぇ。

270 :デフォルトの名無しさん:02/07/02 03:15
どうもchar x[] = "array?";のxが参照としてはchar[]だけども
式の評価ではchar*になってこちらが優先されるようだ。
ためしにf(&x)とすれば配列バージョンが呼ばれる

271 :デフォルトの名無しさん:02/07/02 03:17
>>269
C Magazineに寄稿している人だよね?ホームページを見てみたんだが、
C++関連の内容はまだうpしてないようだ。

272 :デフォルトの名無しさん:02/07/02 03:19
>>270
本当だね。この実行結果は実に興味深い。

template <unsigned N>
void f(const char (&x)[N])
{
std::cout << "template array " << N << std::endl;
}

template <>
void f(const char *p)
{
std::cout << "pointer" << std::endl;
}

int main()
{
const char x[] = "array?";
f(&x);
f(&x[0]);
return 0;
}

273 :デフォルトの名無しさん:02/07/02 03:46
データベースをクライアントから操作するためのプログラムって
ほとんどVBとかで十分なんですかぁ?VCってあまり
使われてないような、

274 :デフォルトの名無しさん:02/07/02 04:05
>>273
プログラム側に何を期待するかによる。

スタンドアロンの VB 出すまでもなく Access VBA や Web がらみだと VBScript で
間に合うことも多いし、逆に VC でなければやっとれん、という事もある。

275 :274:02/07/02 04:10
ただし、JAVAはつねにやっとれん。

276 :デフォルトの名無しさん:02/07/02 04:14
>>273
うちの会社の基幹業務はAccessのVBAでやっとるよ。
最初のうちはスイスイ動いていたが、最近データの量が肥大して、
検索にだんだんと時間がかかるようになってきた。この先不安。

277 :247:02/07/02 04:23
>>275
騙られた……。

確かに JDBC 1.0 の頃はかなり「やっとれん」感が強かったが、最近は
触ってないので知りません。

278 :278:02/07/02 07:56
アルファベットが1文字以上連続しているものを単語と
  呼ぶことにする。コマンドライン指定されたC++のソース
  ファイルを読み込みながら、単語ごとにその出現回数を
  カウントしておく。すべての単語が読み込み終わったら、
  まずアルファベット順に単語とその出現回数を表示し、
  その後、出現回数の多い順に単語を表示するようなプロ
  グラムを作成せよ。
   ただし、単語にはアルファベットの大文字や小文字が
  混じっていてもよいものとし、その場合大文字小文字の
  区別なく、アルファベット順になるようにせよ。
   また、ソートする部分については、この問題に合うソ
  ート用の関数を独立させて作ること。ソートの方法は何
  でもよいものとする。
-----<
わかります?

279 :デフォルトの名無しさん:02/07/02 07:58
>>278
宿題スレ逝け

280 :デフォルトの名無しさん:02/07/02 08:47
>>278
わかります。

281 :デフォルトの名無しさん:02/07/02 09:53
C++スレなんかで聞いたら10人中11人ぐらいソートせずに終わらせると思うが(藁

282 :デフォルトの名無しさん:02/07/02 10:14
map使わない方が面倒だな。

283 :デフォルトの名無しさん:02/07/02 10:20
おいお前等。
スタンダードアイオーでもイオストリームでもいいんだが、リファレンスっちゅうのはどこにあるんですか?

284 :デフォルトの名無しさん:02/07/02 10:28
禿しく>>281の言う通り。

オレモマダマダダダシノウ...(-_-)

285 :デフォルトの名無しさん:02/07/02 10:28
>>283
FILE*&
std::iostream&

286 :よっし〜:02/07/02 10:29
C++の派生クラスの実装を、C言語だけで記述する事は可能でしょうか?

3DSMAXのプラグインSDKの仕様が、コンパイラのバージョンを指定しているけど、
そのバージョンを持っていないので、C言語でクラスのレイアウトに何とか整合してやって、
リンク可能な状態に持っていけないかなぁって・・・


287 :デフォルトの名無しさん:02/07/02 10:30
コンストラクタとデストラクタがなくていいなら何とか。

288 :よっし〜:02/07/02 10:50
> コンストラクタとデストラクタ
えっ? コンストラクタとデストラクタ駄目ですか?
基底クラスのデストラクタがvirtual宣言されてマス。


289 :デフォルトの名無しさん:02/07/02 11:06
基底クラスの物は呼ばれるけど、
派生(自作)クラスのデストラクタは呼ばれない。
それから、思いっきり実装依存になるよ。
CでCOMクラスを実装するのと同じ方法でやる。

290 :デフォルトの名無しさん:02/07/02 11:15
ああわかってる
・・・・
わかってるってば!

291 :デフォルトの名無しさん:02/07/02 11:26
  人
(...・.・.) ?

292 :デフォルトの名無しさん:02/07/02 11:28
C言語で仮想関数?(((( ;゚Д゚))))ガクガクブルブル

293 :デフォルトの名無しさん:02/07/02 11:40
  人
(...・.・.) ?

294 :デフォルトの名無しさん:02/07/02 11:43
>>286
バージョン指定があるってことは、クラス名の mangling があってないと
ダメってことではないの?

295 :よっし〜:02/07/02 12:03
> それから、思いっきり実装依存になるよ。
それは致し方無い事です。そもそも「3DSMAXのプラグイン」という事自体が実装依存なので。

> 派生(自作)クラスのデストラクタは呼ばれない。
これが問題だなー。でもなんで呼ばれないんだろう?
実装依存で、むちゃくちゃやって、何でも出来そうな気がするのだけど・・・
デストラクタが呼ばれるしくみが良く解ってないカモ

> クラス名の mangling があってないと
これも実装依存で、何とか実現できないものでしょうか?

ふむー。そもそもVCって、CとC++を区別しちゃってて、CからC++のクラスにアクセスするのって無理なのかなぁ?


296 : :02/07/02 16:21
Modern C++ Designの表紙に載ってるようなナイフがホスィ。

297 :デフォルトの名無しさん:02/07/02 17:15
Modern C++ Designを持っていないやしはC++プログラマにあらず

298 :デフォルトの名無しさん:02/07/02 17:35
     A
    (゚o゚)<持ってなくて悪かったなハゲー
    (ー)ー
     ))

299 :デフォルトの名無しさん:02/07/02 18:27
2次元配列を動的に確保したいのですが
class A{
public:
BYTE x;
BYTE y;
BYTE p
};

A** a;
void Load(int x,int y){
a=new A*[x];
for(int i=0;i<x;i++){
→a[i]=new A[y];
}

}

int main(){
Load(100,100);
}

こうやると強制終了ダイアログが出て、落ちます。
VC++のエラーメッセージは
0xC0000005: Access Violation。で、
デバッガでは→の部分に印がつきます。
どこが悪いのでしょうか。

300 :デフォルトの名無しさん:02/07/02 18:49
BYTE p;

301 :あきら:02/07/02 18:55
VC++できるひといます?


302 :デフォルトの名無しさん:02/07/02 18:55
>300
すみません。うつし間違えました。仰せのとおり;がpの後ろに必要です。

303 :あきら:02/07/02 18:56
VC++できるひといます?

304 :ゆたか:02/07/02 19:00
数値の加算、減算、乗算、割算のできるwindowsプログラム作りたいのですが、
まったくわかりません。誰か作っていただけませんか?

305 :デフォルトの名無しさん:02/07/02 19:15
んで、その二次元配列にはstd::vectorを使えない理由はあるのか?

306 :デフォルトの名無しさん:02/07/02 19:19
>305
はい、vectorを使っても落ちました。
ちなみにそのときのコードは
vector <vector <MapData> > a;
void Load(int x,int y){
a.assign(x);
for(int i=0;i<x;i++){
→a[i].assign(y);

}
}
これがまた→のところで落ちました。

307 :デフォルトの名無しさん:02/07/02 19:27
実は>>299ではAのコンストラクタを省略してて
コンストラクタでの処理がおかしいと予想。

308 :デフォルトの名無しさん:02/07/02 19:29
実は16bitのDOSアプリ、とかいう罠、はナイよな……

309 :デフォルトの名無しさん:02/07/02 19:37
……
assignでなにがしたかったんだ?

310 :デフォルトの名無しさん:02/07/02 19:54
>309
すみません。resizeでした。
vector <vector <MapData> > a;
void Load(int x,int y){
→a.resize(x);
for(int i=0;i<x;i++){
a[i].resize(y);

}
}

しかしこうすると今度は上のほうで落ちました。

311 :デフォルトの名無しさん:02/07/02 19:55
>307
コンストラクタは
A(){
x=0;
y=0;
p=0;
}
となっています。

312 :デフォルトの名無しさん:02/07/02 20:00
class A{
public:
& nbsp;BYTE x;
  BYTE y;
  BYTE p;
};

vector< vector<A> > a;

void Load(int x, int y)
{
 a.resize(x);
  for(vector< vector<A> >::iterator i = a.begin(); i != a.end(); ++i)
  {
    i->resize(y);
  }
}

int main()
{
  Load(100, 100);
  a[99][99].x = 0xff;
  printf("0x%X\n", a[99][99].x);
}

どこで落ちるんだ?

313 :デフォルトの名無しさん:02/07/02 20:10
>312
今いろいろやっていて気づきました。
a.resize(10)
だったら大丈夫なのですが
a.resize(100)だと落ちます。
メモリは192MB積んでいるのでメモリが足りないはずはないのですが・・・
タスクマネージャで調べても利用可能領域は40000KBありました。

314 :デフォルトの名無しさん:02/07/02 20:26
sageてしまいますた

315 :デフォルトの名無しさん:02/07/02 20:28
サイズが大きすぎ(2G以上とか)でnewがNULLを返してる?

316 :デフォルトの名無しさん:02/07/02 20:31
sizeof(A)とxとyは幾つなんだろう

317 :デフォルトの名無しさん:02/07/02 20:33
int dd=sizeof(A);
3でした。


318 :デフォルトの名無しさん:02/07/02 20:35
うむ。VCのnewは例外を投げないので、返値がNULLかどうかチェック
した方がよい。

319 :デフォルトの名無しさん:02/07/02 20:40
>>299(のp;を修正したもの)でも、落ちる要素は全くない
aという変数が別ファイルなりで別の型として宣言されてたりしないかな

320 :デフォルトの名無しさん:02/07/02 20:43
或いはメンバ変数と仮引数とグローバル(static)変数か(xとyも両方で使われてるし)

321 :デフォルトの名無しさん:02/07/02 21:00
//ヘッダ
class MapData{
public:
BYTE x;
BYTE y;
BYTE p;
MapData(){
x=0;
y=0;
p=0;
}
}

class MapManager{
vector< vector<MapData> > data;
int Width;
int Height;
public :
BOOL Load(char* MapName);
}
ヘッダ//

322 :デフォルトの名無しさん:02/07/02 21:00

//cpp
BOOL MapManager::Load(char* filename){

int fh=_open(MapName,_O_RDONLY);

int StrLen;
char buf[256];
_read(fh,&StrLen,sizeof(StrLen));
_read(fh,buf,StrLen);
_read(fh,&Width,sizeof(int));
_read(fh,&Height,sizeof(int));

data.resize(Width);

for(vector< vector<MapData> >::iterator i = data.begin(); i != data.end(); ++i)
{
i->resize(Height);
}
for(int s=0;s<Width;s++)
{
for(int j=0;j<Height;j++)
{
_read(fh,&data[s][j].p,1);
_read(fh,&data[s][j].x,1);
_read(fh,&data[s][j].y,1);
}
}
_close(fh);
return TRUE;
}
cpp//

MapManager* mm=new MapManager();
int WinMain(----){
//
mm->Load("test");
//
return 0;
}
詳細です。クラスだと何か違いますか?

323 :デフォルトの名無しさん:02/07/02 21:02
int fh=_open(filename,_O_RDONLY); でした。すみません。

324 :デフォルトの名無しさん:02/07/02 21:18
すいません。
クラスの便利さがわかりません。
どなたか噛み砕いて教えてください

325 :デフォルトの名無しさん:02/07/02 21:23
>>324
・メンバを非公開にできる。
・メンバ関数を持てる。
・継承が使える。
・仮想関数を使ってポリモーフィズムが実現できる。

などなど。

326 :デフォルトの名無しさん:02/07/02 21:24
まずは使うべし。使って体感しる!

327 :324:02/07/02 21:32
だめぽ。
なんか構造体と違いがあまりわかりませぬ(´・ω・`)

328 :デフォルトの名無しさん:02/07/02 21:34
手始めに憂鬱本を読んでみよう>>324

329 :デフォルトの名無しさん:02/07/02 21:35
>>327
>>326サソも言っておられるが、こればかりは口で説明してもなかなか
わかってもらえますまい。

簡単なクラスとそれを使ったサンプルをいくつか作ってみれば自然に
理解できるよ。

330 :324:02/07/02 21:39
ん〜
今の仕事で、作ってます。
クラスだけえんえんと…
実際業務でクラスなんか作っても
使う部分の作業に当たらせてもらえません。
そこで、こんな仕様のプログラムでここを
クラスにするとクラスのありがたみがわかる!!
なんて、仕様書どなたかもっていませんか?
皆様レスアリガトウございます

331 :デフォルトの名無しさん:02/07/02 21:43
stlを使えばありがたみが分かる

332 :デフォルトの名無しさん:02/07/02 21:56
がんがれ

333 :デフォルトの名無しさん:02/07/02 22:02
>>330
すごく「例えば」の話になるけど、リスト構造を扱う時、ポインタの付け替えを
すべてメンバ関数に任せればよいようになる。

あまりキチキチに非公開にしてしまうと効率が落ちることがあるが、バグは
どんどん出にくくなる。

334 :デフォルトの名無しさん:02/07/02 22:19
>>321
関係ないかもしれないがMapDataにコピーコンストラクタを自分で作っても同じ?
vectorはresizeとかのときコピーコンストラクタよんでるとおもうけど。

335 :324:02/07/02 22:33
なるふぉど…
確かにクラスの中だったらメモリは消えないですからね。
ポインタを頭に入れてみると確かに便利かもしれませんね。。。


336 :デフォルトの名無しさん:02/07/02 23:20
>>335
んー、そうですね、クラスの中だからメモリが消えないというより、
リスト構造の細かいちまちまとした部分まで見ずに済むようになり、
プログラムの設計に専念できるようになると言ったらいいかな?

その代わり今までみたいに構造体のポインタを持って関数を
コールして操作するということはしなくなる(やろうと思えばいくら
でもできるが敢えてしない)ので、カナーリ感覚が違うんですよ。

337 :デフォルトの名無しさん:02/07/02 23:24
std::stringや、CStringなどの文字列クラスを使ってみれ。
連結や比較なんかは演算子で出来るし、バッファのことは何も考えなくても
よきにはからってくれる。

338 :デフォルトの名無しさん:02/07/03 00:04
>>321
Width と Height に値を、resize に渡す前に確認してみたらどうか?

339 :デフォルトの名無しさん:02/07/03 03:13
#include <new.h>
#include <new>

int new_nh(size_t)
{
 throw std::bad_alloc();
 return 0;
}
_set_new_handler(new_nh);

これをプログラムエントリで実行して、例外を投げるようにしてみな。
vector<>内でメモリが確保できないと、通常はリカバリできないけど
例外を投げるとどうなっているかが分かる。

340 :デフォルトの名無しさん:02/07/03 04:30
HRESULT __stdcall
_com_dispatch_raw_propget(IDispatch*, DISPID, VARTYPE, void*) throw();

このように関数のプロトタイプ宣言に throw() と書いてあるものがありますが
これはどういう効果があるのですか?
この関数が呼ばれた瞬間に例外をスローするのですか?


341 :デフォルトの名無しさん:02/07/03 06:03
>>340
逆です。この関数は例外を投げないという意味です。

342 :デフォルトの名無しさん:02/07/03 10:19
>>339
#include <new.h>
#include <new>

int new_nh(size_t)
{
 throw std::bad_alloc();
 return 0;
}


WinMain(){

_set_new_handler(new_nh);
mm->Load(....);
}
BOOL Load(....){
//
try{
→data.resize(Width);
}catch(std::bad_alloc e){

}
//
}
こうやってみたのですが、→でハンドルされていない例外といわれます。
catch(...)だと大丈夫なのですが。デバッガは__sbh_alloc_block(int)というコンテキストで止まっています。

343 :デフォルトの名無しさん:02/07/03 10:19
age

344 :デフォルトの名無しさん:02/07/03 10:23
VB/BasicのGoSubに代わるCの命令ってなんかある?

345 :デフォルトの名無しさん:02/07/03 10:32
>344
関数を呼ぶだけじゃないの?

346 :344:02/07/03 10:34
>>345
関数呼びたくないの。
その関数内でしか持ってない、必要な変数多いし。

347 :デフォルトの名無しさん:02/07/03 10:37
>346
DQNですか?

348 :デフォルトの名無しさん:02/07/03 10:38
必要な処理をマクロ化するとか?(実質上コピペと変わらんが)

349 :344:02/07/03 10:43
んー、やっぱ普通の方法無いのね。

>>348
今やってるのがそれ。

>>347
秒間何万回も使うからオーバーヘッドが
大きいってのもあるんよ。

350 :デフォルトの名無しさん:02/07/03 10:51
>>342
catch(std::bad_alloc&)で捕まえてみて。


351 :デフォルトの名無しさん:02/07/03 11:28
>>349
インラインアセンブラで入り口と出口を作って、その間にサブルーチンを書く。

352 :デフォルトの名無しさん:02/07/03 11:48
>>349
必要な変数はクラスにまとめておいて、
引数を少なくしたメソッド呼び出しにするのがC++流。

つか、gotoか。

353 :344:02/07/03 11:59
レスありがとう。
とりあえず351の方法使うです。
(俺も無作法だとは思うんだけど。)

あともう一つだけ。
デバッグウィンドウに数字を表示したい時ってどうしてるの?

354 :デフォルトの名無しさん:02/07/03 12:00
混じれ酢してみるか。
関数呼び出しはVBのGoSubより何倍も早いから気にするな。
どうしても気になるならインライン関数にするなりご自由に。

>秒間何万回も使うからオーバーヘッドが大きいってのもあるんよ。
なんかムカつく言い方だな。
そんなに速度が気になるんじゃアセンブラで最適化しろ

355 :デフォルトの名無しさん:02/07/03 12:01
デバッグウインドウってなんだよ
C++にそんなもんねーぞ

356 :デフォルトの名無しさん:02/07/03 12:10
>>344
BCB厨のDQNに認定

357 :356:02/07/03 12:12
補足
BCB厨だからDQNなんじゃないぞ、
そんなことDQNだと言うんだ

358 :デフォルトの名無しさん:02/07/03 12:28
なしてBCB?

359 :デフォルトの名無しさん:02/07/03 12:29
>>347
でしょう。

要件があるなら、それを列挙した上で質問すべき。無条件で質問しておいて、
出てきた方法に対して煽りを返すのは、

 細かいことは書かなくても、
  みんな超能力者だから、
   俺のことは分かってるはずだ

という思い込みがあるから。

>>349
場合によっては inline 関数が使えるかもな。ただし、ゲーム作ろうとしてる
ならムダだぞ。

360 :デフォルトの名無しさん:02/07/03 12:32
> 出てきた方法に対して煽りを返すのは

これどこ?

361 :デフォルトの名無しさん:02/07/03 12:32
>350
またハンドルされていない例外になってしまいました。
ためしにvector < vector<double> > data2;
data2.resize(100)でやってみても、やはり同じように落ちました。

362 :デフォルトの名無しさん:02/07/03 12:36
>>360
349

363 :デフォルトの名無しさん:02/07/03 12:37
>>360
>>346
煽り返してるとまでは思わないが

364 :デフォルトの名無しさん:02/07/03 12:42
>350
いま、Releaseでビルドすると落ちませんでした。Debugだと落ちます。なぜでしょう?

365 :デフォルトの名無しさん:02/07/03 12:50
>>354
一応、俺も馬路レス。
関数呼び出し自体より、変数を引き渡す方を考慮しているものと思われ
10個とか引数あったらさすがに差が出る。

366 :デフォルトの名無しさん:02/07/03 12:51
関数内の多数のローカル変数をサブルーチンでも使いたい。
サブルーチンは呼ばれる回数が多いので変数を一個一個渡すのはイヤ。

と彼は質問すればよかったのかな?
こういう場合はやっぱ>>352か強引に>>351のようにするのかな。

367 :デフォルトの名無しさん:02/07/03 12:54
>>364
下のソースで落ちる?

#include <vector>
#include <iostream>

main()
{
 std::vector< std::vector<double> > data;
 data.resize(100);
}


368 :デフォルトの名無しさん:02/07/03 12:54
iostreamは余計だ。

369 :デフォルトの名無しさん:02/07/03 12:55
構造体をポインタで渡すのは駄目?

370 :デフォルトの名無しさん:02/07/03 12:58
>>369
むしろ推奨。

371 :デフォルトの名無しさん:02/07/03 13:03
多数のローカル変数ってのにいちいち
構造体名が付くのがうざいけど仕方ないか。

372 :344:02/07/03 13:08
いや、煽るつもりはなかったんだけど、
gotoがあるならgosubもあるかな、と思ってたから。

なんか荒らしたみたいでスマソ。

373 :デフォルトの名無しさん:02/07/03 13:11
>>369
ダメ。const参照で渡せ

374 :デフォルトの名無しさん:02/07/03 13:12
>367
それだけのソースなら落ちません。

375 :デフォルトの名無しさん:02/07/03 13:21
>>374
ソース全部上げられるか?
たぶん余所でメモリ壊してるんだと思う

376 :デフォルトの名無しさん:02/07/03 13:58
VCでDEBUG_NEWが定義されてるとか

377 :デフォルトの名無しさん:02/07/03 15:34
STLport使ってて、_STLP_DEBUGが定義されてないとか。
前にこれで関係のないところのメモリ壊されてハマった記憶あり。

378 :デフォルトの名無しさん:02/07/03 16:02
>377
定義してみたら落ちませんでした。これは、なぜですか?

379 :377:02/07/03 16:42
>>378
デバッグ版とリリース版でnew/deleteが違うから。
リリース版のnewで確保したメモリをデバッグ版deleteで削除したりするとヒープが破壊される。

380 :デフォルトの名無しさん:02/07/03 19:34
>379
なるほど。おかげで助かりました。どうもありがとうございました。

381 :デフォルトの名無しさん:02/07/03 22:37
>>372
別に荒らしだとは思わなかったけど、
見事に定番通りのDQNぶりが見ていて微笑ましかった。
いつか「あのときあんな恥ずかしい書き込みしちゃった…」って思えるくらいに
スキルが上がるといいね。

382 :デフォルトの名無しさん:02/07/03 22:40
ヤナヤシ

383 :デフォルトの名無しさん:02/07/04 02:37
boost1.28をvc6-stlportでインストールしたんですけど
regexのビルドって
bjam〜"-sTOOLS=msvc-stlport"で作った物と
regexのディレクトリでmakeしたもの、どっちが正しいんでしょうか?
bjamで作った物はbin-stageディレクトリに
boost_regex(_debug).dll/lib
があり、
makeしたものは
 *mss(d) SingleThread-static(debug)?
 *mdi(d) MultiThread-dynamic(debug)?
 *mds(d) MultiThread-static(debug)?
までは分かるのですが、mdidd/mssdd/mdsddが分からないです。
どれを使うのが正しいんでしょうか?

384 :デフォルトの名無しさん:02/07/04 03:09
VC++だと、ヘッダの#pragmaで勝手にリンクするほうを使えばいいと思うが。

385 :デフォルトの名無しさん:02/07/04 03:50
>>384
レスどうもです。#pragmaでリンクされるのは後者なので、
bjamで生成した物は不要だから破棄しても良いということですか?


386 :_:02/07/04 05:04
Javaのインターフェースみたいに多重継承を使おうと思ったのですが

class IA { public: virtual void Func1()=0; };
class IB { public: virtual void Func2()=0; };

class C : public IA, public IB {
  public: void Func1() { puts("C::Func1()"); }
  public: void Func2() { puts("C::Func2()"); }
};

void* obj = new C;
IA* a = obj; a->Func1();
IB* b = obj; b->Func2();
でどっちもFunc1()が呼ばれて困ってます。void*をC*にしたらちゃんと動きました。
IA*にC*として代入する時は何か特別なことやってるんですか?

387 :デフォルトの名無しさん:02/07/04 05:32
たぶん、void*に入れたときに、大事な情報が死んだ。
CはIAやIBをインプリメントしているので、ちゃんとポインタで
受けられる。

388 :デフォルトの名無しさん:02/07/04 05:44
>>386
void*から直接キャストした物だと
class D : public IB{};と区別が出来ないからしょうがない。

389 :_:02/07/04 05:45
なる。VMTのオフセットがどうたらこたらって話かな?
でも、多重継承って思ったより強力ですね。ちょっとC++見直しまひた。
(って強力すぎるから問題がでるのか・・・)


390 :デフォルトの名無しさん:02/07/04 07:03
>>385
気になるならとっとけば?

391 :デフォルトの名無しさん:02/07/04 12:34
なんか作ってみた、ちょとダサいけど

#include "stdio.h"

#define ImplementSetOperations( Type )\
private:\
Type( unsigned int value ): value( value ){};\
public:\
Type(void) : value( 0 ){}\
Type( Type const& f ): value( f.value ){}\
Type& operator=( Type const& f ){ value = f.value; return *this; }\
Type& operator|=( Type const& f ){ value |= f.value; return *this; }\
Type& operator&=( Type const& f ){ value &= f.value; return *this; }\
Type operator|( const Type& f ) const{ return Type( value|f.value ); }\
Type operator&( Type const& f ) const{ return Type( value&f.value ); }\
bool operator==( Type const& f ) const{ return value==f.value; }\
bool operator!=( Type const& f ) const{ return value!=f.value; }\
bool operator<=( Type const& f ) const{ return (value&f.value)==value; }\
bool operator>=(Type const& f ) const{ return (value&f.value)==f.value; }\
bool operator<( Type const&f ) const{ return (value&f.value)==value && value!=f.value; }\
bool operator>( Type const&f ) const{ return (value&f.value)==f.value && value!=f.value; }\
class BooleanType;\
operator BooleanType*(void) const{ return value==0 ? NULL : reinterpret_cast< BooleanType* >( const_cast< Type* >( this ) ); }\
private:\
unsigned int value;\
public:

struct FontStyle
{
ImplementSetOperations( FontStyle );
static FontStyle const Normal, Italic, Bold, Underline;
};

FontStyle const FontStyle::Normal( 0 ),
FontStyle::Italic( 1 ), FontStyle::Bold( 2 ), FontStyle::Underline( 4 );

int main()
{
FontStyle style; // Empty
if ( style==FontStyle::Normal ) puts( "style is Normal" );
style |= FontStyle::Bold | FontStyle::Italic;
if ( style>=FontStyle::Italic ) puts( "style contains Italic" );
if ( !(style>=FontStyle::Underline) ) puts( "style doesn't contain Underline" );
if ( style&FontStyle::Bold ) puts( "style contains Bold" );
}

392 :デフォルトの名無しさん:02/07/04 18:51
>>3の過去ログにPart 2がなかったので探しました。
http://pc.2ch.net/tech/kako/996/996640937.html

393 :デフォルトの名無しさん:02/07/04 23:27
>>392
Good Job!!

394 :デフォルトの名無しさん:02/07/05 01:22
Dev-C++ beta4.1キタ━━━━━━(゚∀゚)━━━━━━ !!
http://www.bloodshed.net/dev/devcpp.html

395 : :02/07/05 04:51
#include <iostream.h>

void main(void)
{
static char *b[]={"Akira", "Mitsuo", "Chiaki"};
b[1][1]='d';
*(*(b+1)+1)='g';
cout << b[1][1]<<endl;
}

これをコンパイルすると

〜〜の命令が〜〜を参照しましたが、メモリが"written"になることはできませんでした。

ってエラーが出るのですがなぜでしょう?


396 :デフォルトの名無しさん:02/07/05 04:59
"strings"[1] = 'T';
とやるのと同じ問題では。

397 : :02/07/05 05:12
え??どういうことですか?
型が違うということですか???


398 :デフォルトの名無しさん:02/07/05 05:49
プログラミング言語Cに於て(C++も亦)、
「文字列リテラルの値を変更している場合、その動作は未定義」
であることが規定されてゐます。

399 :デフォルトの名無しさん:02/07/05 06:02
初心者な質問ですみません。
スタティックライブラリを作っているんですが、
これのヘッダとLIBファイルのみでインライン展開をさせることは出来るんでしょうか?
やっぱりソースもないと駄目ですか?

400 :デフォルトの名無しさん:02/07/05 06:13
基本的に、ある関数をインライン展開するには、
.hファイルに実装を書く、ということになります。
libファイルは基本的に全く関係有りません。

答えは「これのヘッダ」が何を意味するかによりますが
その後の「ソースもないと」をみると、"駄目です"と
いうのが正解でしょう。

401 :デフォルトの名無しさん:02/07/05 06:27
>>400
そうですか。
わかりました、ありがとうございました。

402 : :02/07/05 09:11
>>398

なるほど、、、そうでしたかよくわかりませんが調べてみます
ありがとうございました


403 :デフォルトの名無しさん:02/07/05 12:04
>402
つまり
char*p="ABC";みたいなのはプログラマがいじっちゃいけない
ところに文字列"ABC"が用意されてそのアドレスがpにセットされるので
参照する分には良いの。でも書き換えるとダメなの。
書き換えたいなら変数として領域を確保する必要があるの。
つまり
char str[10]="ABC";みたいな。
あるいは
char str[10];
strcpy(str, "ABC");
とか

404 :デフォルトの名無しさん:02/07/05 12:09
なぜリテラル文字列はconst指定されてないのか激しく疑問
未定義にするくらいなら禁止しちゃえばいいのに

405 :デフォルトの名無しさん:02/07/05 14:53
C++ではconstだぞ

406 :デフォルトの名無しさん:02/07/05 16:29
コンストラクタの初期化リストでthisポインタを使うのは悪なのでしょうか?

407 :デフォルトの名無しさん:02/07/05 16:44
>>406
って言うかアクセスできないメンバあるのか?

408 :デフォルトの名無しさん:02/07/05 17:03
>>407
たとえばコンストラクタで所有者のアドレスを受け取るメンバがあったとして
ClassName() : member( this ){}
とかやると怒られる
漏れもなんでなのかよく分からん・・・

409 :デフォルトの名無しさん:02/07/05 19:01
class Class {
 Class *member;
public:
 Class(): member(this) {}
};
問題ないけど

410 : :02/07/05 19:07
>>403
ご親切にどうもありがとうございます
つまりポインタの宣言だけでは配列を確保していないってことですね




411 :デフォルトの名無しさん:02/07/05 19:14
>つまりポインタの宣言だけでは配列を確保していない

違う。「リテラル」ってのが何なのか理解しなさい。

412 :デフォルトの名無しさん:02/07/05 19:18
>>406-409
VC++では出るけど、この警告はM$の言語拡張らしい?
言語拡張をオフにすると出なくなる(この警告の警告レベルが下がる)

thisの中身が初期化されてないからとりあえず警告出しとくよって感じかと
thisの値(アドレス)自体は別段問題無いと思われ

413 :デフォルトの名無しさん:02/07/05 19:31
>411
言葉のあやじゃないかな・・>配列を確保していない
char *p="ABC";
char str[]="ABC";
の差に気が付けばいいのでは?

414 :デフォルトの名無しさん:02/07/05 19:46
>413
元々は>>395、つまり文字列リテラルを書き換えようとしてのエラーで、>410はその理由をわかってないってこと

415 : :02/07/05 19:54
>>411
>>413
ということはリテラルだから変数として確保してないから書き込めない
ってことですね?

416 : :02/07/05 19:59
>>414
リテラルの意味さっき調べて知ったもので、、、

417 :デフォルトの名無しさん:02/07/05 20:09
まあ、そういうこと。で、
char *array[] = { "abc", "def", "ghi" };
は、「ポインタの配列」で、array[0], array[1], array[2]それぞれの示す先が
文字列リテラルだから、(constを付けなくても)書き換えようとした時の動作は未定義。
char array[][4] = { "abc", "def", "ghi" };
の場合は、「配列の配列(2次元配列)」で、array[0], array[1], array[2]は配列(の先頭要素のアドレス)だから、
中身を書き換えても大丈夫。

418 : :02/07/05 20:13
>>417
どうもありがとうございます
わかりました


419 :デフォルトの名無しさん:02/07/05 20:52
自分まだ林氏のスーパービギナー編を一通りやっただけのペーペー初心者です。
今、エディットボックス3つと四則演算ボタンを配置しただけの簡単な電卓を作ろうとしていて、
@ed1と2に値を入力
A「+」とか「-」とかを押す
Bed3に答え(浮動小数点型)が表示
という風にしたいのですが、
出だしはCString ssでは駄目なのかとか、
またm_ed1を1項、2を2項と定義付けるにはどう記述するのかからして分りません。
ヘルプや言語リファレンス本で調べてもいまいち・・(あまりに初歩だから載ってない?)。
学校の一室にしかソフトが入ってないので(自前で買うには高い)直接いじれる日時が限られてるし・・どなたか教えて頂けないでしょうか。

420 :デフォルトの名無しさん:02/07/05 20:54
>419
それはVC++かな?

421 :デフォルトの名無しさん:02/07/05 20:54
>419
>>4

422 :デフォルトの名無しさん:02/07/05 20:58
C++のデベロッパーってすごいな

423 :デフォルトの名無しさん:02/07/05 21:24
おお、素早いレスありがとうございます。
>420 はい、VC++の6.0です。
>421 さっき一通り読んだけどやっぱりわかりません(汗
でもある程度まではテンプレートが用意されてるのを知ったのは収穫でした。
明日は半日使えるけど、ヘルプでtemplateから検索していけば辿り着けるだろうか。

424 :419:02/07/05 21:26
すいません、423は私です(名前変え忘れた)

425 :デフォルトの名無しさん:02/07/05 21:28
VC++のみの話題は専用スレに行けっての

426 :デフォルトの名無しさん:02/07/05 21:32
>423
テンプレートなんか使わなくてもできるよ。
ま、専用スレで聞いてくれ。

427 :419:02/07/05 21:53
あちゃ、VC++とC++が別物だって知らんかった。お邪魔しました・・・

428 :デフォルトの名無しさん:02/07/05 23:13
お前ら様方は<iostream.h>,<iostream>の違いと仮想関数の目的は明確にわかっていますか?

429 :デフォルトの名無しさん:02/07/05 23:32
当然

430 :デフォルトの名無しさん:02/07/05 23:35
当然わかっていません

431 :デフォルトの名無しさん:02/07/05 23:38
俺様ごときがわかるわけありません。

432 :428:02/07/05 23:45
>>429 恐れ入りますm(_ _)m
>>430 盛れと一緒に勉強しませう!

433 :デフォルトの名無しさん:02/07/05 23:47
<iostream.h>なんてイラネーヨ

434 :デフォルトの名無しさん:02/07/05 23:51
<iostream.h>って、中身が古いケースも、
stdで囲ってないだけで<iostream>とおんなじなケースと、
両方あるんじゃない?環境によって


435 :デフォルトの名無しさん:02/07/05 23:52
iostream.hなど(仕様には)無い。
ただしCライブラリについて、
The ".h" headers dump all their names into the global namespace,
と決まっていることや、古い(namespaceをサポートしない)C++との
互換性から、c++ライブラリについてもそのようにする処理系がある。

436 :デフォルトの名無しさん:02/07/06 05:54
例外初心者なんですが、わからないことがあります。
try{}の中でローカル変数をnewした後でthrowした場合、
そのローカル変数はどうなってしまうのですか?
リークになってしまうのですか?
あと、自分でいろいろ関数っを作ってるんですが、catch{}の中に書くことが無くて
例外が起きたら、レポートを作ってシステムにthrowして強制終了させるぐらいにしか
使えません。これって普通ですか?
皆さんはそんなことはないですか?

437 :デフォルトの名無しさん:02/07/06 06:23
>>436
スタックの巻き戻しの際にデストラクタが呼ばれるから、デストラクタ
を正しく定義しておけばリークしないんじゃない?

438 :デフォルトの名無しさん:02/07/06 06:32
>>436
>ローカル変数をnewした
意味不明。


439 :デフォルトの名無しさん:02/07/06 07:03
>>436
auto_ptr

440 :デフォルトの名無しさん:02/07/06 07:53
>>437-439
try{}スコープの中でヒープを確保した場合(LPDWORD a = new DWORDとか)です。
chach{}はスコープが違うので解放出来ません。
マニュアルにはスタックフレームを巻き戻してautoオブジェクトを破棄するとしか
書いていません。
>>436の言うようにauto_ptrを使うか、try{}スコープ外で宣言するしかないのですか?

441 :デフォルトの名無しさん:02/07/06 08:28
>>436
例外に関しては、Exceptional C++を読むべし。
例外の正しい取り扱いは、君が想像しているよりも、はるかに難しい。

>auto_ptrを使うか、try{}スコープ外で宣言するしかないのですか
そのとおり。auto_ptr使用がお勧め。というか、例外を使い出したら、
「自前でdeleteは書かない」ことを目標にしとかないと失敗するぞ。

442 :デフォルトの名無しさん:02/07/06 08:30
template<class T>
struct S {
typedef T U;
};

template<class T>
struct SS : public S<T> {
U a;
};

main(){}
----------------------
をgcc 3.1 でコンパイルすると

test.cc:8: warning: `typename SS<T>::U' is implicitly a typename
test.cc:8: warning: implicit typename is deprecated, please see the documentation for details

というwarningがでます。X::Yという形でないのにimplicitだと
いわれるのがよく分からないんですが、これは正しい動作なんでしょうか?

これがコンパイラの正しい動作だとして、
U => typename SS<T>::U とやる他に回避方法はありませんか?

443 :デフォルトの名無しさん:02/07/06 08:35
>>441
> 例外の正しい取り扱いは、君が想像しているよりも、はるかに難しい。

オレも痛感いたしますた。
Exceptional は読んどくべきだけど、読んですぐ身になるほど易しい問題じゃないね・・・

444 :デフォルトの名無しさん:02/07/06 08:52
クラスの定義はヘッダに、
メンバ関数の実装はcppに書くのが普通ですか?

445 :デフォルトの名無しさん:02/07/06 09:08
>>442
template<typename T>
struct S {
  typedef typename T U;
};
が正解だったと思う。使ったことないんで、記憶に自信がないけど。

>>444
1.君の言う「クラスの定義」は、正しくは「クラスの宣言」。
2.君の言う「メンバ関数の実装」は、正しくは「クラスの定義」。
用語を思いっきり間違えて使っているけど、1をヘッダに、
2をcppファイルに書くのは、普通。それはあってる。

446 :デフォルトの名無しさん:02/07/06 09:09
>445
どうもです。

447 :デフォルトの名無しさん:02/07/06 09:38
テンプレートに毒されて、ほとんどの実装がヘッダに逝く罠
しかも、それを当たり前とすら思う罠

448 :デフォルトの名無しさん:02/07/06 09:43
俺のプロジェクトも.cppより.hの方がずっとサイズがでかいぞ(ワラ

449 :436:02/07/06 09:46
>>441
わかりました。そうします。
ありがとうございました。



450 :デフォルトの名無しさん:02/07/06 09:52
別にどっちにあったってそんなに変らんと思うが
ヘタレ環境だとコンパイルに時間がかかったり
リンク後のサイズが大きくなったりするのかな?

451 :デフォルトの名無しさん:02/07/06 09:56
>>450
何のために #include があるのか、勉強しなおせ。

452 :デフォルトの名無しさん:02/07/06 10:00
c++になって.libって全く意味が無くなったよな

453 :442:02/07/06 10:01
>>445
parse errorになります。
typename は quialifed name (X::Yのようなの) にしか使えません。

454 :デフォルトの名無しさん:02/07/06 10:05
>>448
漏れ同じくらいかも・・・・

455 :デフォルトの名無しさん:02/07/06 10:06
>>452
はぁ ?

456 :デフォルトの名無しさん:02/07/06 10:20
SSの定義のなかで
typedef typename S<T>::U U;
かなあ

457 :デフォルトの名無しさん:02/07/06 10:37
>>452
確かにね。
OBJファイルも生のバイドコードじゃなくて
中間コードみたいなのを生成するようにして、
ヘッダとLIBで、テンプレートやインライン展開が可能になればいいのに。

458 :442:02/07/06 10:48
>>456
ありがとうございます。
それは考えたのですが、実際のクラスでは継承が芋ヅル式に
続いています。
これでは全てのクラスに書くことになってしまうので、
避けたいのです。

459 :デフォルトの名無しさん:02/07/06 10:50
>>458
取りあえずデザインパターンの本読んで目から鱗を落とすことを推奨。


460 :デフォルトの名無しさん:02/07/06 11:41
>>459 関係ない話で恐縮だが、俺はあれを読んで目に鱗がついたよ

461 :デフォルトの名無しさん:02/07/06 11:45
>>460
確かに、全面的に同意する気はないけどね。
でも、ああいうやり方もあるんだと。どこかでうまく使えば便利だなと。
中小クラスを継承して後からメソッドを実装するなんて当たり前のことにも名前付いてて少しワラタ。


462 :デフォルトの名無しさん:02/07/06 12:51
>>445
クラスの「宣言」と「定義」って、そんなに明確にわかれてましたっけ?
class T { ... };
↑これをどっちで呼ぶかって話しなんだけど。
データフィールドとか、インライン関数の「定義」をしてますよね。
中でどれだけ「定義」されていても、全体では「宣言」って呼ぶんですか?

463 :デフォルトの名無しさん:02/07/06 12:56
>>462
定義 class a{}
実装 a::a(){}
宣言 a *ax = new ax;

464 :デフォルトの名無しさん:02/07/06 13:05
ファイルにロックをかけたいのですがどんなメソッド、関数がありますか?
flockを使うしかないのでしょうか。

465 :デフォルトの名無しさん:02/07/06 13:06
>>464
WebProg板が無駄に詳しいけどね。
後はディレクトリがあるかないかとか。

466 :オレ的には:02/07/06 13:06
>>462
宣言 class a;
I/Fの定義 class a{}
実装の定義 a::a(){} (うまい言葉が見つからん・・・)

467 :デフォルトの名無しさん:02/07/06 13:09
>>462
もともと「定義」というのは、コンパイラがそれに出会ったら、
その場でコンパイルされて何らかのオブジェクトコードが生成されるものだ。

それに対して「宣言」というのはあくまでコンパイラに教えるのが目的で、
それ自身はオブジェクトコードが生成されないものだ。

だからたとえ inline とあっても、コンパイラが出会ったその場で
オブジェクトコードが生成されるわけではないので、それは「宣言」。

つまり「関数呼び出しを生成するのではなく、その場でこれを展開してくれ」
という「宣言」なわけだ。

だから「inline 宣言」とはいうけど、「inline 定義」とは言わないよな、フツー。

とはいうものの、「テンプレート」となると話はややこしくなるが...。


468 :デフォルトの名無しさん:02/07/06 13:12
>>467
なるほろ・・・日常的な「定義」とは意味が異なるのですね

469 :464:02/07/06 13:12
>>465
なるほどー。サンクスです。

ロックかけるときだけfile descriptor取得して
Cの関数使うのはちょっと気持ち悪いなーと思ったので
質問してみました。

470 :462:02/07/06 13:58
>>467
ってことは、
class A {};
↑これも宣言?
そんなわけないとおもうんだけどなぁ。

471 :デフォルトの名無しさん:02/07/06 14:25
∧ ∧
(*゜ー゜)++

472 :デフォルトの名無しさん:02/07/06 14:37
定義も宣言の一種とどこかで読んだような……

473 :デフォルトの名無しさん:02/07/06 15:05
K&R では「定義」と「宣言」は明確に区別されてますね。
以下引用。

> "定義"とは変数が実際につくられ、あるいは記憶が割り当てられた
> ところを指すのに対し、"宣言"とは変数の性質は指定されているが
> 記憶割当てはされていないところを指す。

474 :デフォルトの名無しさん:02/07/06 15:07
>>3 の C++ Final Draft を見る限り、
>>473 の意味で区別するのが正しいとは思えない。

475 :デフォルトの名無しさん:02/07/06 15:12
K&RはCだからね、C++にも通用するとは限らない

476 :デフォルトの名無しさん:02/07/06 15:13
473
C++3rd(邦訳版)のP.113にも class A{}; が定義であるように
解説されてますね。

477 :デフォルトの名無しさん:02/07/06 15:15
>>445,>>447 はダウト。
ということでよろしいか?

478 :477:02/07/06 15:16
まちがえた。
>>445,>>467 はダウト。
ということでよろしいか?


479 :デフォルトの名無しさん:02/07/06 15:19
class A;  クラス宣言
class A{}; クラス定義

でいいんだよね?

480 :デフォルトの名無しさん:02/07/06 15:21
class A;  クラス前方宣言
class A{}; クラス宣言&定義

じゃねーの。

481 :デフォルトの名無しさん:02/07/06 15:22
>>479
クラスの場合、I/Fだけでなくその挙動まで定義して初めて完全な定義な気がするから
class A{};
は(全てインラインでない限り) 不完全な定義 とでも呼ぶべきかと

482 :479:02/07/06 15:22
ううむ、なるほど。

483 :デフォルトの名無しさん:02/07/06 15:28
定義は宣言の一種っていうのは嘘?

484 :デフォルトの名無しさん:02/07/06 15:28
class A;  プロトタイプ宣言
class A{}; クラス宣言

じゃねーの。


485 :デフォルトの名無しさん:02/07/06 15:30
一種って言い方はびみょーだなー

定義は宣言も兼ねる
常に成り立つわけじゃないけどさ

486 :デフォルトの名無しさん:02/07/06 15:32
プロトタイプなしの関数定義がそうですね。<宣言も兼ねる

487 :デフォルトの名無しさん:02/07/06 15:51
VC++の場合(エラーメッセージより)

class A; 宣言
class A{}; 定義
A::A(); 関数定義

488 :デフォルトの名無しさん:02/07/06 17:28
すごくくだらない質問で申し訳ないのですが
void Func()
{
char* sBuf=new char[256};
}
deleteしてないので256Byte開放されないわけですが、
スコープ抜けるのでsBufは消えちゃいますよね。
そうなるとこの256Byteはどうなるのでしょうか。
sBuf がないので見えなくなってメモリに
ごみとして残るのでしょうか?
プログラム終了時には消えると思うんですが
実行中はどうなるのかよくわからないんで。。
私以外の人はご存知と思いますので
教えてもらえないでしょうか?
よろしくお願いします。



489 :デフォルトの名無しさん:02/07/06 17:29
>>488
覗き穴の亡くなった箱。
ロープが切れた舟。
子供が手を離した風船。

490 :デフォルトの名無しさん:02/07/06 17:30
ハァハァ(;´Д`)=○)'3')←>>488

491 :デフォルトの名無しさん:02/07/06 17:43
ありがとうございます。
やっぱりそうだったんですね。
胸のつかえが取れました。


492 :デフォルトの名無しさん:02/07/06 17:48
一般にメモリリークという

493 :デフォルトの名無しさん:02/07/06 21:02
>>442
えー、3.1 だとそんな warning が出るわけ? 俺も同じようなことを
やってるから、ちと鬱だな。明日にでも 3.0.4 から 3.1 にしようかと
思っているのに。

494 :デフォルトの名無しさん:02/07/06 22:15
template<typename T>
class A {
public:
  virtual const T method() = 0;
};

class B : public A<char *> {
public:
  [  (a)  ] method() {
    return 0;
  }
};

int main() {
  return 0;
}

みんな,この [ (a) ] に入れるべきものが自然に分かるですか?
私はさっき無茶苦茶はまったんで鬱です
しかもまだ理屈が分かってないし

495 :デフォルトの名無しさん:02/07/06 22:50
今まで怖くて触れてこなかったtemplateをいざ使ってみようと思ったのですが、
次のコードがコンパイルできません。。。


#include <iostream>

using namespace std;

template <class T = char, class C = basic_string<T> >
T test(const C& str)
{
  return str[0];
}

int main(void)
{
  cout << test(basic_string<char>("Hello, world!")) << endl;
}

どこが間違ってるのか分からないのですが、
出来れば、ご教授願います。環境はVC6+SP5です。
初心者質問ですいません。。。

496 :デフォルトの名無しさん:02/07/06 22:54
>>494
なるほど。char * const って書かないとだめか。
理屈としては、テンプレートを解析した時点で、「T は const」
ってことに決まっちゃうからかな。const char * は、
const な「char *」じゃないっしょ。

497 :デフォルトの名無しさん:02/07/06 22:56
T は char* なんだから、
const T は char* const になるですよ

498 :デフォルトの名無しさん:02/07/06 22:59
>>495
関数テンプレートでデフォルトパラメータは使えたっけ
テンプレート宣言終了の;がない
テンプレートは型が完全に一致しないと実体化しないから
多分君のもくろみは外れている

とか

499 :デフォルトの名無しさん:02/07/06 22:59
>>495
テンプレートの引数を省略できなかった,ていうことらしいんで
cout << test<char>(basic_string<char>("Hello, world!")) << endl;
とすれば,うまく動いているっぽいっすね

>>496-497
あー,どうもっす。そういう考えがスッと出て納得できるなんて,うらやますぃ・・・
今日ついに「プログラミング言語C++」買ってきたんで,これから
ワッシワシ勉強するですよ

500 :495:02/07/06 23:09
>>499
出来ました…でも、関数テンプレートのデフォルト引数の例が、
Stroustrup本の13.4.1に載ってるんですけど…
例が悪いみたいですね…。すいません。

501 :498:02/07/06 23:10
ごめんよく見てなかった&&勘違い。
問題はデフォルトパラメータは使えないこととと>>499だけだね

502 :495:02/07/06 23:11
例が悪いというのは上の例が悪いってことです…。
誤解を招きそうな発言をして申し訳ありません。。。

503 :デフォルトの名無しさん:02/07/06 23:15
関数テンプレートのデフォルト引数が使えるのか…
VCは謎が多いな

504 :デフォルトの名無しさん:02/07/06 23:17
>>498
わかるよ。

505 :デフォルトの名無しさん:02/07/06 23:17
cont char *とchar const *は同じ意味なのですか?

506 :デフォルトの名無しさん:02/07/06 23:19
>>505
違う。constは直後の要素に掛かる。

507 :495:02/07/06 23:19
>>503
あ、あと、BCCでもデフォルト引数が使えないみたいです。。。
一次クラステンプレートのみに使用できますとか言われて…
弱った。。。手持ちのコンパイラじゃ出来ないのか。。。(汗)

508 :デフォルトの名無しさん:02/07/06 23:20
>>505
関数の仮引数では同じだったはず
他は違う

509 :デフォルトの名無しさん:02/07/06 23:21
>>506
サンクス

510 :デフォルトの名無しさん:02/07/06 23:23
>>507
ん?
出来ないのが標準仕様(ISO)だけども何が問題?

511 :デフォルトの名無しさん:02/07/06 23:23
const char* と char const* は一緒じゃないの?

512 :デフォルトの名無しさん:02/07/06 23:24
だから違うというとるに

513 :495:02/07/06 23:25
>>510
そうなんですか?
Stroustrup本のは…間違いなんですか?

514 :デフォルトの名無しさん:02/07/06 23:25
> 出来ないのが標準仕様(ISO)

ダセエな。

515 :デフォルトの名無しさん:02/07/06 23:25
>>495 & その他
関数テンプレートでもデフォルト引数は使える。
495 がダメなのは、2番目のテンプレート引数 C は関数引数から推測できるのに
1番目の引数 T の指定がないからじゃないのか。だから 499 が正解だと思う。
普通の関数のデフォルト引数だって、1番目はデフォルトにして2番目の引数だけ
指定するなんてことはできないだろう。

516 :デフォルトの名無しさん:02/07/06 23:29
>>506 通るけど。

class A {
public:
virtual const char *func() { return 0; }
};

class B : public A {
public:
virtual char const *func() { return 0; }
};

int main()
{
A a;
a.func();

B b;
b.func();
}

517 :デフォルトの名無しさん:02/07/06 23:29
まったまった、今酔ってて怪しいが、これはさすがに同じだろ
const char * str
char const * str

この辺と混同してないか?
char * str const
const char * const str

518 :495:02/07/06 23:29
>>515
ふむ…。
では、引数から推測できないようにすると出来るのでしょうか?
ちょっと試してみます。

519 :デフォルトの名無しさん:02/07/06 23:30
511
同じ結果になるんですが・・・。

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
 char const* p1 = "hoge";
 const char* p2 = "hoge";
 cout << typeid(p1).name() << endl;
 cout << typeid(p2).name() << endl;
 return 0;
}

520 :517:02/07/06 23:30
わり、3番目の例はこう書きたかった
×char * str const
○char * const str

521 :499:02/07/06 23:35
早速 Stroustrap 本読んでます (´ー`)
p.133 に書いてたんですが,"const *" は存在しないから基本形の一部と
見なされるらしくて,つまり "char const *" は "const char *" と
同等だということでした

# だんだん const の使い方が分かってきたかも

522 :515:02/07/06 23:35
スマソ。いま ISO の規格書確認したら、
A default template-argument shall not be specified
in a function template declaration or a function template definition
って書いてあった。

523 :デフォルトの名無しさん:02/07/06 23:39
>>515
>関数テンプレートでもデフォルト引数は使える。
ここでの問題はデフォルトテンプレート引数だぞ
これは使えないだろ

524 :デフォルトの名無しさん:02/07/06 23:40
>規格書確認したら

持ってんのかよ!Σ(゚□゚=)
イイナァ

525 :523:02/07/06 23:40
ごめん。読んでたら遅れた

526 :japh ◆J.5V8ta6 :02/07/06 23:41
「*を挟んでconstが右にあるか、左にあるかで見分けろ」
というようなことを何かで読んだよ。
(プログラミング言語C++だったかな…或いはEffective C++だったかもしれない)

527 :515:02/07/06 23:44
>>524
たしか、20ドルくらいで買った。まあ、ふだんは
http://www.kuzbass.ru/docs/isocpp/
を見に行ってるけどね (w

>>525
いや、うっかり C++3rd を信じちまったおれが悪かった。

528 :495:02/07/06 23:45
>>522
結局、ISO標準では関数テンプレートのデフォルト引数を使うことは無理なんですね。
Stroustrup本に書いてあるのは次のようなものです。

template<class T, class C = Cmp<T> >
int compare(const String<T>& str1, const String<T>& str2){
  for (int i=0; i<str1.length() && i<str2.length(); i++)
    if (!C::eq(str1[i], str2[i])) return C::lt(str1[i], str2[i]) ? -1 : 1;
  return str1.length()-str2.length();
}

529 :デフォルトの名無しさん:02/07/06 23:48
BCC5.6では、関数テンプレートにデフォルト引数を書いただけで
通らなくなりまっす。下のように書くしかありまっせん。

#include <iostream>

using namespace std;

template <class T, class C>
T test(const C& str)
{
return str[0];
}

int main(void)
{
cout << test<char>(basic_string<char>("Hello, world!")) << endl;
}

530 :495:02/07/06 23:50
すいません。
ぐえ…。Stroustrup本が標準だとばかり思っていました…。
今度から>>527を見に言ってから発言するようにしたいと思います。

色々ありがとうございましたm(_ _)m


531 :デフォルトの名無しさん:02/07/06 23:50
>>527
ありがとう!

532 :デフォルトの名無しさん:02/07/06 23:56
手元になぜか refman.pdf という 2,860,601バイトの規格書があるが、
なぜだろう?いつの間に?

533 :デフォルトの名無しさん:02/07/07 00:03
検索してみたらcpp3rd.zipなんてのも出てくるな

534 :デフォルトの名無しさん:02/07/07 00:06
某所で出てから、一気に普及したんじゃないかな>refman

535 :デフォルトの名無しさん:02/07/07 00:09
ここのは無茶苦茶鯖が重いけど、今でも落とせるね。

http://mxlab.com:8080/ftp/docs/c++/?s

536 :デフォルトの名無しさん:02/07/07 00:13
527 のリンク先は、draft だからさらしてても OK なのか?
それともやっぱり違法?

537 :デフォルトの名無しさん:02/07/07 00:17
>>527のヂレクトリをいっこ登ると・・・(゚ε゚)キニシナイ!!

538 :デフォルトの名無しさん:02/07/07 00:24
constに関しては、>>526が正解。参考文献は、Effective C++ の21項。
あと、Exceptional C++ の43項も読んだら、constの正しい使い方が理解できるよ。

539 :デフォルトの名無しさん:02/07/07 00:32
うほほ


540 :デフォルトの名無しさん:02/07/07 00:44
激重(汗 ようやく落ちた

541 :デフォルトの名無しさん:02/07/07 07:47
const char* str なんつーダサい書き方は速く卒業してホスィ・・・
常に char* const str なら何も迷うこと無いでしょ

542 :デフォルトの名無しさん:02/07/07 07:57
char const* の間違い?

543 :デフォルトの名無しさん:02/07/07 07:58
>>542
あ、サンクス

544 :デフォルトの名無しさん:02/07/07 08:10
>何も迷うこと無いでしょ

つーか間違えてるなら、迷ったってことでわ?

545 :エキセントリック541:02/07/07 08:19
>>544
絶対ゆわれるとオモタYO(恥
const の位置を間違ったんじゃなくて、
1行目でconstなcharへのポインタのことを考えていながら、
2行目でcharへのconst なポインタのことしか考えてなかった。

const char* const str なんつー・・・
char const* const str なら何も迷・・・
って書けばよかたよ



546 :デフォルトの名無しさん:02/07/07 08:35
実際問題、ポインタ自体をconstにすることなんてほとんどねーんだし、
そうするくらいなら、参照渡せよ、って感じだし。
(使用頻度において、T const * >> T * const ,T const *const)
ポインタのポインタも、ポインタへの参照とか、vector<vector<T> >つかえば
いいわけだから、ポインタでconst使うのは、実質 T const * ptr だけっしょ。
だったら、迷うもなにも、 const T *ptrってやっとけばいいんでないかい?

547 :デフォルトの名無しさん:02/07/07 08:40
漏れはバリバリ使う、9割方const
配列のときとかNULLのときとか参照使えないし

548 :デフォルトの名無しさん:02/07/07 13:57
>> 461
>> 当たり前のことにも名前ついてて少しワラタ。

若干オソレスだが

その当たり前ってやつを他人に説明するには、名前があったほうが便利だろ〜。

デザインパターンの目的のひとつは、そういうことだぞ。

だいたい、Gof本に書いてあることなんざ、ハッカーレベルじゃ全部当たり前。

549 :デフォルトの名無しさん:02/07/07 14:10
>>548
取りあえずこれ抽象クラスにしたら継承するだけでいろんな事に使えるやろ?
おお。確かに。

取りあえずこのクラスでFactoryMethodやるから。
はぁ?

日本的にあの名前達は有害かと。

550 :デフォルトの名無しさん:02/07/07 14:41
しかし、参照は便利だねえ。
NULL渡しチェックの必要がなくなるのは嬉しい。
今までCOMに毒されてたから気が付かなかったよ。

551 :デフォルトの名無しさん:02/07/07 14:43
>>550
逆にNULLが渡したくても渡せない罠。

552 :デフォルトの名無しさん:02/07/07 14:58
>>551
NULLを渡すって事は、前提とする状況ががらっと違うわけだから。
オーバーロードさせとくのが正しい、と俺は思う。

// ポインタ渡し
void Foo(RECT* pRect){
  if (pRect == NULL){
    SetRect(rect_);// メンバ変数
  } else {
    SetRect(*pRect);
  }
}

// 参照渡し
void Foo(RECT& rect){
  SetRect(rect);
}
void Foo(void){
  SetRect(rect_);// メンバ変数
}

こんな感じで。

553 :デフォルトの名無しさん:02/07/07 15:03
>>552
結局参照はPascalのvar以上の使い方はすべきでないですか?

554 :デフォルトの名無しさん:02/07/07 16:31
派生クラスを定義するときに
継承もとのクラスのコンストラクタをそのまま使いたいんだけど
良くわかりません。

継承もとのクラスのコンストラクタを派生クラスにコピペするのもあんまりだし・・・




555 :デフォルトの名無しさん:02/07/07 16:41
Class a{
a( int c );
};

Class b : public a {
b( int c );
};

b::b( int c ) : a( c )
{
}

こういうこと?
それとも、class b のコンストラクタの定義は無しで
class a のコンストラクタを流用したいってこと?
それは俺も知りたい、誰か教えてプリーズ。

556 :デフォルトの名無しさん:02/07/07 17:24
multimap<int, string> aaa;
として

  aaa.insert(make_pair(3, "abcdefg"));
としたらエラーがでました。なんか2番目の引数が問題らしいので
適当に

  aaa.insert(make_pair(3, string("abcdefg")));

としたらokになりますた。
これって一時的なオブジェクトstringを"abcdefg"で初期化して渡したって事ですよね?
CPUとメモリ消費しながら・・

この修正で正しいですか?間違ってますか?

557 :デフォルトの名無しさん:02/07/07 17:31
いいんじゃないの?

558 :デフォルトの名無しさん:02/07/07 17:35
そうでしたか。どうもです。
C++標準ライブラリ〜って本では文字列を渡してますが
VC++の癖ですかね〜


559 :デフォルトの名無しさん:02/07/07 17:37
char const *からstringへの変換は存在するが、
pair<int, char const * const>からpair<int, string>への変換は存在しない。

560 :japh ◆J.5V8ta6 :02/07/07 20:13
>>557
つまりmake_pair()じゃなくて単にpair<>のコンストラクタを使いなさいってこった。

aaa.insert(make_pair(3, string("abcdefg")));

aaa.insert( std::pair<int, std::string>(3, "abcdefg") );

561 :デフォルトの名無しさん:02/07/07 20:52
書くのはvalue_typeにしとけ

562 :561:02/07/07 20:57
と思ったけどちょっと長いな
std::multimap<int,std::string>::value_type

563 :japh ◆J.5V8ta6 :02/07/07 21:28
>>561
うい、そっちの方が望ましいね。
長いのはtypedefで何とかすればよし。



564 :デフォルトの名無しさん:02/07/08 00:36
C++のソースで、cstdioじゃなくstdio.hをincludeすると、なにか問題ある?
stdio.hに愛着があるんで。

565 :デフォルトの名無しさん:02/07/08 00:38
>>564
名前空間がstdに包まれなくなる。つまり通常のCのようになる。

566 :デフォルトの名無しさん:02/07/08 00:38
おまえ死ねと言う気になる
グローバルネームスペースを汚すなと。

567 :デフォルトの名無しさん:02/07/08 00:39
>>564
これだからプロジェクトに加齢臭のするドキュソが入ってくるとロクなことにならねえ
と若い連中に思われる。

568 :デフォルトの名無しさん:02/07/08 00:41
.cpp で使う分には問題は少ないでしょ。

569 :564:02/07/08 00:42
うわぁレスの早さからしてとてもだめなことを聞いたね。> 俺
今日から改めます。

570 :デフォルトの名無しさん:02/07/08 00:46
569は神。ジジイのカガミ。


571 :デフォルトの名無しさん:02/07/08 00:51
名前空間についておさらいだッ

572 :デフォルトの名無しさん:02/07/08 01:12
friendってどういう目的で使うのですか

573 :デフォルトの名無しさん:02/07/08 01:18
クラスのprivateなメンバにアクセスしたり。

574 :デフォルトの名無しさん:02/07/08 01:42
g++の2.95で、std::basic_string<unsigned char>のc_str()で
エラーが出たりしますか?

575 :デフォルトの名無しさん:02/07/08 01:46
cppってstdio.hインクルードすると良くないのかぁ・・・。
ストラップさんの本、読み直してみよう・・・。

576 :128:02/07/08 01:46
>572
引きこもりは全部friendにしてしまう傾向があるから注意・・

577 :デフォルトの名無しさん:02/07/08 01:59
>>572
operatorを定義する時に便利。乱用は禁物。

578 :デフォルトの名無しさん:02/07/08 02:01
これってなんでエラーになるの?

class Test
{
public:
static int nHoge ;
};

int main()
{
Test::nHoge = 0;

return 0;
}



579 :デフォルトの名無しさん:02/07/08 02:03
nHogeの実体がないから。

580 :デフォルトの名無しさん:02/07/08 02:03
こんなの初めて見た(ワラ

581 :デフォルトの名無しさん:02/07/08 02:11
ワラウコトナイジャナイ...

582 :デフォルトの名無しさん:02/07/08 02:11
>>578 とにかく覚えなさい。

class Test
{
public:
static int nHoge;
};

int Test::nHoge;

int main()
{
Test::nHoge = 0;

return 0;
}

583 :デフォルトの名無しさん:02/07/08 02:14
クラス内の性的変数の定義の詳細を見ればどうにかなるんじゃない

584 :デフォルトの名無しさん:02/07/08 02:17
>>582
int Test::nHoge; ←これが実体なの?

うーん謎。

585 :デフォルトの名無しさん:02/07/08 02:24
>>584
class変数を複数作っても、staticメンバ変数は実体が一つしか
存在しない事に伴う特殊な書き方らしい。誰か詳細キボンヌ。

586 :デフォルトの名無しさん:02/07/08 02:25
>>584
それが実体。初期化する場合もそこで。

587 :デフォルトの名無しさん:02/07/08 02:29
>>585
class変数 を staticメンバ変数 と言い替えている罠



588 :デフォルトの名無しさん:02/07/08 02:30
アヒャヒャ!


589 :デフォルトの名無しさん:02/07/08 02:31
>>584
staticメンバはクラスに固有なもの
インスタンスをいくつ作っても、staticメンバは複数作られない
それは、概念的にstaticメンバが、インスタンスの外にあるから。

590 :デフォルトの名無しさん:02/07/08 02:37
>>587
わりィとちった。インスタンスだね。

591 :デフォルトの名無しさん:02/07/08 02:48
>>589
なるほど。わかりやすいです。
staticメンバの宣言は、
各インスタンスの外にある1つの実体を指すための
ポインタ的(Cで使う意味じゃなく)なものだということだすね。
だからいくつインスタンスを生成しても指す場所は同じってことで、
値はいっしょということだと。

592 :デフォルトの名無しさん:02/07/08 10:36
>>587
静的嫌がらせ


593 :デフォルトの名無しさん:02/07/08 15:19
ちょっと質問!
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。

594 :デフォルトの名無しさん:02/07/08 15:21
無理っぽいが、
http://pc.2ch.net/test/read.cgi/tech/1023361418/l50

595 :デフォルトの名無しさん:02/07/08 15:29
>>594
サンクス、とりあえず、向こう逝きます、

596 :デフォルトの名無しさん:02/07/08 16:34
ここのみんなでさC++の入門書書かない?HTMLとかで
大勢で思考錯誤したり分担したりすればかなりいいものが作れる気がするんだが
痒い所に手が届くような大規模なFAQとかさ、、
学んでる最中の人のがいればどこがわからないとかが指摘できたりするわけで
ここには勉強中の人もかなりいるだろうからそう言うのも大丈夫だとおもう


597 :デフォルトの名無しさん:02/07/08 16:41
>>596
俺も似たようなことは考えてた。

598 :デフォルトの名無しさん:02/07/08 16:48
>>596
俺はハナからあきらめてた

599 :デフォルトの名無しさん:02/07/08 16:49
class a{
friend class b;
}

class c : public b{
}

この class c にも class b に対して行ったfriend宣言の効力を
効かせたいんですけど無理ですかね?
やっぱり class c のfriend宣言をあらためて加えないと駄目ですか?

600 :デフォルトの名無しさん:02/07/08 16:54
>>599
はい。


601 :デフォルトの名無しさん:02/07/08 16:58
>>600
あなたヤホーの掲示板に居たでしょ?

602 :デフォルトの名無しさん:02/07/08 18:34
>>599
なんでそんなことをしたいのよ?

603 :ななしあた:02/07/08 18:48
>>602
いいじゃない、別になんだってさ

604 :599:02/07/08 18:56
そうですか、残念。

>>599
class b の派生クラスを作る度に
class a の宣言を改定しなければならないのがイヤだったんです。
class b の能力としては class a のプライベートメンバにアクセス権を持つ
というのが含まれているんで、継承でそれを派生クラスに持ち越せないって
なんか変な感じがしますね。これはちょと不満かも。

605 :599:02/07/08 18:56
>>602の間違いでした。

606 :デフォルトの名無しさん:02/07/08 19:00
>>599
激しくお勧めできないが


class A
{
protected:
int i;
friend class B;
};

class friendlyA: public A { friend class C; };

class C
{
C()
{
A a;
static_cast< friendlyA* >( &a )->i = 10;
}
};


607 :599:02/07/08 19:20
>>606
それはまたトリッキーで・・。
でも class friendlyA は class C の内部クラスにしてしまえば
それなりに綺麗に書けそうかも。どうも参考になりました。
それか、今思ったんですがfriend宣言のところだけマクロにして
切り離すってのもアリかも。

608 :デフォルトの名無しさん:02/07/08 19:51
>>596
いまにそれが有名になってこの板が2chの看板に!

609 :デフォルトの名無しさん:02/07/08 19:55
日本語で specialization を表すのに何を使ってますか?
「特殊化」や「専門化」は instantiation の訳に用いるほうがふさわしいし、
C++3rd の「特殊バージョン」は間違いではないにしろ、すわりが悪く感じます。

610 :デフォルトの名無しさん:02/07/08 20:18
特別化

611 :デフォルトの名無しさん:02/07/08 20:21
>>596
>>608
あれだけいってもC FAQ/C++ FAQすらよまねえ連中だらけなのにさらにゴミ文書増やすのかヨ



612 :デフォルトの名無しさん:02/07/08 20:34
>>610
ふむ、それも「専門化」とかと同じで、意味があってないんだよね

613 :デフォルトの名無しさん:02/07/08 20:42
>>612
何がしたいわけ?

614 :デフォルトの名無しさん:02/07/08 20:51
>>612
限定化

615 :デフォルトの名無しさん:02/07/08 20:55
>> 614
いろいろと「〜化」って挙げてくれてるけど、それって「操作」を意味する「サ変名詞」でしょ
だから、正しくない。
specailization は「操作」じゃなくて、クラスや関数でしょ。

616 :デフォルトの名無しさん:02/07/08 20:56
○○化物

617 :デフォルトの名無しさん:02/07/08 20:58
>>613
単に、specialization を日本語で "正しく" 表記したいだけだよ。
いつもは「スペシャライゼーション」って書いてるけど、長ったらしいしね

618 :デフォルトの名無しさん:02/07/08 20:59
言語のままspecializationと表記することに問題が?

619 :デフォルトの名無しさん:02/07/08 20:59
原語

620 :デフォルトの名無しさん:02/07/08 20:59
>>616
クラスや関数って「物」なんだろうか?

621 :デフォルトの名無しさん:02/07/08 21:02
>>618-619
うん、問題ない。めんどくさいけどね。
読みやすいかといわれると、疑問もあるけど。

622 :デフォルトの名無しさん:02/07/08 21:05
>>621
気持ちは分からんでもないが、戦時中じゃないんだから、
むりやり日本語にすることもあるまい。

623 :デフォルトの名無しさん:02/07/08 21:09
>>622
政府の見解は違うようだけどね(w
字面が場所とるのが嫌なんだが、現行どおり「スペシャライゼーション」で当面いきます。
おつきあい、ありがとう。

624 :デフォルトの名無しさん:02/07/08 21:24
政府を窓から投げ捨てろ!

625 :デフォルトの名無しさん:02/07/08 21:43
>>624
燃えるゴミの日に出したよ。政府

626 :デフォルトの名無しさん:02/07/09 06:44
templateは言うなればクラスの特殊な物なの?
具体的な型を指定してあげればクラスと同様に扱えますか?
つまり、基底クラスにして派生させてみたり、
その他いろいろ文法上はクラスと同等の扱いですか?

627 :デフォルトの名無しさん:02/07/09 07:57
>>626
>>templateは言うなればクラスの特殊な物なの?
逆、クラステンプレートは普通のクラスを型に対して一般化したもの。
同様に、関数テンプレートは関数を一般化したもの。

>>具体的な型を指定してあげれば、クラスと同様に扱えますか?
そのとおり、テンプレート引数を与えてやれば、コンパイラは
テンプレートをそれでインスタンス化してクラス定義を作成し、翻訳単位に挿入する。
そうやって作られたクラスは、通常のクラスとまったく同じように使用できる。

628 :デフォルトの名無しさん:02/07/09 08:31
>627
ありがとうございます

629 :デフォルトの名無しさん:02/07/09 22:48
2次元配列の要素数を取得するにはどうすればよいですか?

630 :デフォルトの名無しさん:02/07/09 22:51
vector?

631 :デフォルトの名無しさん:02/07/10 07:04
string に数値を文字列にしていれるのに一番すっきりした方法はなんでしょう?
sprintf を使ったりしてみたのですが、なんかカッコ悪いような……

632 :デフォルトの名無しさん:02/07/10 08:28
>>631
boost::lexical_cast<>
ちょい重いけど

633 :デフォルトの名無しさん:02/07/10 09:52
int x = 10;
string s = static_cast<ostringstream&>((ostringstream() << x)).str();
とか。

634 :デフォルトの名無しさん:02/07/10 09:55
itoa

635 :デフォルトの名無しさん:02/07/10 10:33
>>633
それだったらboost::lexical_cast<>でいいじゃねぇか。
どうせあれも内部でstringstream使ってるし。

636 :デフォルトの名無しさん:02/07/10 11:19
sprintfつかっとけ。

637 :デフォルトの名無しさん:02/07/10 17:24
stringオブジェクトの中身を編集したいのでstring::c_str()
で得られたconst char*をchar*にキャストして
そこがさす文字を置き換えたりとかしても平気ですか?


638 :デフォルトの名無しさん:02/07/10 17:46
自分が確保した領域にstrcpyしてからのほうがええんじゃないか?
エエジャナイカ、エエジャナイカヽ(・∀・)ノ

639 :デフォルトの名無しさん:02/07/10 17:59
>637
基本的にやってはいけない。
もしやるとしても、以下の出力の理由が理解できてから。

#include<string>
#include<iostream>
int main()
{
 using namespace std;
 string s1("abcde");
 string s2 = s1;

 char *p = (char *)s1.c_str();
 *p = 'A';

 cout << "s1 = " << s1 << endl;
 cout << "s2 = " << s2 << endl;
 return 0;
}


640 :デフォルトの名無しさん:02/07/10 18:03
基本的じゃなくて、絶対にやってはいけない。
内部文字列のコピーを返している場合もあるから。

641 :デフォルトの名無しさん:02/07/10 18:06
なるほど。よくわかりました。


642 :デフォルトの名無しさん:02/07/10 18:31
const_cast<>を使う時って、なんかいけないことをやってる気がするよ。


643 :デフォルトの名無しさん:02/07/10 18:45
うん。

644 :デフォルトの名無しさん:02/07/10 19:48
コンソールアプリケーションの実行ファイルサイズを抑えるために、
なにか心がけるといいことはありますか?C++で

645 :デフォルトの名無しさん:02/07/10 19:50
>>644
iostreamなどの標準ライブラリを使ったらすぐ大きくなる。

646 :644:02/07/10 19:53
>>645
そうですよね。特にg++ 3.1なんかでは半端じゃないですよね。


647 :デフォルトの名無しさん:02/07/10 19:58
SGI STLのiostreamがでかいだけ。

648 :デフォルトの名無しさん:02/07/10 20:02
gcc-2.95.3とかでは割と小さかったのにな。残念だな。

649 :デフォルトの名無しさん:02/07/10 20:11
locale周りのサポートが入ったんだから、
でかくなるのは避けようがないでしょ

650 :デフォルトの名無しさん:02/07/10 20:11
stringstreamを使うだけででかくなるのはいただけない。
どうしてもsprintfの誘惑に負けちゃうよな

651 :デフォルトの名無しさん:02/07/10 20:26
だれかー初心者ですが

致命的エラー F1003 D:\borland\bcc55\Include\stdcomp.h 5: error 指令: Must use C++ for STDCOMP.H

ってでるんですけどなんでー(;_;)

652 :デフォルトの名無しさん:02/07/10 20:40
DirectX関係なんですが、クラス構造の問題なのでこっちで聞いてみます。

アクションゲームで人間クラス、背景クラス、Direct3Dラッパークラスがあるのですが
人間クラスのメンバ関数にDraw()を定義して
p人間クラス->Draw();
p背景クラス->Draw();
でDirect3Dを使って描画させたいのですが、この場合Direct3Dクラスから人間クラスと背景クラスを
継承させるのが正しいのでしょうか?ただし、Direct3Dクラスが複数できるのは問題があります。


653 :デフォルトの名無しさん:02/07/10 20:54
素朴な疑問なんですが、なぜ ++x は左辺値なのに
x++ は右辺値なんでしょうか。

654 :デフォルトの名無しさん:02/07/10 20:59
>>651
F1003は#error指令が出すメッセージです。
拡張子を.cppにしませう。

655 :japh ◆J.5V8ta6 :02/07/10 21:20
>>653
++xが左辺値なのは効率の為で、x++が右辺値なのはそうせざるをえないから、かな。
実装してみればわかるよ。

656 :デフォルトの名無しさん:02/07/10 21:27
むきー、x++しか使っていない
俺はまるで非効率な男みたいではないか!!

657 :デフォルトの名無しさん:02/07/10 21:30
>>652
描画インターフェースを定義して(IDrawable3D::Draw()とか)、
人間クラス、背景クラスがそれを "内部クラスで" 実装し、
そのインスタンスをD3D描画管理クラスに登録するというのはどうかな。
このやりかたなら、対象となるクラスが何であろうと、描画に持ち込むことができる。

デザインパターンでいうところの・・・何だっけ

658 : :02/07/10 21:35
>>656
普通にプログラミングすれば、x++と--xだけあればいい。
++xやx--は使う前にアルゴリズムを見直してみることを勧める。

659 :デフォルトの名無しさん:02/07/10 21:36
++は右っ側、--は左っ側にするのか?

660 :652:02/07/10 21:42
>>654
ありがとうございまする
動きました!!GCCなら動いてたんだけどなぁ
BCCは動かないのね…



661 :デフォルトの名無しさん:02/07/10 21:47
>アルゴリズムを見直してみることを勧める

そ、そんなに重大なことなのか!?

662 :デフォルトの名無しさん:02/07/10 21:48
>>658
++xとx++は、コピーコンストラクタ云々で効率が違うんだと。
詳しくは知らん。

663 :japh ◆J.5V8ta6 :02/07/10 21:56
>>658
ん〜む。何故にx++と--xのみ…
よければ理由を教えてもらえないかな?

664 :デフォルトの名無しさん:02/07/10 22:00
>x++が右辺値なのはそうせざるをえないから、かな。
x++が左辺値だったら、なんかまずいワケ?納得いかん。


665 :デフォルトの名無しさん:02/07/10 22:00
>>662
演算子の多重定義の事を考えてみると、前置++は参照値を返すように
書けるが、後置++はできない。関数内で一時変数を作成して、その値
を返すようにしなければならない。

それで、参照値が返せるというのは、すなわち左辺値になりうる、という
説明ではダメ?

666 :japh ◆J.5V8ta6 :02/07/10 22:05
そもそもxの通常の動作は
xをインクリメントし、インクリメントする前の古い値を返す
というもの。
「xをインクリメントする前の古い値」がxそのものであるはずがない…
つまり一時オブジェクトであるということだよ。

ちなみに、ユーザー定義型ではx++に代入させることも可能だよ。
俺はそんな型扱いたくないけどね。



667 :デフォルトの名無しさん:02/07/10 22:06
>>664
前置/後置で左辺値/右辺値でバランス取れてるじゃん!
右辺値だけ使いたい時も在るさ、多分

668 :664:02/07/10 22:12
>>665
なるほど、納得しますた。
>>667
納得いくかっ!

669 :662:02/07/10 22:30
>>665
さんくす。
しかし、それでも後置を使いたいんだなぁぁ。
前置は気持ち悪いのよね。

670 :デフォルトの名無しさん:02/07/10 22:39
>>669
気持ちが悪いという理由で演算子を使い分けられないのなら、プログラマは
向いてないと思われ……。

(それは仕様ですで何でも済ませるヤツもアレだが、仕様を納得できんのも
アレだ)

671 :デフォルトの名無しさん:02/07/10 22:41
プログラマはというか、C++は絶対に向いてないね

672 :デフォルトの名無しさん:02/07/10 22:44
しかしC++は後置だったりする

673 :662:02/07/10 22:52
>>671
確かに向いてないかも。
templateとかあんまり好きじゃないしね。
ヘッダにずらずらと、なんだか汚く感じるんだなぁ。

674 :デフォルトの名無しさん:02/07/10 23:01
>>673
C++は他の言語のいい点をたくさん取り入れたが、汚い所もたくさん
取り入れてしまったね。

675 :デフォルトの名無しさん:02/07/10 23:05
ヘッダに書いた方が良いと思うが。
セパレーションは運用楽だしコンパイル速度も遅くならないが、管理が面倒。

676 :デフォルトの名無しさん:02/07/10 23:05
>>673
それは同意。
資源の浪費だし、テンプレートを使ったコードの最適化は信用できないし。

でも C++ は嫌いじゃないけど?


677 :デフォルトの名無しさん:02/07/10 23:08
どの言語が一番好きかといわれたらダントツでC++だな・・・


678 :デフォルトの名無しさん:02/07/10 23:11
んだんだ。

679 :デフォルトの名無しさん:02/07/10 23:21
仕事には私情を挟むつもりは無いが
同じく俺もだ。

680 :652:02/07/10 23:50
>>657
ありがとうございます。
でもレスが少ないところを見ると、ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
私もラッパー程度の使い方にとどめておきます。

681 :デフォルトの名無しさん:02/07/10 23:59
>>680
オレはOOだよ。
シーンやシナリオはステートパターンで。
スプライトとかオブジェクトにしとけば便利。

682 :デフォルトの名無しさん:02/07/11 00:09
ゲームってOO使えそうじゃない

683 :デフォルトの名無しさん:02/07/11 00:14
例外処理が有効な時とか RTTI が有効な時に定義されるマクロって
何かありましたっけ?
__CPLUSPLUS みたいな感じの。

CodeWarrior と VC++ の場合を知りたいです。

684 :デフォルトの名無しさん:02/07/11 00:15
VC++はヘルプにあった。

685 :デフォルトの名無しさん:02/07/11 00:24
オブジェクトの何等かの状態を知りたい場合、intやdouble,booleanなどのメンバーに
アクセスする時にC++の教科書ではメソッドを介してアクセスされてますがなぜですか?

FieldやPropertyなど、メソッドを介さずに直接Publicなメンバーを用意して
値のやり取りも出来ると思うのですが。


686 :デフォルトの名無しさん:02/07/11 00:26
>685 その理由を説明していない教科書は捨てろ。

687 :デフォルトの名無しさん:02/07/11 00:32
(自分だけが)十分承知使うなら別にそれでもかまわんぞ

688 :デフォルトの名無しさん:02/07/11 00:34
>>685
#define class struct
#define private:
#define protected:
とでもして使えばいい罠。

689 :デフォルトの名無しさん:02/07/11 00:37
>>686
その理由に付いては何となく分かるんですが。(配列、ポインタ、インデクス
範囲、そんなキーワード思い付いたんですが)
教科書探して見ます。

>>687
わかりました。どうもです。

690 :デフォルトの名無しさん:02/07/11 00:38
#define private public
#define protected public
だわな。

691 :デフォルトの名無しさん:02/07/11 00:39
>>688>>690
極悪(w

692 :デフォルトの名無しさん:02/07/11 00:44
>>688-690
ワラタ

693 :デフォルトの名無しさん:02/07/11 05:39
>>680
> ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
絶対数は知らんが、俺は OO だよ。今度、転職する先のゲームメーカーでも
開発の主力言語は C++ だそうだ。

(別のトコロで C 主流ですって会社もあったけど、そっちは断った。言語が理由
じゃないけどね)

694 :デフォルトの名無しさん:02/07/11 05:43
>>688
ANSI C++ の規格では、private, protected, public の中ではメンバ変数のメモリ
配置順序は決まってるが、それをまたがった場合には実装依存になっている。
たとえば

private:
 x;
public:
 y;
private:
 z;

だと x, y, z ではなく x, z, y の順に配置されるかも知れんわけで、そのマクロを定義
すると既存のオブジェクトとバイナリ互換性を崩す可能性があるぞ。

まぁ、ネタニマジレス だけどさ(w

695 :デフォルトの名無しさん:02/07/11 13:57
シングルトンなクラスのgetInstance()とかでnewしたやつは
どこでdeleteすべきですか?

696 :デフォルトの名無しさん:02/07/11 14:05
mainの最後とか

697 :デフォルトの名無しさん:02/07/11 14:07
static Singleton* pinstance = NULL;
if (pinstance == NULL) {
 lock();
 if (pinstance == NULL) {
  static Singleton instance;
  pinstance = &instance;
 }
 unlock();
}
return pinstance;

こうすればいい

698 :695:02/07/11 14:28
>>696,697
ども。697を見てて思ったんですけど、
Singleton* Singleton::getInstance()//staticなメンバ
{
 static Singleton inst;
 return &inst;
}
なんてするとヤヴァイですか?

699 :デフォルトの名無しさん:02/07/11 14:30
>>694
なるほど、そうすると、privateなメンバを持つクラスのヘッダファイルを
書き換えて、privateメンバをいじくって楽しむというのは危険な行為な
のですね。

まあもともとC++のカプセル化機構は、いくらでも壊すことができるから、
使う人に全責任があるわけですが。

700 :695:02/07/11 14:31
>>698
むりですた

701 :デフォルトの名無しさん:02/07/11 14:45
>699
危険なヤシが居ます

702 :695:02/07/11 14:45
ガーン。二重deleteしてるだけだった。
とりあえず>>698でよさげなのですが、697さんのように
いちいちチェックしたほうがよいですか?

703 :デフォルトの名無しさん:02/07/11 14:51
697のはマルチスレッドで間違って2つのインスタンスが生成されるのを防ぐ方法

704 :デフォルトの名無しさん:02/07/11 17:15
#include<stdio.h>
#include<stdlib.h>
typedef struct cell{
eki[20];
struct cell *next;
} CELL;
CELL *link(char *eki,CELL *p){
char *q,*r;
q=(CELL *)malloc(sizeof(CELL));
strcpy(q->eki,eki);
if(p==NULL){
q->next=NULL;
return q;
}
r=p;
while(r->next!=NULL){
r=r->next;
}
r->next=q;
q->next=NULL;
return p;
}
main(){
CELL *start=NULL;
char eki[20];
while(scanf("%s",eki)!=EOF){
start=link(eki,start);
}
連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。
ポインターの所にエラーがきます。どう直せばいいのでしょうか?


705 :デフォルトの名無しさん:02/07/11 17:17
ぜんぜんC++じゃないじゃん。

706 :デフォルトの名無しさん:02/07/11 17:22
> 連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。

このソースが通るコンパイラってあるのでしょうか…

707 :デフォルトの名無しさん:02/07/11 17:25
>>704
通るように修正したよ。(動作確認はしてない)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cell{
char eki[20];
struct cell *next;
} CELL;

CELL *link(char *eki,CELL *p){
CELL *q,*r;
q=(CELL *)malloc(sizeof(CELL));
strcpy(q->eki,eki);
if(p==NULL){
q->next=NULL;
return q;
}
r=p;
while(r->next!=NULL){
r=r->next;
}
r->next=q;
q->next=NULL;
return p;
}

main(){
CELL *start=NULL;
char eki[20];
while(scanf("%s",eki)!=EOF){
start=link(eki,start);
}
}


708 :デフォルトの名無しさん:02/07/11 17:25
>>704
VCとunixとでは仕様が全然違う。きをつけろ

709 :デフォルトの名無しさん:02/07/11 17:25
eki[20];
何型?

710 :デフォルトの名無しさん:02/07/11 17:28
とおりましたありがとう。
ちなみに出力関数忘れてましたw。

711 :デフォルトの名無しさん:02/07/11 17:29
>>709
コピーするときに間違えたと思われ

712 :てすとちゅぅ:02/07/12 18:55
Σ(´д`;)

なんで仮想関数の方が呼び出しが早いんだろう・・・
おかしいな

713 :デフォルト名無しさん:02/07/12 19:07
Vicual C++で、

int main()
{

char ss[5];
cin >> ss;

cout << ss << '\n' ;

return 0;
}

を実行すると、8文字まで打ち込んでも返してくれます。
9文字目でエラー発生。

どうして???

714 :デフォルトの名無しさん:02/07/12 19:08
>>713
char ss[5];

715 :デフォルトの名無しさん:02/07/12 19:09
ふざけてんの?

716 :713:02/07/12 19:09
>714
だからさ、5文字って指定しているのにどうして
8文字までOKなのかってことさ。

717 :デフォルトの名無しさん:02/07/12 19:09
>>704
C++でmallocなんて化石は使うな。
と言ってみる。

718 :デフォルトの名無しさん:02/07/12 19:11
>>716
あんたの環境ではたまたま大丈夫だったってだけだろ?

719 :713:02/07/12 19:11
そんなもんなの???

720 :デフォルトの名無しさん:02/07/12 19:13
>>719
ss[4]以降もメモリーは続く。

721 :720:02/07/12 19:13
s/ss[4]/s+4/

722 :721:02/07/12 19:14
違う、ss+4だ・・

723 : :02/07/12 19:15
ss/ss[4]/ss+4 ?

724 :デフォルトの名無しさん:02/07/12 19:17
>>723
何気におもろかった。

725 :デフォルトの名無しさん:02/07/12 19:18
>>716
OKじゃなかったらバッファオーバーフロウの心配なんてしねーよ。

726 :723:02/07/12 19:18
?

727 :デフォルトの名無しさん:02/07/12 19:22
s/じゃなかったら/なら

728 : ◆JAPH9PWA :02/07/12 20:10
つまり幅を制御したければstd::setwを使え、と。


729 :デフォルトの名無しさん:02/07/12 23:37
alignment …ああ、ネタにマジレスしちまった。

730 :デフォルトの名無しさん:02/07/13 12:42
例外をthrowする時いろいろ情報を渡したいので
MyException:クラスを作ってコンストラクタを
MyException::MyException(const、char* sourceFile, int sourceLine, const char* format, ...)
と定義して
throw MyException("HOGE(%d) %s", a , b);
等として使っているのですが、
これだとCのヘッダ <stdarg.h> をインクルードしないと巧く行きません。

iostreamとか使ってもっと、C++風にかっこよくするにはどうしたら良いのでしょう?


731 :デフォルトの名無しさん:02/07/13 12:44
まちがった!
throw MyException("HOGE(%d) %s", a , b);

throw MyException(__FILE__, __LINE__, "HOGE(%d) %s", a , b);
です

732 :デフォルトの名無しさん:02/07/13 13:14
無い

733 :デフォルトの名無しさん:02/07/13 13:16
vectorとかに格納してみるとか。

734 :デフォルトの名無しさん:02/07/13 13:17
「newしたものをdeleteしわすれる」以外に
メモリーリークすることってありますか?

735 :デフォルトの名無しさん:02/07/13 13:33
mallocしたものをfreeしわすれる

736 :デフォルトの名無しさん:02/07/13 13:37
配列のdeleteに[]を付け忘れる。

737 :デフォルトの名無しさん:02/07/13 13:42
>>735 >>736
以外でありますかね?
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
したらなぞのメモリーリーク検出するんですよねぇ。。
newもmallocもつかってないのに。。

738 :デフォルトの名無しさん:02/07/13 13:54
Winの場合だけども、リソースを解放し忘れてるとか。

739 :デフォルトの名無しさん:02/07/13 14:04
>>730
可変個引数はあきらめて、引数を1個、2個、3個、…持つ
テンプレート関数としてコンストラクタを定義する。

740 :734=737:02/07/13 14:06
どうも。コメントアウトしながらつきつめていったら、
どうやらstd::stringのつかいかたをあやまっていたようです。

std::string str;
str = "";
ってだめコードですか?

741 :デフォルトの名無しさん:02/07/13 14:16
>>730

確か、operator,()ってオーバーロードできたよなぁ…
それ使って、

template <class T>
class variable_arg : public T {
  variable_arg(T);

  template <class T2>
  operator,(T2);
};


template <class T>
MyException(int,int,string,variable_arg<T>)

とかって定義してやるのは無理かなぁ…。。。
C++初心者なのでわかりませぬ…。。。

742 :741:02/07/13 14:18
関係ないところを訂正

MyException(const string&, int, const string&, variable_arg<T>);

ちょっと試してみよう。。。

743 :デフォルトの名無しさん:02/07/13 14:32
>>740
駄目ではないと思う。
str.clear() だとリークは起こらないの?

744 :740:02/07/13 14:39
stringに関することはstlすれかな?微妙だけどとりあえずここで。
stlport(4.5.3=今の最新)はメモリリークが発生します。
SGIのアローケーターがよろしくないらしいので、
$stlport\stl\_site_config.hの
#define _STLP_USE_NEWALLOC 1
をコメントアウトするといいようです。
ってがいしゅつ?(だろうな)

745 :デフォルトの名無しさん:02/07/13 14:48
ちゃいます。
普通はNode Allocatorが使われるので、
#define _STLP_USE_NEWALLOC 1

#define _STLP_USE_MALLOC 1
どちらかを定義します

746 :740:02/07/13 14:51
thx.
自分のソースで定義しろってことですよね?

747 :デフォルトの名無しさん:02/07/13 15:02
違う
〜\stlport\stl_user_config.h
に書き加える。iostreamも使っている場合、
ビルドし直さないと原因不明のバグの元になる。

748 :デフォルトの名無しさん:02/07/13 15:14
>730
proxyクラスのインスタンスを作って、そいつをコンストラクタに渡すのはどうよ?

proxyとしてstd::ostringstreamがそのままつかえるかと思ったけど、
operator << が返すのはostream型なので
コンストラクタはostringstream型ではなくostream型にしなければいけない。
だから、そのまま使うとダウンキャストが必要で、
使い方によってはここで例外が出る(動作はしらん)。
その場合はこんな感じ。
class MyException {
 std::string str;
public:
 MyException(const std::ostream& s): str(dynamic_cast<const std::ostringstream&>(s).str()) {}
 const std::string& what() const { return str; }
};
void f()
{
 throw MyException(std::ostringstream() << " file: " << __FILE__ << " line: " << __LINE__ << " hoge");
}
int main()
{
 try {
  f();
 } catch (MyException& e) {
  std::cout << "Exception: " << e.what() << std::endl;
 }
 return 0;
}

749 :デフォルトの名無しさん:02/07/13 15:31
>>734
STLport使ってるとか?

750 :デフォルトの名無しさん:02/07/13 15:35
この不具合ってSTLportについてだけ報告されてるの?

751 :デフォルトの名無しさん:02/07/13 15:35
ostringstream() << 〜ってできないよ

752 :デフォルトの名無しさん:02/07/13 15:36
>>750
不具合じゃないよ
パフォーマンスを上げるために一部をプールしてるだけ。

753 :デフォルトの名無しさん:02/07/13 15:49
そうだったんだ。でも何時の間にかリークしてるっていうのは嫌だな。

754 :デフォルトの名無しさん:02/07/13 15:51
>>753
リークはリークだけど、どれだけ運用してもリーク量は増加しないよ

755 :デフォルトの名無しさん:02/07/13 15:59
「プール」は「リーク」じゃない
と、Effective C++に書いてありますが

756 :デフォルトの名無しさん:02/07/13 16:00
>>750
sgiからおとしたほうも同じく起こります。
>>754
ってことはこのリークは気にしなくてもいいのですかな?


757 :デフォルトの名無しさん:02/07/13 16:00
リークとは、それを指すポインタが失われて、解放する手段がなくなった
時。

758 :デフォルトの名無しさん:02/07/13 16:16
>>730,748
これでどう?
#include <iostream>
#include <sstream>

using namespace std;

class ErrorMessage {
ostringstream os;
public:
ErrorMessage( const char *file, int line ) {
os << file << "(" << line << "): ";
}

template<class T>
ErrorMessage& operator+( T x ) {
os << x;
return *this;
}

operator const string () const {
return os.str();
}
};

void foo( const string& s )
{
cout << s << endl;
}

int main()
{
int a = 10;
char b[] = "hogehoge";

foo( ErrorMessage(__FILE__, __LINE__) + "HOGE(" + a + ") " + b);
return 0;
}


759 :デフォルトの名無しさん:02/07/13 16:26
>>758
(・∀・)カコイイ!!

760 :デフォルトの名無しさん:02/07/13 16:32
カコワルイ
std::string(__FILE__) + __LINE__ + "HOGE(" + lexical_cast<string>(a) + ")" + lexical_cast<string>(b);


761 :デフォルトの名無しさん:02/07/13 16:47
>>757
(・∀・)イイ!!

762 :デフォルトの名無しさん:02/07/13 17:25
>>760を見てまたC++が俺の知らない間にトランスフォームしちまったのかと
焦った。Boostかあ、ちょっと見てみるかなあ。

763 :デフォルトの名無しさん:02/07/13 19:42
>>760
それだけ見ると lexical_cast って、あまり使い勝手よいとは
思えないんだが、どういうインタフェースなの?

764 :デフォルトの名無しさん:02/07/13 19:58
int a = lexical_cast<int>("100");
int b = lexical_cast<int>(a);
float c = lexical_cast<float>("1.234");
std::string d = lexical_cast<std::string>(a);

こんな感じで。

765 :デフォルトの名無しさん:02/07/13 19:58
>>763
10行程度だからソース見れ。
http://www.boost.org/boost/lexical_cast.hpp

766 :デフォルトの名無しさん:02/07/13 20:24

たとえは、"%04d"とか、書式使うには
int n = 10;
ostringstream os;
os << "id(" << setw(4) << setfill('0') << n;
ってやるしかないんじゃないの?

767 :デフォルトの名無しさん:02/07/13 20:47
os.width(4);
os.fill('0');

768 :デフォルトの名無しさん:02/07/13 20:50
スマタ。ostringstreamか

769 :デフォルトの名無しさん:02/07/13 20:50
printfの方がいいな。

770 :デフォルトの名無しさん:02/07/13 20:52
つまり、>>758の方法では、>>730のやりたい事を完全に置き換えられないmmじゃない?


771 :デフォルトの名無しさん:02/07/13 20:53
os << setwidth(4) << setfill('0') << n;

772 :デフォルトの名無しさん:02/07/13 20:57
STLも改訂してCの書式出力をサポートしてくんないかな・・

773 :デフォルトの名無しさん:02/07/13 21:02
>>772
自作の道がある。

774 :デフォルトの名無しさん:02/07/13 21:03
>>771は間違いですから無視してくださいスマソ。

775 :デフォルトの名無しさん:02/07/13 21:14
>>756
STLport が STL コンテナで使ってる node allocator の仕様だ。

いやなら _STLP_MALLOC_ALLOC (だったかな? マニュアル参照してくれ)
あたりのマクロを定義すると、node allocator 使わずに malloc / free するよ
うになるから、その手のリークチェッカに引っかからなくなる。

ただし、致命的にパフォーマンスが落ちるから、リリースビルドでは標準の
アロケータを使った方が良いと思う。

776 :デフォルトの名無しさん:02/07/13 21:14
やっぱり>>730の方法が一番シンプルで良いと思う

777 :デフォルトの名無しさん:02/07/13 21:18
>>770
#include <iomanip>
して、771 のように
ErrorMessage() + "setw(4) + setfill('0') + n;
でいける。

778 :デフォルトの名無しさん:02/07/13 21:21
そんなわけわからん記述してまで・・>730がシンプルでいいじゃん。

779 :デフォルトの名無しさん:02/07/13 21:30
まあまあ、半分ネタと思いつつやってるんだから (w
で、オレとしては、setfmt みたいなマニピュレータを定義して、
os << setfmt("04d")
とかだったら、
os.width(4);
os.fill('0');
とやってくれるようなのを作ればいいんじゃないかと。

780 :16メロミックス ◆/ECTibn. :02/07/13 21:45
パンピーより質問です。

日韓翻訳掲示板を作りたいのですが、
協力してもらう事は可能でしょうか?

781 :デフォルトの名無しさん:02/07/13 21:52
ここは技術板で、制作板じゃない

782 :16メロミックス ◆/ECTibn. :02/07/13 21:55
>>781
スマソ

783 :デフォルトの名無しさん:02/07/13 22:02
exit();で終了するとメモリーリークが起きました。
exitの代わりになる物はないですか?

784 :デフォルトの名無しさん:02/07/13 22:03
終了時のメモリリークは気にするな
リソースリークは気にしないとだめだが

785 :デフォルトの名無しさん:02/07/13 22:47
>784
どうも。ってことは代替物はない?
メモリーリークはどうも気持ち悪くて・・

786 :デフォルトの名無しさん:02/07/13 23:13
それを潰してもプログラムの性能も安定性もまったく向上しないと思うが...

787 :デフォルトの名無しさん:02/07/13 23:15
windowsはリソースへっていかないの?

788 :デフォルトの名無しさん:02/07/13 23:15
終了時の無駄な解法の分だけパフォーマンスが落ちるね

789 :デフォルトの名無しさん:02/07/13 23:17
ちゃんと80-20の法則守れよな。

790 :デフォルトの名無しさん:02/07/13 23:18
>789
なんすか?それ

791 :デフォルトの名無しさん:02/07/13 23:19
>>790
お前知らないのか??
バカだな〜

792 :デフォルトの名無しさん:02/07/13 23:22
どうでもいいよ。

793 :デフォルトの名無しさん:02/07/13 23:26
>>791
おまえ知ってるっちうか実行してるのか?
バカだな〜

794 :デフォルトの名無しさん:02/07/13 23:29
仕方ねえな教えてやるよ
80才まで20本の歯を保とうだぞ?
世間の常識だから覚えとけよ。

795 :デフォルトの名無しさん:02/07/13 23:31
>>793
俺は0-100だ。
たとえ重要じゃないところでもみっともないコードは残せない

796 :デフォルトの名無しさん:02/07/13 23:32
Windowsの場合プロセス終了してもメモリ解放してくれないんじゃなかったっけ?

797 :デフォルトの名無しさん:02/07/13 23:34
>>795
えーと、あれだな。
たとえスライム一匹でもフルパワーを持って倒しに行くタイプ。

798 :デフォルトの名無しさん:02/07/13 23:35
スライムが居るので議論が進みません。

799 :デフォルトの名無しさん:02/07/13 23:37
0-100 ではないがスライムに対しては全力で挑む。

800 :デフォルトの名無しさん:02/07/13 23:44
スライムはほっといてメモリーリークはどうしますか?
全部潰す派ですか?

801 :デフォルトの名無しさん:02/07/13 23:44
>>796
んなこたぁない。
解放されないのはリソース。

802 :デフォルトの名無しさん:02/07/13 23:44
リークが怖いヤシはassert入れるなよ

803 :デフォルトの名無しさん:02/07/13 23:46
解放忘れさえしてなければリークは気にしない派。

804 :デフォルトの名無しさん:02/07/13 23:48
win32ならリソースも解放されるよ・・・

805 :デフォルトの名無しさん:02/07/13 23:51
じゃあ終了時のメモリリークはバグじゃないって事でいいですね?

806 :デフォルトの名無しさん:02/07/13 23:55
>>804
9x系でDCにオブジェクトを選択したままプロセスが死ぬと
GDIリソースは解放されません。

807 :デフォルトの名無しさん:02/07/14 09:14
>>806
「9x系で」ってことは、OSのバグってことでいいですね?

808 :デフォルトの名無しさん:02/07/14 09:23
メモリリークは命がけで怪傑汁

809 :デフォルトの名無しさん:02/07/14 09:33
>>807
バグじゃなくて仕様だって。
気に入らない動作=すべてバグ って厨房じゃないんだから。

810 :デフォルトの名無しさん:02/07/14 14:45
全て仕様ってことで押し通す気ですね:-)

811 :デフォルトの名無しさん:02/07/14 17:20
numeric_limits の max/min が関数になってるのは何故ですか?

812 :デフォルトの名無しさん:02/07/14 18:27
浮動小数点型とかだと、is_bound というメンバが true じゃないと
max/min が裕子にならないから、みたいだよ。

813 :811:02/07/14 19:08
>>812
その理由だと、 digits も関数になってるはず。
やっぱりわからん。

814 :デフォルトの名無しさん:02/07/14 19:34
データメンバだと値を設定しないといけないじゃない

815 :812:02/07/14 19:58
そうか、整数型以外はクラス定義での static const な変数の
初期化はできなかったね。

816 :811:02/07/14 20:14
>>815
あー。それですな、きっと。理解しました。
ありがと。>>812,>>814

817 :デフォルトの名無しさん:02/07/14 20:21
static でメンバ関数を宣言した時とそうでない場合の違いを教えてください。
static 関数で定義された関数を class :: 関数 で呼び出す時、
一時的にクラスは作成されるのか教えてください。

818 :デフォルトの名無しさん:02/07/14 20:28
呼ばれるときにthisが漏れなく付いてくる(非static)か、
付いてこない(static)か。

819 :プログラマ・ペレ:02/07/14 20:30
>>817
C++ third editionを買ってください。
私ならそうします。

820 :デフォルトの名無しさん:02/07/14 20:33
C++ は他のオブジェクト指向言語とは違い、動的にクラスを生成したり
することはできない。クラスはコンパイル時に静的に生成される。

821 :817:02/07/14 20:36
>>818〜820
速レスさんくす

822 :デフォルトの名無しさん:02/07/14 20:37
Javaも動的にクラスを生成できないが?

823 :デフォルトの名無しさん:02/07/14 21:37
たしか BSF 使えばできるよ。

824 :デフォルトの名無しさん:02/07/14 21:50
BSFって?

825 :デフォルトの名無しさん:02/07/14 23:34
Binary Sex Fucking
(両性どちらとでもOKです)

826 : ◆JAPH9PWA :02/07/14 23:38
numeric_limits<>は全部関数だったらいいのに、と思ってしまうのは俺だけだろうか。
static constと入り混じってわかり難いよ…。

827 :デフォルトの名無しさん:02/07/15 01:54
さっき発見したんだけど、C++ではifのなかで変数宣言できるんだね。
こりゃ便利。

828 :デフォルトの名無しさん:02/07/15 03:00
>>827
式が書ける所ならどこでも宣言できる。

829 :デフォルトの名無しさん:02/07/15 08:11
>>828
Test(class : public Base{}());とか出来ればいいのになぁ…。


830 :デフォルトの名無しさん:02/07/15 08:32
C++ではポインタはあまり使わずに参照をしたほうが良いのですか?

831 :デフォルトの名無しさん:02/07/15 09:08
>>830
場合による。


832 :デフォルトの名無しさん:02/07/15 09:10
>>830
正直、勉強不足。

833 :デフォルトの名無しさん:02/07/15 09:42
たかぎのMM (C++講座)
http://www.melonpan.net/melonpa/mag-detail.php?mag_id=000211
ここの人がそういってます。
C++の特徴を始めのほうで羅列しておりますがめちゃくちゃのような気がします。
ほとんど間違っていると思うのですがどうでしょうか?

834 :デフォルトの名無しさん:02/07/15 09:45
↑このメールマガジンは参考になりますか?

835 :デフォルトの名無しさん:02/07/15 11:15
>>827,828
でも、
if (int i = foo())
みたいに代入式しか書けないよね?
if ((int i = foo()) == 2)
みたいに条件判断も書けるといいんだけど。

836 :デフォルトの名無しさん:02/07/15 12:39
プログラム言語で信じられるのはANSI/ISOとかのドキュメン
トと有名図書ぐらいでそれ以外の解説ははっきりいって役に
立たない。役に立たないどころか有害でさえある。

837 :デフォルトの名無しさん:02/07/15 14:44
K&Rっていう遺物は有害だな。

838 :デフォルトの名無しさん:02/07/15 20:04
cygwinのgccでc++プログラムコンパイルしたら
テンプレートの定義が見つからないのかなんなのかやたらエラーがでました。
設定に問題があるのかサポート外なのか。。どっちですか?

839 :デフォルトの名無しさん:02/07/15 20:09
バージョンは?

840 :デフォルトの名無しさん:02/07/15 20:13
すんません。
自分で書いててあれ?gccだっけ
と思いg++でやったらできますた。。

841 :デフォルトの名無しさん:02/07/15 21:04
あのう 自分forにつかうiとかjも事前に、
int i,j;
というふうにしとるんですけども。
やっぱりだめどすかね。
すまあとじゃねえどすかいね。

842 :デフォルトの名無しさん:02/07/15 21:11
変数のスコープは最小限にしませう。

843 :デフォルトの名無しさん:02/07/15 21:29
for内でi宣言すると
forからでたら、i無くなっちゃうんどすか?

初心者でスマソ

844 :デフォルトの名無しさん:02/07/15 21:33
>>843
最近はそのとおり。昔は違った。

845 :843:02/07/15 21:36
844…あうーサンクスコですー
そうか最近は消えるのか…やっぱり年はとりたくないもんだなーって
それくらい実験すればわかったな…
なんでもきいてスマソ

846 :デフォルトの名無しさん:02/07/15 21:37
いいんじゃない?相談室だし。

847 :843:02/07/15 21:48
#include<iostream>
using namespace std;
int main()
{
for(int i=0;i<2;i++){
for(int i=3;i>0;i--){
cout <<"ahhhh\n";
}
}
}

あーうーほんとだーうごいたー なるー さんくすこ 
int j;がいらなくなった!
あれ?前段のiを後段で呼び出すのはどうすればいいんだ?


848 :デフォルトの名無しさん:02/07/15 21:52
>>847
普通そんなこと考えない

849 :843:02/07/15 21:53
848
ごもっとも!

850 :848:02/07/15 21:54
俺は遊ばれたのですか?

851 :843:02/07/15 21:56
いやー方法あるなら聞きたいと思っただけです
遊んでおりません。
なんか this.i みたいなかんじであるのかなと…
逝ってきます

852 :デフォルトの名無しさん:02/07/15 21:59
>>851
this.i?


853 :843:02/07/15 21:59
そんな夢のある方法を使えば
変数ひとつでプログラムがかけてしまう!とか何とか
思ったりしたと思われ…

854 :デフォルトの名無しさん:02/07/15 22:03
>>853
環境依存、動作補償なし(九九表)
int main(){
for(int i=1;i<10;i++){
for(int i=1;i<10;i++)
std::cout << std::setw(2) << i* *(&i+1) << " " ;
std::cout << "\n" ;
}
}

855 :デフォルトの名無しさん:02/07/15 22:03
せめてthis->iって書いて欲しかった。

856 :843:02/07/15 22:04
>>852
変数のスコープも和歌ランぐらい初心者なので
ウル覚えですが…自分自身のクラスだったっけ???
グーぐる先生に聞きに逝ってきます

857 :843:02/07/15 22:07
>>854
>エラー E2316 a.cpp 6: 'setw' は 'std' のメンバーではない(関数 main() )
しくしく63

>>855
そうでした スンマソン

858 :デフォルトの名無しさん:02/07/15 22:08
VC6 との互換性を考えて

{ for(int i; i < 10; i++){} }

と書くけど、やっぱダサい!

859 :デフォルトの名無しさん:02/07/15 22:09
>>857
#include <iomanip>


860 :デフォルトの名無しさん:02/07/15 22:10
if(0)else forよりカコイイ

861 :デフォルトの名無しさん:02/07/15 22:10
#define for if(0); else for

862 :861:02/07/15 22:11
ぐあああ、俺だせぇ

863 :843:02/07/15 22:14
>>858
VC6ではそうしないといけないのか…大変だな
>>859
隊長!動きました…けどやっぱりダメみたいですね。
結果は無残だった。

864 :デフォルトの名無しさん:02/07/15 22:15
足して駄目なら引いてみるとか?

865 :843:02/07/15 22:16
>>862
なるほどと思ったりなんかして…
#define for {for
あ、閉じる括弧は無理ジャン…
なるほどね

866 :843:02/07/15 22:23
たした
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008
1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008

ひいた
256 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18
2 4 6 8 10 12 14 16 18


867 :854:02/07/15 22:40
いや別に試さんでも…
冗談だし。しかし866のメモリレイアウトはどうなっているのだろう。

868 :843:02/07/15 22:44
あ、うまくいく場合もあるようですね
当然だが…
ポインタの差を求めてそれをたし元に戻すと…
ポインタの差が変わってて しょんぼりって…
これじゃ使えないジャンか!!

869 :デフォルトの名無しさん:02/07/15 22:46
boostでGUIプログラミングは作れないんですか?
だとするとあんまり役に立たないような・・やっぱ
MFCで逝くしかないのか・・

870 :デフォルトの名無しさん:02/07/15 22:47
べつに作れるんじゃないの?

871 :843:02/07/15 22:49
-2 1 -2 2 -2 3 -2 4 -2 5 -2 6 -2 7 -2 8 -2 9
-2 2 -2 4 -2 6 -2 8 -2 10 -2 12 -2 14 -2 16 -2 18
-2 3 -2 6 -2 9 -2 12 -2 15 -2 18 -2 21 -2 24 -2 27
-2 4 -2 8 -2 12 -2 16 -2 20 -2 24 -2 28 -2 32 -2 36
-2 5 -2 10 -2 15 -2 20 -2 25 -2 30 -2 35 -2 40 -2 45
-2 6 -2 12 -2 18 -2 24 -2 30 -2 36 -2 42 -2 48 -2 54
-2 7 -2 14 -2 21 -2 28 -2 35 -2 42 -2 49 -2 56 -2 63
-2 8 -2 16 -2 24 -2 32 -2 40 -2 48 -2 56 -2 64 -2 72
-2 9 -2 18 -2 27 -2 36 -2 45 -2 54 -2 63 -2 72 -2 81

−2を無視すると動いているようには見える

872 :デフォルトの名無しさん:02/07/15 23:30
クラステンプレートって
メンバ関数の実装も全部ヘッダファイルに書かないとダメ
なんでしょうか?

873 :デフォルトの名無しさん:02/07/15 23:40
>>872
分けることもできるけど、
その分けた実装がコンパイルされるときに
明示的なインスタンス化をやっとかないと
リンクエラーになるよん

874 :デフォルトの名無しさん:02/07/15 23:47
>873
ありがとうございました、なんとかうまくいきました

875 :デフォルトの名無しさん:02/07/16 00:17
>for(int i=1;i<10;i++){
>for(int i=1;i<10;i++)
正直これは改悪だと思われ。



876 :デフォルトの名無しさん:02/07/16 00:18
forやifの後に命令ひとつでも{}してしまいたくなる症候群なのですが
コンパイル時に実害はありますか?

877 :デフォルトの名無しさん:02/07/16 00:19
>>876
最近のコンパイラはすごいです。

878 :デフォルトの名無しさん:02/07/16 00:22
>>876
わしも

879 :デフォルトの名無しさん:02/07/16 00:23
>>877
どうすごいの?

880 :デフォルトの名無しさん:02/07/16 00:30
コンパイラvs{}
   ↓
コンパイラwin

881 :デフォルトの名無しさん:02/07/16 00:30
>>879
脱いでもすごいです

882 :デフォルトの名無しさん:02/07/16 00:32
なんか実害はなさげですかな?
コンパイラはそんなにあほではないのね。
>>878
やっぱりいるんだ。うれしいような

883 :デフォルトの名無しさん:02/07/16 00:41
>>876
最近やめますた&1行だったらforの中に突っ込んですまいます。

884 :デフォルトの名無しさん:02/07/16 00:43
>>876
いいと思う
if(i>=0) if(i>=1) if(i>=2) ;
else std::cout << i ;
こんなのあったら何がなんだか分からんし

885 :デフォルトの名無しさん:02/07/16 01:35
そんな風にしちゃうのと、{} でくくらないのは別問題。

886 :デフォルトの名無しさん:02/07/16 02:34
乗り遅れた。。
チィッ

887 :デフォルトの名無しさん:02/07/16 08:32
メンバ関数内にstatic変数を使うくらいなら
その変数はメンバ変数にしてしまった方がいいのでしょうか?

888 :デフォルトの名無しさん:02/07/16 08:38
>>887
意味的には×かと。
他からアクセスする気がない変数なら敢えてそうする必要はないかと。

889 :デフォルトの名無しさん:02/07/16 08:42
>>887
時と場合によりけり。
その変数をほかの関数からつかう可能性があればメンバ変数。
ほかの関数からは絶対呼ばないようなときは関数内static。
ま、「変数のスコープは最小限に」っつーことです。
でもその変数がそのクラスにとって重要ならメンバ変数でもよい。

890 :887:02/07/16 08:57
>>888-889
レスありがとうございます。

>時と場合によりけり。
とりあえず、迷ったらメンバ変数にする方向でいきます。
なんか、上司がstatic変数にブチギレしてたので。
本人曰く「staticアレルギー」らしいです…(藁?

891 :デフォルトの名無しさん:02/07/16 09:05
マルチスレッドとかで痛い目にあったんだろうな。

892 :デフォルトの名無しさん:02/07/16 09:08
つぅか出来る限りstaticを使わないと言うのが・・・

893 :デフォルトの名無しさん:02/07/16 13:26
メンバ関数の中の静的変数ってそのクラスの全部のインスタンスから
参照されてしまうからね。メンバにするのとは意味が違ってくる。

894 :デフォルトの名無しさん:02/07/16 18:29
staticにするかしないかで迷うことなんてある?


895 :デフォルトの名無しさん:02/07/16 19:54
通常のメンバ関数とstaticメンバ関数の違いがいまだによくわからない。

896 :デフォルトの名無しさん:02/07/16 20:02
>>895
staticメンバ関数なら
ClassName::function();
と呼べる。

897 : :02/07/16 20:16
>>895
staticメンバ関数なら、>>896 のようにインスタンスを作成せずに呼べる。
通常のメンバ関数だと、foo.function()のように
わざわざインスタンスを作成しなければならない。


898 :デフォルトの名無しさん:02/07/16 20:42
あげ

899 :デフォルトの名無しさん:02/07/16 20:56
all right.

900 :デフォルトの名無しさん:02/07/17 00:47
>>896>>897
サンクス。

901 :デフォルトの名無しさん:02/07/17 10:40


902 :デフォルトの名無しさん:02/07/17 11:25
静的メンバ関数からは静的メンバ変数しかアクセスできない。
インスタンスがあろうと無かろうと。(無い場合を考慮すれば当然だが)
コールバックなんかには静的メンバ関数であれば渡すことができる。

903 :デフォルトの名無しさん:02/07/17 19:25
C++でデータベースにアクセスするとしたらどんなライブラリが一般的ですか?

904 :デフォルトの名無しさん:02/07/17 19:28
DBごとにアクセス用のライブラリが用意されてると思うけど
Win上ならODBC経由だろうねー

905 :デフォルトの名無しさん:02/07/17 19:34
unixなら何でしょう??

906 :デフォルトの名無しさん:02/07/17 19:38
標準は無いと思った。蛇足だけどJavaならJDBCだのー
つかスレ違いっぽいから他スレ行けよ。

907 :デフォルトの名無しさん:02/07/17 19:41
そうすか。すんまそ。でわでわ

908 :デフォルトの名無しさん:02/07/17 20:52
クラスの宣言をヘッダに定義をcppファイルに書いています。
ここでこのクラスのオブジェクトを操作するようなグローバルな関数
(例えばswap(class T, class T)みたいな)ですが
プロトタイプはヘッダ、実装はcppに書く、というのが一般的な記述ですか?

909 :デフォルトの名無しさん:02/07/17 20:56
>>908
疑問点が明確でない。どゆこと?

910 :デフォルトの名無しさん:02/07/17 21:01
つまり
このクラスを扱うグローバルな関数をこのクラスとセットで提供したいのです。
この場合関数をcppファイルに書いたのですが、プロトタイプはどこに書こうかなぁ、、と思いまして。
externキーワードつければcppファイルに書いても他のファイルから参照できるんでしたっけ??


911 :デフォルトの名無しさん:02/07/17 21:03
>>908
もっとちゃんと句読点を入れて書けよ。

テンプレートを作りたいなら、全部丸ごとヘッダに書け。
そうじゃないなら、ヘッダには宣言だけを、*.c/*.cpp に定義を書け。


912 :デフォルトの名無しさん:02/07/17 21:04
そのグローバル関数のプロトタイプを、クラスのヘッダに買いときゃ
いいんじゃないの?externつけるまでも無く

913 :デフォルトの名無しさん:02/07/17 21:06
>912
そうですか。そうします。ありがとうございます。

914 :デフォルトの名無しさん:02/07/17 21:08
関数はデフォルトでexternだから付けなくてもヨシ。

915 :デフォルトの名無しさん:02/07/17 22:33
>>911
普通のクラスのメソッドの定義はヘッダじゃマズイっすか?

916 :デフォルトの名無しさん:02/07/17 22:37
>>915
inlineじゃない場合、まずいんじゃない?リンク時にぶつかりそう

917 :デフォルトの名無しさん:02/07/17 23:24
>>916
サンクス♪

918 :デフォルトの名無しさん:02/07/20 01:01
MSDNより引用
>ローカル タイプを使ってテンプレート関数 (関数テンプレートから作る関数) を作ろうとしています。テンプレート>のインスタンス化では、外部リンケージを持つ型だけが使用できます。
>
>以下のコードではこのエラーが発生します。
>
>template<class T> class X{};
>
>void f()
>{
>struct Y{};
>
>X<Y> x; // エラー
>}

この制限は何のためにあるのですか?


919 :デフォルトの名無しさん:02/07/20 01:04
C++仕様が"何の為"にあるかを知る本はD&EかARMのどちらかだ。

# ?(・∀・)? ソウダッケ?

920 :デフォルトの名無しさん:02/07/20 01:29
プログラマの給料の為だろ

921 :デフォルトの名無しさん:02/07/20 13:33
>>918
テンプレートのインスタンス生成は関数やクラスの外で行われるから。
(C++ 3rd, C.13.8.3)
これは仕様だが、なぜそういう仕様になっているかは知らない。
それを許すとあまりにもコンパイラを作るのが面倒になるからかなぁ?

922 :デフォルトの名無しさん:02/07/20 18:05
bool Get() { return m_bBool; } を
bool * Get(){ return &m_bBool; } とやる利点を教えてください



923 :デフォルトの名無しさん:02/07/20 19:19
VC++でお勉強がてらコンソールアプリ作っているんですけど
画面をクリアする方法はないのですか?

924 :デフォルトの名無しさん:02/07/20 19:24
system("cls");

925 :デフォルトの名無しさん:02/07/20 19:24
>>918
テンプレート使いまくったプログラムのマップファイルを見れば、
少しは納得がいくと思うよ。

926 :デフォルトの名無しさん:02/07/20 19:32
>>924
サンクス、systemでdosコマンド呼ぶんですね。

927 :デフォルトの名無しさん:02/07/20 20:08
>>922
あえていうなら
・レジスタに乗らないようなサイズならば、参照するのに効率がよい
 (でも普通はconst参照にするんでは)
・ポインタ経由で値を変更できる

boolじゃあんまり利点ないと思うけど...

928 :デフォルトの名無しさん:02/07/20 21:04
>>924
cls なんて外部コマンドはねーよ。

929 :デフォルトの名無しさん:02/07/20 21:09
>>927
> ・ポインタ経由で値を変更できる
そんなことするぐらいなら素直に m_bBool をパブリックにした方がいいと
思うぞ。
普通に考えたら、とても変なことなので >>922 はそういうことしてる奴に
真意を確認した方がいいよ。普通はやらない。と言うか、やっちゃいけな
い。

930 :デフォルトの名無しさん:02/07/20 22:51
>>928
systemはshellを呼び出す関数で、shellの内部コマンドも使えるのを知らないのか

931 :デフォルトの名無しさん:02/07/21 00:39
漏れはboolだったら、↓の様にするけど。。。

class Hoge{
  bool m_isChanged;
public :
  Hoge() : m_isChanged(false) {}

  IsChanged() { return m_isChanged; }
  SetChanged() { m_isChanged = true; }
  ClearChanged() { m_isChanged = false; }
};

932 :デフォルトの名無しさん:02/07/21 00:48
931
bool変数をわざわざintで返すのですか?

933 :931:02/07/21 00:50
型付け忘れてたよ。。。スマソ

934 :デフォルトの名無しさん:02/07/21 00:51
C++ Cording Standard
http://homepage1.nifty.com/fujiwo/develop/xp/cplusstd.html



935 :デフォルトの名無しさん:02/07/21 00:53
( ´∀`)69%モナー

936 :デフォルトの名無しさん:02/07/21 19:23
あのー Win32 スレッド環境で質問なんですが・・。

仮想関数の中でオブジェクトの宣言の順番を変えたり、最適化したり(-Ox)
するとページ違反エラーが発生するので困っております。

次のように書くと A のデストラクト時に ページ違反 (ランタイム)
A a; B b; (-O3 でコンパイル) [シングルスレッドでは問題ないのですが・・]

エラーなし
A a; B b; (-O0 で OK)
B b; A a; (-O3 で OK)
{ A a; } B b; (-O3 で OK)

ちなみに A と B の継承関係は以下のような感じになっているのですが・・
C はオブジェクトの ID を変数に登録しているだけで、お互いは特に関係はありません
(A ← C), ( B ← E ← D ← C ) [ ← ... public 継承 ]

一日中さがしても原因がわからないのでこれはコンパイラのバグなんじゃないかと
思い始めているのですが・・バグのほかに何か考えられますでしょうか・・?

コンパイラは mingw + gcc 2.95.3-6 です

937 :デフォルトの名無しさん:02/07/21 19:29
シングルスレッドで問題ないなら、
同期まわりのバグのほうを疑うべきじゃないのか?

938 :デフォルトの名無しさん:02/07/21 19:29
どこかでメモリ破壊をしている。
具体的なソースを上げられないなら、手の施しようがないと思うが。

939 :936:02/07/21 23:16
>>937,938
アドバイスに添って調べてみたら微妙なミスを発見しました。
解決できました。ありがとうございました!

940 :デフォルトの名無しさん:02/07/22 01:34
windowsでdllとアプリの間に共通の自作クラスを使用する場合は
どこで宣言するのが吉?
vector <myClass *> classes
みたいなオブジェクトをdllとメインプロジェクトの間でやりとりしたくて
迷っています

941 :デフォルトの名無しさん:02/07/22 01:39
宣言は必要なところすべて
インスタンスの作成は所有者

942 :940:02/07/22 01:42
>941
そうですかやっぱりメインプロジェクトの方でも宣言しないとダメですかね。
どうもdllとlibの関係がわからない・・・

943 :デフォルトの名無しさん:02/07/22 01:44
>>942
だめというか、そのクラスを使うところで
使いたい対象を知らなかったら使えないでしょ?


944 :940:02/07/22 02:47
なるほどそういわれてみればそうですね。
VisualC使ってるのですが
別プロジェクトで平行してdllを作っているので
#include "../dllProj/***.h"
このようにして常に最新のdllヘッダをincludeするようにしました
これであとはlibとdllをdllProjの方から呼び出せればいいのですが・・
設定のところでincludeファイルにdllProjを含めてもうまくいかない・・・

945 :デフォルトの名無しさん:02/07/22 03:12
boost のshared_ptrって普通に参照回数を数えているのとは違うらしい
んだけど、それは普通に参照回数を数えるのに比べて何がどう違って
いて、どうメリットがあるんでしょうか?
ドキュメント見たけど書いていないっぽいのでどなたか教えて頂けないでしょうか。

946 :940:02/07/22 04:22
すみませんもう一つだけ質問させてください。

メインプロジェクトで
myclass *test;
init(test);
としてdllの方のinit関数で
test = new myclass
などすることは可能なのでしょうか?
どうもここがうまくいきません。

947 :940:02/07/22 04:55
つまりdllの方で
動的にメモリ領域を確保してメインプロジェクトで使うことは可能かどうかということです
ちなみに
warning C4700: 値が割り当てられていないローカルな変数 'test' に対して参照が行われました。
という警告がでてはしまうのですが・・・・

948 :デフォルトの名無しさん:02/07/22 07:10
>>940
メインで確保したメモリはメインで開放、
DLLで確保したメモリはDLLで開放する。
Windowsの力を借りれば、どっちで開放してもいいようにもできる。

その前に引数とはどういうものかを知れ。

949 :デフォルトの名無しさん:02/07/22 08:21
>>945
use_count_ と weak_count_ を分けているので weak_ptr<> が作れるぞ、
ってゆーか、別に普通に数えているのと大差ないと思うけど。

950 :デフォルトの名無しさん:02/07/22 09:35
つか、
myclass *test;
dll_init( &test );
  @dll
*test = new myclass
ダロ。ポインタわかってるか?

951 :945:02/07/22 10:53
>>949
ほほぅ、そうなんですか。それってパフォーマンス下がるんですかねぇ、やっぱり。
サイズ大きくなりそうだし・・・

952 :デフォルトの名無しさん:02/07/22 12:05
srand((unsigned)time(NULL));

この、unsigned っていうのはなんでしょうか?
C or C++自体初心者なので、頭についているのも理解できません。

953 :デフォルトの名無しさん:02/07/22 13:12
>>951
局所的な、パフォーマンスが要求されるポインタには、scoped_ptrを使えって。
shared_ptrは、たとえばSingletonだったり、木構造だったり、
複数の参照元を管理するためにつかうもんだろ。

954 :デフォルトの名無しさん:02/07/22 15:13
今、VC6.0で音声認識を行うランチャーを作っています。
Microsoft Speech SDK5.1をダウンして、付属の音声認識サンプルプログラムcoffees0
をコンパイルしようとするとcofgram.hが見つからずエラーが出てしまいます。
ハードディスク内を全検索かけても、googleで検索かけても何も見つかりませんでした。
confgram.hはどーすれば手に入りますか?よろしくお願いします。


955 :名無しさん@カラアゲうまうま:02/07/22 16:34
>>954
まるち は しね

956 :デフォルトの名無しさん:02/07/22 20:28
新スレいりますか?

957 :デフォルトの名無しさん:02/07/22 20:37
いらないっつーに

958 :デフォルトの名無しさん:02/07/22 23:22
保守あげ

959 :デフォルトの名無しさん:02/07/22 23:30
勃てますた。ヨロスク。
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/

960 :945=951:02/07/22 23:55
>>953
いやぁ、vector に突っ込む時とかの事を考えてのつもりです。
scoped_ptr は使えないっすよね。で、shared_ptr を増産すると
普通の counted_ptr(とでも言うのかな?)と比べて weak_count_
の分よろしくないかなぁと思っただけでして・・・

961 :旧スレなのでsageで:02/07/23 00:35
>>960
カウントが2種類あるからと言って sizeof( shared_ptr<T> ) は増えたりはせんから、
同じオブジェクトを指す shared_ptr の増産なら問題は皆無だぞ、念のため。

1オブジェクトにつき4Byte程度…のメモリ消費が気になるなら
独自のカウンタを書いて intrusive_ptr<> を使うべきかと。

962 :デフォルトの名無しさん:02/07/23 00:39
2つのカウンタをインクリメント・デクリメントするコストが無駄だというんじゃないの?

963 :945=951=960:02/07/23 01:18
>>961
サイズの問題を考えるとすれば、そうです。つまり、
counted_base::use_count_ と counted_base::weak_count_
の二つを持つ shared_ptr は、フツーに count数を数えるようなの
と比べて weak_count_ の分大きくなるなぁという風に思っただけです。
あんまり weak_count のメリットを僕が分かってないせいもありますが、
「そんなのイラナイから余計なサイズ食わないで欲しいなぁ」
ってのが一つ。
それと、>>962 の言うように、「余計なカウントしなくていいのになぁ」
というのも一つ。

まぁぶっちゃけ「参照回数のみを数える余計な事はしない軽いsmart_ptrも欲
しいなぁ」とちょっと思ったっていうその程度です。なんかお騒がせしちゃっ
たみたいでスマソ

ちなみに intrusive_ptr なる物は始めて知りました。確かにありますねぇ。
ちょっと見てみます。

964 :デフォルトの名無しさん:02/07/23 19:09
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

965 :デフォルトの名無しさん:02/07/23 20:11


















966 :デフォルトの名無しさん:02/07/24 15:37









967 :デフォルトの名無しさん:02/07/24 15:37





968 :デフォルトの名無しさん:02/07/24 15:37


















969 :デフォルトの名無しさん:02/07/24 15:38
埋め立て

970 :デフォルトの名無しさん:02/07/24 15:38
埋め立て!!

971 :デフォルトの名無しさん:02/07/24 15:38
埋め立て!!
埋め立て!!

972 :デフォルトの名無しさん:02/07/24 15:39
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50





973 :デフォルトの名無しさん:02/07/24 16:06
埋め立て

974 :デフォルトの名無しさん:02/07/24 16:06
埋立て

975 :デフォルトの名無しさん:02/07/24 16:07
埋立

976 :デフォルトの名無しさん:02/07/24 16:07
埋め立て

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

977 :デフォルトの名無しさん:02/07/24 16:08
埋立て

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

978 :デフォルトの名無しさん:02/07/24 16:08
埋立

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

979 :デフォルトの名無しさん:02/07/24 16:09
埋め立て
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

980 :デフォルトの名無しさん:02/07/24 16:10
埋立て
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

981 :デフォルトの名無しさん:02/07/24 16:10
埋立
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

982 :デフォルトの名無しさん:02/07/24 16:29
埋め立て


C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

983 :デフォルトの名無しさん:02/07/24 16:29
埋立


C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

984 :デフォルトの名無しさん:02/07/24 16:29
埋立て


C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

985 :デフォルトの名無しさん:02/07/24 16:34
埋立

986 :デフォルトの名無しさん:02/07/24 16:34





987 :デフォルトの名無しさん:02/07/24 16:35




988 :デフォルトの名無しさん:02/07/24 16:35



989 :デフォルトの名無しさん:02/07/24 16:35







990 :デフォルトの名無しさん:02/07/24 16:38
埋め立て




991 :デフォルトの名無しさん:02/07/24 16:38




992 :デフォルトの名無しさん:02/07/24 16:38
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

993 :デフォルトの名無しさん:02/07/24 16:39
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

994 :デフォルトの名無しさん:02/07/24 16:59
u
m
e
t
a
t
e

995 :デフォルトの名無しさん:02/07/24 16:59
http://pc3.2ch.net/test/read.cgi/tech/1027347982/l50

996 : ◆itdn3QI6 :02/07/24 17:01
1000!!

997 : ◆itdn3QI6 :02/07/24 17:01
1
0
0
0


998 : ◆itdn3QI6 :02/07/24 17:02
1000
GET





999 : ◆itdn3QI6 :02/07/24 17:02
999






1000 : ◆itdn3QI6 :02/07/24 17:02
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

199 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)