C++相談室 part8

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
(´∀`).。o(関連URLは>>2-5の辺り)
実数の階乗はガンマ関数ってか?
3v(^▽^)v:02/06/25 22:17
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/
乙カレー
>>2
過去ログとか書き終わるまで、まてよ
8v(^・^)v:02/06/25 22:30
v(^・^)v
9shige:02/06/25 22:32
v(^・^)v ←むかつく
v(^・^)v ←なんすかこれ
もうC++スレいらないって言っただろ
何で立てるんだよ?
>>10
俺の顔
13v(^・^)v:02/06/25 22:35
v(^・^)v delete >>11;
>>11
お前が見なけりゃいいだけ
ドイツ強いな。
fstream系のコンストラクタってなんでワイド文字バージョンが
ないのだろう。変換が面倒くさい。
destroy(>>11);
SendMessage(>>11, WM_ITTEYOSHI, 0, 0);
if (msg.sender == >>17)
 reject();
if (>>11->temminate())
>>11->deallocate();
terminate()だった。逝ってきます・・・・
void >>11::OnDeallocate()
{
 for (;;)
  new >>11;
}
void >>11::>>11()
{
 this->execute("マンキン.exe");
}
>>22
Syntax error
>>23
たしかに>>22はvoidが不要だった。コンストラクタのつもり。

オブジェクトを生成しようとすると、マンキン.exeが実行され、
HDDがあぼ〜んする。
>>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)
としてみましたが、
エラー:参照型へのポインタあるいは参照は定義できない
と言われてしまいました。やりたいのは参照型へのポインタではなく、ポインタへの参照
だと思うんですけど、どう書いたらいいのか教えてください。
void A(char*& a, char*& b)
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
と出て来ます。
これは何者なんですか?
ほんとのド素人です
>29
勘だが、その教科書の前のほうにそのファイルが定義されている
ってゆーか、他の人の方が効きたいんじゃないか>これは何者なんですか?
32助けてください:02/06/26 00:44
includeの中身を” ”でくくるっていうのはどういうことなんですか?

>32
先に近所を読む
34助けてください:02/06/26 00:47
それが教授からコピーしか貰ってないから前後が無いんですわ
その答えはK&Rに。
36デフォルトの名無しさん:02/06/26 00:48
>>27
できました!
ありがとうございます。
教授にそのことを言うか、同じ本を探すか、ですなぁ?
38助けてください:02/06/26 00:51
そうですか・・

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


compati.hについて書かれてないのならお手上げですな。
ファイル自作してエラーメッセージを見れば、あるいは内容を推測
出来るかも知れん。
stdio.hとかがあるところを読む前に、自分が作業している
ディレクトリを探すってこと。たいてい標準的なのは<>で囲み、
自分たちがつくったファイルをインクルードするときは""で
囲む
教授を小一時間、問い詰めろ。
43助けてください:02/06/26 00:56
プログラムが80行あるんで順番に書き込んでみてもらってもいいですかね?
>>28
input iteratorからcopyでは無理。素直にforループを書く。
と思う
まあ、いいんでない?
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->()は特別扱いってこと?
srandとRANDぐらい?
ぱっと見、RAND()くらいしかないような。
>54
ぽいね。なんとかなりそうじゃん
55 鬱氏
58助けてください:02/06/26 01:06
どういうことですか?
>>52
>void main(void)
ここだけでワラタ。
i=1;i<=M ってのがいいね。
#include "compati.h"
のかわりに

#include<stdlib.h>

double RAND(void)
{
return (double)rand()/RAND_MAX;
}
>助けてください
#include"compati.h"
の代わりに
#include<stdlib.h>
double RAND(void){return (double)rand()/(double)RAND_MAX ;}
とでもすればよい
6362:02/06/26 01:13
げげげ
6461:02/06/26 01:13
>62
すまん。
かぶりまくっているな。
ふたりが一致したということは、かなり正解ってことかな?
67助けてください:02/06/26 01:15
おお!エラーがなくなりました!
待ち行列か。昔実験でやったよ。
ケコーン>>61-62
70助けてください:02/06/26 01:19
ちなみに実行すると永遠に数字が出るんですがどこ直したらたらいいんですかね・・?
新たな問題発生
>70
中身についてはがんばってくれよ
>70
ここから先は宿題の範疇
74助けてください:02/06/26 01:22
ですよね(笑)
っていうかマジありがとうございました!
これで胸張ってあした免許の試験受けにいけます!
#define T_END 10000.0 /*シミュレーションを終える時刻*/

T_ENDの単位はわからないけど、いつか止まりそう。
あ、遅かったか。
77助けてください:02/06/26 01:26
まだいました
そうか、あしたがんがれ。
#define DT 0.5 /*時刻増分*/
#define T_END 10000.0 /*シミュレーションを終える時刻*/

好きにかえればいい。このままだと20000行
>78
なんかいいひとっぽい。
いやー、凄いですね。今大学3年なんですけど
どうやったらそんなにCできるようになるんですか?
>81
俺は大学4年だよ。Cをはじめたのは9年前だが。
プログラミングが好きならできるようになる。
試験があるならさっさと寝とけ

  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ ←>>81
 (_フ彡        /
りょうかいです
  .∧ ∧
  (>>53).。oO(氏にたい…)
  /   \
  ⌒|  /⌒
   ノ_ノ
>>85
イテレータがポインタを返すようになってるから、->演算子はメンバを返す
ように(通常の構造体のアロー演算子のように)オーバーロードされてる
だけの話では?
>85
自分でスマートポインタ書いてみたらわかるんじゃない?
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
>>88
多重継承が可能な言語では無理じゃないの?
>89
reinterpret_cast
>>88
しかも呼び方が違う
>>86
operator->()が返すの自体はポインタではないですか・・・
>>87
ただ単に保持しているポインタを返すだけで期待通り動くので何も新しいことは
わからなかったです・・・
dynamic_castもな。
それから、xorは予約語じゃないぞ
95デフォルトの名無しさん:02/06/26 02:13
>>89
あと
import
extends
implements
abstract
native
があります
9689:02/06/26 02:14
>xorは予約語じゃないぞ

そうだった(..;)どうも
>95
なかなかアグレッシブな人物だな。
9889:02/06/26 02:15
extensってJavaじゃないでしか?(..;)
virtual 抜けてるかも。>>89
>>90
perlは多重継承を可能にするために@ISAが配列になってると思ってたんだけど。
>>94
orとかandはいいのですか・・・
>>89
なんか、要るのがなくて、要らんのがあるね
xor予約語じゃない?
try,catch もある。
case
break
>>89はここをみたらどうだい・・・
http://www.kuzbass.ru/docs/isocpp/lex.html
operator,new,delete
inline
friend asm union
signed unsigned this
11089:02/06/26 02:27
>>105
助かりましたありがとう
ifndefが入っててifdefがないのはどうよ
つーか、プリプロセッサディレクティブもありなのか?
>89
スキャナでも作る気?
エディタの強調表示用のキーワード登録とか?
>113
それ、ありそう。
実装例があるかは知らないけど、exportキーワードはあるな。
括弧とか比較演算子とか、記号を奇妙な2文字の組み合わせで表現する方法があったけど、
なんて言うんでしたっけ?
検索キーワードが思いつかず、具体的な表記も分からないので検索のしようがないです
トライグラフって、C++でも有効なの?
有効。
119デフォルトの名無しさん:02/06/26 09:23
stringクラスを参照ではなくそのまま関数の引数に与えるのは
良くないと言われたんだけど、本当ですか?
なんでも、VC標準のSTLやSTLPortではCopy On Writeになっていないから、だそうで。
>>119
string の値渡しは、const string& で渡す場合にくらべると、
百害あって一利なしって話だと思う。

あ、一利あった。
渡した先で const_cast されて、呼び出し元のデータが壊される危険性を回避できるな。
そんな理由で効率を落とす気には、普通は、ならんと思うけど。
>>119
VCのstringはリファレンスカウントしてるよ。
GCを導入しているC++処理系はありますか?
あったら教えてください
124122:02/06/26 10:52
まねじだ・・・(´д`;)
>>122
operetor new, operator delete を自前で定義すれば、処理系に依らず GC を
使えるけど。BoehmGC とか。

(ただし最適化しすぎると、動作がおかしくなったりする)
Cの初心者です。
ポインタについて学び、使い方は分かったのですが、これを使う理由が
つかめません。どういった場面で必要になるのか、どなたか教えて下さい。
>>126
文字列の操作、リストの実装、グラフの実装など。
ほとんどの場面で有効。
128126:02/06/26 17:07
>>127
即レスthxです。参考にになりました(ノ´Д`)ノ
>>89
誰もasmキーワードに触れなかったのは何故だろう(w
>>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();

これでどうよ? 俺もまだ実験してないけど、これで
なにかが分かってくるんじゃないか?
あとで実験報告もするべさ!
trieコンテナのあるライブラリって無いですか?
指定したノード以下の要素すべて列挙できる物が欲しいのですが。
純然たる木構造だったら、自分で書いてもたいして手間にならないんじゃない?
135132: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(問題は……これってプロ言を読んだら書いてありそうだなってことだ……)
>>135
そんな興奮せんでも仕様に書いてあるがな。
An expression x->m is interpreted as (x.operator->())->m for a class object…
137132:02/06/26 23:58
>>136
やっぱりかいっ!

(´-`).。oO(やっぱプロ言は買っとかんとあかんかね……)
13853:02/06/27 00:03
operator->()を呼び出した場合はさらにそのあとに -> があるかのようにあつかわれるのか?
というのが結局>>53の意図するところであったわけで・・・
漏れは「そうだよ」と言ってほしかっただけちゃうんかと・・・
ありがとう>>135・・・
ARMには>>136のように書いてあったようだね・・・
endif に誰も突っ込まないのは何故だろう・・・
もしかしてホントにそうなの?
14053:02/06/27 00:14
>>137
THE C++ PROGRAMMING LANGUAGE(=プロ言?)にあったのが
> p->m = 7; // (p.operator->())->m = 7
です・・・
> THE C++ PROGRAMMING LANGUAGE
これ本当にフルネームで言うのが大変。何かいい呼び名つけようか。
(´-`).。oO(鬱病なのって俺だけかな・・・)
C++3rd
(´-`).。oO(俺の他にも鬱病がいたんだな・・・)
表紙の特徴から・・・Dragon Book、ラクダ本、Red Book
著者から・・・K&R、GoF、Petzold

う〜ん、表紙は各国で違ってるし特徴ないし、著者の名前も呼びにくいし・・・
>>145
表紙の特徴から・・・東映
147146:02/06/27 00:58
スマソ・・・
いいかも。波しぶき具合が東映ぽくて。
びあるね本
決定!
昔のUNIXは3edとかいう名前がついてたと思った。
だからC++3edで十分。つーか既に古い。
MinGWがgcc3.1になった━━━━━━(゚∀゚)━━━━━━ !!
Dev-C++
http://www.bloodshed.net/dev/devcpp.html
>>151
gcc 3.x 系列、そろそろ安定した? 3.0.x の頃は、ちまちまとしたバグが出てた
みたいだけど。

(そろそろ乗り換え時か)
>>152
かなりいいみたいだよ。もっともDev-C++はまだβ版だけどね。
MinGWは実行ファイルのサイズが小さくて幸せ。
>MinGWは実行ファイルのサイズが小さくて幸せ。
ンなこたぁない
>>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ファイル)をネット上で実行ってできるのでしょうか?
ダウンロードして、実行というものはみたことあるのですが
クリックして、ネット上で実行するものをみたことありません。

どうなのでしょうか
文字列配列をnewで確保する方法ってこれであってますか?
char** all_line = new char*[n];
for(int i=0;i<n;i++)
all_line[i] = new char[100];
なぜvector<string>を使わない?
>>159
ごめんまだ入門者だから勉強してないんだ
>>157
「ネット上で実行」の定義を述べて下さい。
>>161
多分だけど、CGIプログラムのことじゃないかな?
>>158
いいけど100文字が分かっているなら
char (*p)[100] = new char[n][100] ;
のほうがいいと思う
>>163
ありがとうございました。
>161

Terrariumとか「ネットで実行」にぴったしダネ
みなさん自前のallocaterとか書いてますよね
俺も頑張ろう...
書いてないヨ
>>166
allocator・・・・・・
169166:02/06/28 10:42
うわーん孤立しちゃったよ〜
170デフォルトの名無しさん:02/06/28 17:16
Windowsでのエラー出力をストリームでやりたいのですが、
(最終的にはOutputDebugString()で出力する)
これって、ガリガリ書くしか方法は無いのでしょうか?

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

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

trace << "エラー 変数=" << tmp << endl;
みたいに出来ないでしょうか...
>>170
http://www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
ふぉらよ。あとは自力でなんとかしな。(勝手に引用失礼)

>>166
漏れもやってるよ。気にすんな。
でもインターフェースが気に入らずに結局vectorも自作したがな。
オラ不毛って言えよ!
172170:02/06/28 17:31
↑そういうの待ってました!!

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

スタチックだから
178176: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は関数の中などで軽く定数を持たせたいときに使う事でよいですか?
>>180
Effective C++を買って読もう。君の質問の回答はそこにある。
ついで、将来君が疑問に思うであろう問題の回答の3割ぐらいはそこにあるはずだ。
182180:02/06/28 21:45
>>181
どうもです。
財布に厳しい本ですが探してきます。
183デフォルトの名無しさん:02/06/28 21:47
C++はプリプロセッサを使わないように改良されている・・・
by effective C++
184180:02/06/28 21:54
Effective C++
思ったより値段の安い書籍でしたね。
1万円ほどすると勘違いしてました。

>>183
ナルホドどうもです。
便乗質問、EffectiveC++は図書館から借りてきて、暗記するほど
読み込んだのですが、Moreの方の評価はどんなもんでしょうか?

どちらかを購入したいのですが、間違いなく良書なれど既読の前者か、
立ち読みした感じ、ちょっと重箱の隅っぽい気がした未読の後者か…。
3800円を出せぬ貧乏人に、せめて知識をお与え下されば幸いです。
>>185
Effective C++, More Effective C++, Effective STL 三部作は、食費を削っても
買うべき。
STLもあったのか。買わねば・・・
188185:02/06/29 00:18
>>186
スマートポインタや例外処理の解説くらいならとりあえずいいかな
…と思って他のですが、前作に劣らぬ良書なんですねぇ。レスサンクスです。

食費\400/dayか………………(;´Д`)つI アト380ニチ…
Exceptional C++も死んでも買いなさい
Modern C++ Designもよろしく。
C++で書かれたデザインパターンの良本はありませんか?
>>191
俺の脳内で自動翻訳済みの物がある
>>191
GoF のデザパタ本で良いと思うが。後は 190 も挙げてるけど Modern C++ Desgin
が template 使ってデザパタしてる。
191
_φ(。。_) GoFは著者名でしたっけ。ミョウニチ本屋へ足を運んでみます。
ありがとうです。
>>186 >>189-190
+ C++sardで6冊か(w
洋書以外だと憂鬱本ぐらいか?(w
>>195
Inside the C++ Object Model も入れとく。コンパイラの内部動作について理解を
深めるのに最適。STL 使うなら Generic Programming - STL による汎用プログ
ラミングも必読。あとは C++ only の本ではないが Linkers & Loaders も読んで
おいて損はない。

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

(とりあえず、こんなもんじゃない?)
憂鬱本って何ですか?
>>198
『憂鬱なプログラマのための オブジェクト指向開発講座』
C++というよりはオブジェクト指向についての本だが。
わりと具体的に話を勧めていくので分かりやすい。

//しかし、必読書のレベルですらいくらかかるんだ?
C++コンパイラのインストーラには、
これらの本を理解しているかのテストをするセクションが欲しいね。
クリアしないと絶対にインストールできないの。
201198:02/06/29 04:45
>>199
ありがとうございます。
>>200
実際にやってみながら学ぶことができない罠。
>>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』って、洋書?
>>203
『Generic Programming ―』は、体系的・抽象的に書かれているので、
ある程度 STL が分かってから読むべき本のように思う。でも、読んでおくと
視野が広がるし、思考の経済というか、他方面への応用も利くと思う。

『Inside the C++ Object Model』は、以前トッパンから訳書が出ていたんだが、
同社の出版事業撤退により絶版状態のようだ。C++ を究めたいという酔狂もの
には必読。
205203:02/06/29 12:05
さんきゅ。憂鬱本とあわせて、その2冊も探してみるよ。
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をもう一度使ってるからじゃないの?
そゆ問題では無いと思う。
テンプレート引数に依存した不明な型Bakaを引数にとった関数は
その特殊化よりも不明な引数の一致を優先して判断されているように
見受けられる。バグかな・・。
>>208
とりあえず gcc 2.95.3 でも Borland C++ Compiler 5.5.1 でもコンパイルエラー
になることは確認したけど。
配置構文(゚∀゚)デキタ!
>>209
するとC++として不正だって事?
なにがダメなんだろ・・・。
もしかして、
typedef typename T::Baka Baka;
じゃない?
>>212
だめですた・・
214デフォルトの名無しさん:02/06/30 20:54
教えてください。
Cを一通りできるとして
C++を業務レベルまでマスターするには
どれくらいかかるんですか?
STL3年デザパタ5年
>>206
 typedef T::Baka Baka;
の意味を考えたらよくわかるはず.
当然,class T ではすでに T::Baka が typedef されている必要がある訳で.
あとは >>212 のいうとおり,
 typedef typename T::Baka Baka;
は必須の気が.
>>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(); }
};
>>217
だ か ら
具体的にどんなインスタンス作ってるか教えれ
答えるのはそれからだ
>>218
宣言しただけ。
インスタンスは作らない状態でエラーが出ます。
>>219
VC6 だと何事もなく通るけど。
>>220
・・本当だ。
つまりVC7のヴァグってことでOK?
ゲイツ氏ね
・ここではどういう意味で「インスタンスを作る」という句を使っているのか?
・TにBakaを持っていないクラスを渡しているんじゃないか?
・VC6で通って、VC7で通らないことってあるの?
>>220
今試せないけどソースは上に上げたあれのみです。
typedef Aho<ほにゃらら>
もしてないし、ましてインスタンスの作成もしてないです。
224デフォルトの名無しさん:02/07/01 18:17
お取り込み中申し訳ないのですが、新しく質問しても良いでしょうか?

基本クラスのポインタに派生クラスのオブジェクトをもたせている場合、
基本クラスのポインタをdeleteしただけでは派生クラスのデストラクタは
呼んでくれないのでしょうか?今書いているソースでそうなっていて
メモリリークを起こして困っているのですが・・・。
>>224
基底クラスのデストラクタを virtual にする必要があります。
>>225
あ、一応やってみています。当然ながらクラスと同名なので、デストラクタの
名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
やってみても呼んでくれてないようなんですが・・・
>>226
> 名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
もちろん。っつか、大抵の実装では名前なんか見てなくて vptr->vtbl に書き
込まれたポインタを参照するだけだし。

ダメだというそのプログラム、簡略化してテスト用のコードを張ってくれ。
>>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/
g++のios::begがあった〜(疲労)
パパこれを探すのに5000ファイルくらい調べちゃったよ
素直にgrep汁
>>227
単なる手前のボケでした。平身低頭、申し訳ありません。
一応顛末を書いておくと、基底クラスや派生クラスが親子構造で混在するような
システムを作っていて、deleteする時はデストラクタで子供を次々deleteしていく
ようにして、一変に消せるようにしていたのですが、条件判定に変なものを使って
失敗していたようです。お騒がせしました。

直したら立派に呼んでくれて安心しました。
>>231
locate ios_base で一発じゃないのか?
235234:02/07/01 21:12
まちがえた…
locate '*/ios'
とでもしてくれ。
236デフォルトの名無しさん:02/07/01 22:37
>>230
どうもです。しかし・・・英語がむずい・・・;
なんか無理そうだ・・・とりあえず落としてみます。
237229:02/07/01 22:38
すいません、236は僕です。あと下げ忘れました。スマソ!!
libjpegなら日本語解説も沢山ある
239 :02/07/02 00:03
クラスのメンバ関数の引数の配列の数に変数を使いたいのですが
できますか?
むりなら代わりとなる方法を教えてください
配列の数って要素数?
>>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 を変数にしたいってことなのかな。飛躍し過ぎ?
>>239
vector
>>241>>239 微妙にスレ違い
void A::foo(vector<int> ints)
{
for (vector<int>::iterator i = ints.begin(); i != ints.end(); ++i) {
hanatanhalahala(i);
}
}
template<size_t N> void f(int arr[N]);

char a[256];
f(a);
>>245
動的なサイズ変更に対応できないのでアウト
247デフォルトの名無しさん:02/07/02 01:07
引数だと一次元目の[]の中身って意味なさないような。
ようは、239の質問が微妙ということでいいですか?
>>246
配列は動的ではない
250デフォルトの名無しさん:02/07/02 01:16
>>248 いいです
>>244
スレ違いを指摘するんなら、もっとスレ違いらしさを出したコードにしとけよ。
void A::foo(vector<int>& ints)
{
  for_each(ints.begin(),ints.end(),hanatanhalahala);
}
正直、>>239の態度にむかついた。
超イイ!!
>>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) ; }
テンプレート引数をそこまで自動で判断してくれるんだから、
次期C++には型推論が導入されたりしてな。
型推論・・・凄い時代になったものだ
まあ技術は進歩し続けているわけだけど。
おお、すげえ。
これ以上コムパイラが対応しきれるかどうか・・・。
おおーできたー。
ポインタに対応できないから実用上無意味だけども
情けないことにどういう理屈なのかわからない。
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++)
なんで?
template版よりも、通常のfの方が呼び出しのマッチングに関して優先順位が
高いからじゃないの?
>>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
面白いな、コレを多次元配列でやるとどうなるんだろう
267263: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;
}

・・・こっちにしてもだめですた。
実行確認せずにこれの結果って予想できるもん?
や、決まってるんだろうけどさ。
Modern C++ Design買ったんだけど、俺の乏しい理解力では到底内容が
わからなかったので、もう少し易しいtemplateテクニックを満載した本を
誰か出版して欲しい。
>>268
そーゆー路線だと、結城さんあたりかねぇ。
どうもchar x[] = "array?";のxが参照としてはchar[]だけども
式の評価ではchar*になってこちらが優先されるようだ。
ためしにf(&x)とすれば配列バージョンが呼ばれる
>>269
C Magazineに寄稿している人だよね?ホームページを見てみたんだが、
C++関連の内容はまだうpしてないようだ。
>>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ってあまり
使われてないような、
>>273
プログラム側に何を期待するかによる。

スタンドアロンの VB 出すまでもなく Access VBA や Web がらみだと VBScript で
間に合うことも多いし、逆に VC でなければやっとれん、という事もある。
275274:02/07/02 04:10
ただし、JAVAはつねにやっとれん。
>>273
うちの会社の基幹業務はAccessのVBAでやっとるよ。
最初のうちはスイスイ動いていたが、最近データの量が肥大して、
検索にだんだんと時間がかかるようになってきた。この先不安。
277247:02/07/02 04:23
>>275
騙られた……。

確かに JDBC 1.0 の頃はかなり「やっとれん」感が強かったが、最近は
触ってないので知りません。
278278:02/07/02 07:56
アルファベットが1文字以上連続しているものを単語と
  呼ぶことにする。コマンドライン指定されたC++のソース
  ファイルを読み込みながら、単語ごとにその出現回数を
  カウントしておく。すべての単語が読み込み終わったら、
  まずアルファベット順に単語とその出現回数を表示し、
  その後、出現回数の多い順に単語を表示するようなプロ
  グラムを作成せよ。
   ただし、単語にはアルファベットの大文字や小文字が
  混じっていてもよいものとし、その場合大文字小文字の
  区別なく、アルファベット順になるようにせよ。
   また、ソートする部分については、この問題に合うソ
  ート用の関数を独立させて作ること。ソートの方法は何
  でもよいものとする。
-----<
わかります?
>>278
宿題スレ逝け
>>278
わかります。
C++スレなんかで聞いたら10人中11人ぐらいソートせずに終わらせると思うが(藁
map使わない方が面倒だな。
283デフォルトの名無しさん:02/07/02 10:20
おいお前等。
スタンダードアイオーでもイオストリームでもいいんだが、リファレンスっちゅうのはどこにあるんですか?
禿しく>>281の言う通り。

オレモマダマダダダシノウ...(-_-)
>>283
FILE*&
std::iostream&
286よっし〜:02/07/02 10:29
C++の派生クラスの実装を、C言語だけで記述する事は可能でしょうか?

3DSMAXのプラグインSDKの仕様が、コンパイラのバージョンを指定しているけど、
そのバージョンを持っていないので、C言語でクラスのレイアウトに何とか整合してやって、
リンク可能な状態に持っていけないかなぁって・・・
コンストラクタとデストラクタがなくていいなら何とか。
288よっし〜:02/07/02 10:50
> コンストラクタとデストラクタ
えっ? コンストラクタとデストラクタ駄目ですか?
基底クラスのデストラクタがvirtual宣言されてマス。
基底クラスの物は呼ばれるけど、
派生(自作)クラスのデストラクタは呼ばれない。
それから、思いっきり実装依存になるよ。
CでCOMクラスを実装するのと同じ方法でやる。
ああわかってる
・・・・
わかってるってば!
  人
(...・.・.) ?
C言語で仮想関数?(((( ;゚Д゚))))ガクガクブルブル
  人
(...・.・.) ?
>>286
バージョン指定があるってことは、クラス名の mangling があってないと
ダメってことではないの?
295よっし〜:02/07/02 12:03
> それから、思いっきり実装依存になるよ。
それは致し方無い事です。そもそも「3DSMAXのプラグイン」という事自体が実装依存なので。

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

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

ふむー。そもそもVCって、CとC++を区別しちゃってて、CからC++のクラスにアクセスするのって無理なのかなぁ?
296 :02/07/02 16:21
Modern C++ Designの表紙に載ってるようなナイフがホスィ。
Modern C++ Designを持っていないやしはC++プログラマにあらず
     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。で、
デバッガでは→の部分に印がつきます。
どこが悪いのでしょうか。
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プログラム作りたいのですが、
まったくわかりません。誰か作っていただけませんか?
んで、その二次元配列には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のコンストラクタを省略してて
コンストラクタでの処理がおかしいと予想。
実は16bitのDOSアプリ、とかいう罠、はナイよな……
……
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;
}
となっています。
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);
}

どこで落ちるんだ?
>312
今いろいろやっていて気づきました。
a.resize(10)
だったら大丈夫なのですが
a.resize(100)だと落ちます。
メモリは192MB積んでいるのでメモリが足りないはずはないのですが・・・
タスクマネージャで調べても利用可能領域は40000KBありました。
314デフォルトの名無しさん:02/07/02 20:26
sageてしまいますた
サイズが大きすぎ(2G以上とか)でnewがNULLを返してる?
sizeof(A)とxとyは幾つなんだろう
317デフォルトの名無しさん:02/07/02 20:33
int dd=sizeof(A);
3でした。
うむ。VCのnewは例外を投げないので、返値がNULLかどうかチェック
した方がよい。
>>299(のp;を修正したもの)でも、落ちる要素は全くない
aという変数が別ファイルなりで別の型として宣言されてたりしないかな
或いはメンバ変数と仮引数とグローバル(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
・メンバを非公開にできる。
・メンバ関数を持てる。
・継承が使える。
・仮想関数を使ってポリモーフィズムが実現できる。

などなど。
まずは使うべし。使って体感しる!
327324:02/07/02 21:32
だめぽ。
なんか構造体と違いがあまりわかりませぬ(´・ω・`)
手始めに憂鬱本を読んでみよう>>324
>>327
>>326サソも言っておられるが、こればかりは口で説明してもなかなか
わかってもらえますまい。

簡単なクラスとそれを使ったサンプルをいくつか作ってみれば自然に
理解できるよ。
330324:02/07/02 21:39
ん〜
今の仕事で、作ってます。
クラスだけえんえんと…
実際業務でクラスなんか作っても
使う部分の作業に当たらせてもらえません。
そこで、こんな仕様のプログラムでここを
クラスにするとクラスのありがたみがわかる!!
なんて、仕様書どなたかもっていませんか?
皆様レスアリガトウございます
stlを使えばありがたみが分かる
がんがれ
>>330
すごく「例えば」の話になるけど、リスト構造を扱う時、ポインタの付け替えを
すべてメンバ関数に任せればよいようになる。

あまりキチキチに非公開にしてしまうと効率が落ちることがあるが、バグは
どんどん出にくくなる。
>>321
関係ないかもしれないがMapDataにコピーコンストラクタを自分で作っても同じ?
vectorはresizeとかのときコピーコンストラクタよんでるとおもうけど。
335324:02/07/02 22:33
なるふぉど…
確かにクラスの中だったらメモリは消えないですからね。
ポインタを頭に入れてみると確かに便利かもしれませんね。。。
>>335
んー、そうですね、クラスの中だからメモリが消えないというより、
リスト構造の細かいちまちまとした部分まで見ずに済むようになり、
プログラムの設計に専念できるようになると言ったらいいかな?

その代わり今までみたいに構造体のポインタを持って関数を
コールして操作するということはしなくなる(やろうと思えばいくら
でもできるが敢えてしない)ので、カナーリ感覚が違うんですよ。
std::stringや、CStringなどの文字列クラスを使ってみれ。
連結や比較なんかは演算子で出来るし、バッファのことは何も考えなくても
よきにはからってくれる。
>>321
Width と Height に値を、resize に渡す前に確認してみたらどうか?
#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() と書いてあるものがありますが
これはどういう効果があるのですか?
この関数が呼ばれた瞬間に例外をスローするのですか?
>>340
逆です。この関数は例外を投げないという意味です。
>>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の命令ってなんかある?
>344
関数を呼ぶだけじゃないの?
346344:02/07/03 10:34
>>345
関数呼びたくないの。
その関数内でしか持ってない、必要な変数多いし。
347デフォルトの名無しさん:02/07/03 10:37
>346
DQNですか?
必要な処理をマクロ化するとか?(実質上コピペと変わらんが)
349344:02/07/03 10:43
んー、やっぱ普通の方法無いのね。

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

>>347
秒間何万回も使うからオーバーヘッドが
大きいってのもあるんよ。
>>342
catch(std::bad_alloc&)で捕まえてみて。
>>349
インラインアセンブラで入り口と出口を作って、その間にサブルーチンを書く。
>>349
必要な変数はクラスにまとめておいて、
引数を少なくしたメソッド呼び出しにするのがC++流。

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

あともう一つだけ。
デバッグウィンドウに数字を表示したい時ってどうしてるの?
混じれ酢してみるか。
関数呼び出しはVBのGoSubより何倍も早いから気にするな。
どうしても気になるならインライン関数にするなりご自由に。

>秒間何万回も使うからオーバーヘッドが大きいってのもあるんよ。
なんかムカつく言い方だな。
そんなに速度が気になるんじゃアセンブラで最適化しろ
デバッグウインドウってなんだよ
C++にそんなもんねーぞ
356デフォルトの名無しさん:02/07/03 12:10
>>344
BCB厨のDQNに認定
357356:02/07/03 12:12
補足
BCB厨だからDQNなんじゃないぞ、
そんなことDQNだと言うんだ
なしてBCB?
>>347
でしょう。

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

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

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

>>349
場合によっては inline 関数が使えるかもな。ただし、ゲーム作ろうとしてる
ならムダだぞ。
> 出てきた方法に対して煽りを返すのは

これどこ?
361デフォルトの名無しさん:02/07/03 12:32
>350
またハンドルされていない例外になってしまいました。
ためしにvector < vector<double> > data2;
data2.resize(100)でやってみても、やはり同じように落ちました。
>>360
349
>>360
>>346
煽り返してるとまでは思わないが
364デフォルトの名無しさん:02/07/03 12:42
>350
いま、Releaseでビルドすると落ちませんでした。Debugだと落ちます。なぜでしょう?
>>354
一応、俺も馬路レス。
関数呼び出し自体より、変数を引き渡す方を考慮しているものと思われ
10個とか引数あったらさすがに差が出る。
関数内の多数のローカル変数をサブルーチンでも使いたい。
サブルーチンは呼ばれる回数が多いので変数を一個一個渡すのはイヤ。

と彼は質問すればよかったのかな?
こういう場合はやっぱ>>352か強引に>>351のようにするのかな。
>>364
下のソースで落ちる?

#include <vector>
#include <iostream>

main()
{
 std::vector< std::vector<double> > data;
 data.resize(100);
}
iostreamは余計だ。
構造体をポインタで渡すのは駄目?
>>369
むしろ推奨。
多数のローカル変数ってのにいちいち
構造体名が付くのがうざいけど仕方ないか。
372344:02/07/03 13:08
いや、煽るつもりはなかったんだけど、
gotoがあるならgosubもあるかな、と思ってたから。

なんか荒らしたみたいでスマソ。
>>369
ダメ。const参照で渡せ
374デフォルトの名無しさん:02/07/03 13:12
>367
それだけのソースなら落ちません。
>>374
ソース全部上げられるか?
たぶん余所でメモリ壊してるんだと思う
VCでDEBUG_NEWが定義されてるとか
STLport使ってて、_STLP_DEBUGが定義されてないとか。
前にこれで関係のないところのメモリ壊されてハマった記憶あり。
378デフォルトの名無しさん:02/07/03 16:02
>377
定義してみたら落ちませんでした。これは、なぜですか?
379377:02/07/03 16:42
>>378
デバッグ版とリリース版でnew/deleteが違うから。
リリース版のnewで確保したメモリをデバッグ版deleteで削除したりするとヒープが破壊される。
>379
なるほど。おかげで助かりました。どうもありがとうございました。
>>372
別に荒らしだとは思わなかったけど、
見事に定番通りのDQNぶりが見ていて微笑ましかった。
いつか「あのときあんな恥ずかしい書き込みしちゃった…」って思えるくらいに
スキルが上がるといいね。
ヤナヤシ
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が分からないです。
どれを使うのが正しいんでしょうか?
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*として代入する時は何か特別なことやってるんですか?
たぶん、void*に入れたときに、大事な情報が死んだ。
CはIAやIBをインプリメントしているので、ちゃんとポインタで
受けられる。
>>386
void*から直接キャストした物だと
class D : public IB{};と区別が出来ないからしょうがない。
389_:02/07/04 05:45
なる。VMTのオフセットがどうたらこたらって話かな?
でも、多重継承って思ったより強力ですね。ちょっとC++見直しまひた。
(って強力すぎるから問題がでるのか・・・)
>>385
気になるならとっとけば?
なんか作ってみた、ちょとダサいけど

#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" );
}
>>3の過去ログにPart 2がなかったので探しました。
http://pc.2ch.net/tech/kako/996/996640937.html
>>392
Good Job!!
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"になることはできませんでした。

ってエラーが出るのですがなぜでしょう?
"strings"[1] = 'T';
とやるのと同じ問題では。
397 :02/07/05 05:12
え??どういうことですか?
型が違うということですか???
プログラミング言語Cに於て(C++も亦)、
「文字列リテラルの値を変更している場合、その動作は未定義」
であることが規定されてゐます。
399デフォルトの名無しさん:02/07/05 06:02
初心者な質問ですみません。
スタティックライブラリを作っているんですが、
これのヘッダとLIBファイルのみでインライン展開をさせることは出来るんでしょうか?
やっぱりソースもないと駄目ですか?
基本的に、ある関数をインライン展開するには、
.hファイルに実装を書く、ということになります。
libファイルは基本的に全く関係有りません。

答えは「これのヘッダ」が何を意味するかによりますが
その後の「ソースもないと」をみると、"駄目です"と
いうのが正解でしょう。
401デフォルトの名無しさん:02/07/05 06:27
>>400
そうですか。
わかりました、ありがとうございました。
402 :02/07/05 09:11
>>398

なるほど、、、そうでしたかよくわかりませんが調べてみます
ありがとうございました
>402
つまり
char*p="ABC";みたいなのはプログラマがいじっちゃいけない
ところに文字列"ABC"が用意されてそのアドレスがpにセットされるので
参照する分には良いの。でも書き換えるとダメなの。
書き換えたいなら変数として領域を確保する必要があるの。
つまり
char str[10]="ABC";みたいな。
あるいは
char str[10];
strcpy(str, "ABC");
とか
なぜリテラル文字列はconst指定されてないのか激しく疑問
未定義にするくらいなら禁止しちゃえばいいのに
C++ではconstだぞ
コンストラクタの初期化リストでthisポインタを使うのは悪なのでしょうか?
>>406
って言うかアクセスできないメンバあるのか?
>>407
たとえばコンストラクタで所有者のアドレスを受け取るメンバがあったとして
ClassName() : member( this ){}
とかやると怒られる
漏れもなんでなのかよく分からん・・・
class Class {
 Class *member;
public:
 Class(): member(this) {}
};
問題ないけど
410 :02/07/05 19:07
>>403
ご親切にどうもありがとうございます
つまりポインタの宣言だけでは配列を確保していないってことですね


>つまりポインタの宣言だけでは配列を確保していない

違う。「リテラル」ってのが何なのか理解しなさい。
>>406-409
VC++では出るけど、この警告はM$の言語拡張らしい?
言語拡張をオフにすると出なくなる(この警告の警告レベルが下がる)

thisの中身が初期化されてないからとりあえず警告出しとくよって感じかと
thisの値(アドレス)自体は別段問題無いと思われ
>411
言葉のあやじゃないかな・・>配列を確保していない
char *p="ABC";
char str[]="ABC";
の差に気が付けばいいのでは?
>413
元々は>>395、つまり文字列リテラルを書き換えようとしてのエラーで、>410はその理由をわかってないってこと
415 :02/07/05 19:54
>>411
>>413
ということはリテラルだから変数として確保してないから書き込めない
ってことですね?
416 :02/07/05 19:59
>>414
リテラルの意味さっき調べて知ったもので、、、
まあ、そういうこと。で、
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++かな?
>419
>>4
422デフォルトの名無しさん:02/07/05 20:58
C++のデベロッパーってすごいな
423デフォルトの名無しさん:02/07/05 21:24
おお、素早いレスありがとうございます。
>420 はい、VC++の6.0です。
>421 さっき一通り読んだけどやっぱりわかりません(汗
でもある程度まではテンプレートが用意されてるのを知ったのは収穫でした。
明日は半日使えるけど、ヘルプでtemplateから検索していけば辿り着けるだろうか。
424419:02/07/05 21:26
すいません、423は私です(名前変え忘れた)
VC++のみの話題は専用スレに行けっての
>423
テンプレートなんか使わなくてもできるよ。
ま、専用スレで聞いてくれ。
427419:02/07/05 21:53
あちゃ、VC++とC++が別物だって知らんかった。お邪魔しました・・・
お前ら様方は<iostream.h>,<iostream>の違いと仮想関数の目的は明確にわかっていますか?
当然
当然わかっていません
俺様ごときがわかるわけありません。
432428:02/07/05 23:45
>>429 恐れ入りますm(_ _)m
>>430 盛れと一緒に勉強しませう!
<iostream.h>なんてイラネーヨ
<iostream.h>って、中身が古いケースも、
stdで囲ってないだけで<iostream>とおんなじなケースと、
両方あるんじゃない?環境によって
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して強制終了させるぐらいにしか
使えません。これって普通ですか?
皆さんはそんなことはないですか?
>>436
スタックの巻き戻しの際にデストラクタが呼ばれるから、デストラクタ
を正しく定義しておけばリークしないんじゃない?
>>436
>ローカル変数をnewした
意味不明。
>>436
auto_ptr
440デフォルトの名無しさん:02/07/06 07:53
>>437-439
try{}スコープの中でヒープを確保した場合(LPDWORD a = new DWORDとか)です。
chach{}はスコープが違うので解放出来ません。
マニュアルにはスタックフレームを巻き戻してautoオブジェクトを破棄するとしか
書いていません。
>>436の言うようにauto_ptrを使うか、try{}スコープ外で宣言するしかないのですか?
>>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 とやる他に回避方法はありませんか?
>>441
> 例外の正しい取り扱いは、君が想像しているよりも、はるかに難しい。

オレも痛感いたしますた。
Exceptional は読んどくべきだけど、読んですぐ身になるほど易しい問題じゃないね・・・
444デフォルトの名無しさん:02/07/06 08:52
クラスの定義はヘッダに、
メンバ関数の実装はcppに書くのが普通ですか?
>>442
template<typename T>
struct S {
  typedef typename T U;
};
が正解だったと思う。使ったことないんで、記憶に自信がないけど。

>>444
1.君の言う「クラスの定義」は、正しくは「クラスの宣言」。
2.君の言う「メンバ関数の実装」は、正しくは「クラスの定義」。
用語を思いっきり間違えて使っているけど、1をヘッダに、
2をcppファイルに書くのは、普通。それはあってる。
>445
どうもです。
テンプレートに毒されて、ほとんどの実装がヘッダに逝く罠
しかも、それを当たり前とすら思う罠
俺のプロジェクトも.cppより.hの方がずっとサイズがでかいぞ(ワラ
449436:02/07/06 09:46
>>441
わかりました。そうします。
ありがとうございました。

別にどっちにあったってそんなに変らんと思うが
ヘタレ環境だとコンパイルに時間がかかったり
リンク後のサイズが大きくなったりするのかな?
>>450
何のために #include があるのか、勉強しなおせ。
c++になって.libって全く意味が無くなったよな
453442:02/07/06 10:01
>>445
parse errorになります。
typename は quialifed name (X::Yのようなの) にしか使えません。
>>448
漏れ同じくらいかも・・・・
>>452
はぁ ?
SSの定義のなかで
typedef typename S<T>::U U;
かなあ
457デフォルトの名無しさん:02/07/06 10:37
>>452
確かにね。
OBJファイルも生のバイドコードじゃなくて
中間コードみたいなのを生成するようにして、
ヘッダとLIBで、テンプレートやインライン展開が可能になればいいのに。
458442:02/07/06 10:48
>>456
ありがとうございます。
それは考えたのですが、実際のクラスでは継承が芋ヅル式に
続いています。
これでは全てのクラスに書くことになってしまうので、
避けたいのです。
>>458
取りあえずデザインパターンの本読んで目から鱗を落とすことを推奨。
>>459 関係ない話で恐縮だが、俺はあれを読んで目に鱗がついたよ
>>460
確かに、全面的に同意する気はないけどね。
でも、ああいうやり方もあるんだと。どこかでうまく使えば便利だなと。
中小クラスを継承して後からメソッドを実装するなんて当たり前のことにも名前付いてて少しワラタ。
462デフォルトの名無しさん:02/07/06 12:51
>>445
クラスの「宣言」と「定義」って、そんなに明確にわかれてましたっけ?
class T { ... };
↑これをどっちで呼ぶかって話しなんだけど。
データフィールドとか、インライン関数の「定義」をしてますよね。
中でどれだけ「定義」されていても、全体では「宣言」って呼ぶんですか?
>>462
定義 class a{}
実装 a::a(){}
宣言 a *ax = new ax;
464デフォルトの名無しさん:02/07/06 13:05
ファイルにロックをかけたいのですがどんなメソッド、関数がありますか?
flockを使うしかないのでしょうか。
>>464
WebProg板が無駄に詳しいけどね。
後はディレクトリがあるかないかとか。
466オレ的には:02/07/06 13:06
>>462
宣言 class a;
I/Fの定義 class a{}
実装の定義 a::a(){} (うまい言葉が見つからん・・・)
>>462
もともと「定義」というのは、コンパイラがそれに出会ったら、
その場でコンパイルされて何らかのオブジェクトコードが生成されるものだ。

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

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

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

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

とはいうものの、「テンプレート」となると話はややこしくなるが...。
>>467
なるほろ・・・日常的な「定義」とは意味が異なるのですね
469464:02/07/06 13:12
>>465
なるほどー。サンクスです。

ロックかけるときだけfile descriptor取得して
Cの関数使うのはちょっと気持ち悪いなーと思ったので
質問してみました。
470462:02/07/06 13:58
>>467
ってことは、
class A {};
↑これも宣言?
そんなわけないとおもうんだけどなぁ。
∧ ∧
(*゜ー゜)++
定義も宣言の一種とどこかで読んだような……
K&R では「定義」と「宣言」は明確に区別されてますね。
以下引用。

> "定義"とは変数が実際につくられ、あるいは記憶が割り当てられた
> ところを指すのに対し、"宣言"とは変数の性質は指定されているが
> 記憶割当てはされていないところを指す。
>>3 の C++ Final Draft を見る限り、
>>473 の意味で区別するのが正しいとは思えない。
K&RはCだからね、C++にも通用するとは限らない
473
C++3rd(邦訳版)のP.113にも class A{}; が定義であるように
解説されてますね。
477デフォルトの名無しさん:02/07/06 15:15
>>445,>>447 はダウト。
ということでよろしいか?
478477:02/07/06 15:16
まちがえた。
>>445,>>467 はダウト。
ということでよろしいか?
class A;  クラス宣言
class A{}; クラス定義

でいいんだよね?
class A;  クラス前方宣言
class A{}; クラス宣言&定義

じゃねーの。
>>479
クラスの場合、I/Fだけでなくその挙動まで定義して初めて完全な定義な気がするから
class A{};
は(全てインラインでない限り) 不完全な定義 とでも呼ぶべきかと
482479:02/07/06 15:22
ううむ、なるほど。
定義は宣言の一種っていうのは嘘?
484デフォルトの名無しさん:02/07/06 15:28
class A;  プロトタイプ宣言
class A{}; クラス宣言

じゃねーの。
一種って言い方はびみょーだなー

定義は宣言も兼ねる
常に成り立つわけじゃないけどさ
プロトタイプなしの関数定義がそうですね。<宣言も兼ねる
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 がないので見えなくなってメモリに
ごみとして残るのでしょうか?
プログラム終了時には消えると思うんですが
実行中はどうなるのかよくわからないんで。。
私以外の人はご存知と思いますので
教えてもらえないでしょうか?
よろしくお願いします。

>>488
覗き穴の亡くなった箱。
ロープが切れた舟。
子供が手を離した風船。
ハァハァ(;´Д`)=○)'3')←>>488
ありがとうございます。
やっぱりそうだったんですね。
胸のつかえが取れました。
一般にメモリリークという
>>442
えー、3.1 だとそんな warning が出るわけ? 俺も同じようなことを
やってるから、ちと鬱だな。明日にでも 3.0.4 から 3.1 にしようかと
思っているのに。
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です。
初心者質問ですいません。。。
>>494
なるほど。char * const って書かないとだめか。
理屈としては、テンプレートを解析した時点で、「T は const」
ってことに決まっちゃうからかな。const char * は、
const な「char *」じゃないっしょ。
T は char* なんだから、
const T は char* const になるですよ
>>495
関数テンプレートでデフォルトパラメータは使えたっけ
テンプレート宣言終了の;がない
テンプレートは型が完全に一致しないと実体化しないから
多分君のもくろみは外れている

とか
>>495
テンプレートの引数を省略できなかった,ていうことらしいんで
cout << test<char>(basic_string<char>("Hello, world!")) << endl;
とすれば,うまく動いているっぽいっすね

>>496-497
あー,どうもっす。そういう考えがスッと出て納得できるなんて,うらやますぃ・・・
今日ついに「プログラミング言語C++」買ってきたんで,これから
ワッシワシ勉強するですよ
500495:02/07/06 23:09
>>499
出来ました…でも、関数テンプレートのデフォルト引数の例が、
Stroustrup本の13.4.1に載ってるんですけど…
例が悪いみたいですね…。すいません。
501498:02/07/06 23:10
ごめんよく見てなかった&&勘違い。
問題はデフォルトパラメータは使えないこととと>>499だけだね
502495:02/07/06 23:11
例が悪いというのは上の例が悪いってことです…。
誤解を招きそうな発言をして申し訳ありません。。。
関数テンプレートのデフォルト引数が使えるのか…
VCは謎が多いな
504デフォルトの名無しさん:02/07/06 23:17
>>498
わかるよ。
cont char *とchar const *は同じ意味なのですか?
>>505
違う。constは直後の要素に掛かる。
507495:02/07/06 23:19
>>503
あ、あと、BCCでもデフォルト引数が使えないみたいです。。。
一次クラステンプレートのみに使用できますとか言われて…
弱った。。。手持ちのコンパイラじゃ出来ないのか。。。(汗)
>>505
関数の仮引数では同じだったはず
他は違う
>>506
サンクス
>>507
ん?
出来ないのが標準仕様(ISO)だけども何が問題?
const char* と char const* は一緒じゃないの?
だから違うというとるに
513495:02/07/06 23:25
>>510
そうなんですか?
Stroustrup本のは…間違いなんですか?
> 出来ないのが標準仕様(ISO)

ダセエな。
>>495 & その他
関数テンプレートでもデフォルト引数は使える。
495 がダメなのは、2番目のテンプレート引数 C は関数引数から推測できるのに
1番目の引数 T の指定がないからじゃないのか。だから 499 が正解だと思う。
普通の関数のデフォルト引数だって、1番目はデフォルトにして2番目の引数だけ
指定するなんてことはできないだろう。
>>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();
}
まったまった、今酔ってて怪しいが、これはさすがに同じだろ
const char * str
char const * str

この辺と混同してないか?
char * str const
const char * const str
518495:02/07/06 23:29
>>515
ふむ…。
では、引数から推測できないようにすると出来るのでしょうか?
ちょっと試してみます。
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;
}
520517:02/07/06 23:30
わり、3番目の例はこう書きたかった
×char * str const
○char * const str
521499:02/07/06 23:35
早速 Stroustrap 本読んでます (´ー`)
p.133 に書いてたんですが,"const *" は存在しないから基本形の一部と
見なされるらしくて,つまり "char const *" は "const char *" と
同等だということでした

# だんだん const の使い方が分かってきたかも
522515:02/07/06 23:35
スマソ。いま ISO の規格書確認したら、
A default template-argument shall not be specified
in a function template declaration or a function template definition
って書いてあった。
>>515
>関数テンプレートでもデフォルト引数は使える。
ここでの問題はデフォルトテンプレート引数だぞ
これは使えないだろ
>規格書確認したら

持ってんのかよ!Σ(゚□゚=)
イイナァ
525523:02/07/06 23:40
ごめん。読んでたら遅れた
526japh ◆J.5V8ta6 :02/07/06 23:41
「*を挟んでconstが右にあるか、左にあるかで見分けろ」
というようなことを何かで読んだよ。
(プログラミング言語C++だったかな…或いはEffective C++だったかもしれない)
527515:02/07/06 23:44
>>524
たしか、20ドルくらいで買った。まあ、ふだんは
http://www.kuzbass.ru/docs/isocpp/
を見に行ってるけどね (w

>>525
いや、うっかり C++3rd を信じちまったおれが悪かった。
528495: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();
}
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;
}
530495:02/07/06 23:50
すいません。
ぐえ…。Stroustrup本が標準だとばかり思っていました…。
今度から>>527を見に言ってから発言するようにしたいと思います。

色々ありがとうございましたm(_ _)m
>>527
ありがとう!
手元になぜか refman.pdf という 2,860,601バイトの規格書があるが、
なぜだろう?いつの間に?
検索してみたらcpp3rd.zipなんてのも出てくるな
某所で出てから、一気に普及したんじゃないかな>refman
ここのは無茶苦茶鯖が重いけど、今でも落とせるね。

http://mxlab.com:8080/ftp/docs/c++/?s
527 のリンク先は、draft だからさらしてても OK なのか?
それともやっぱり違法?
>>527のヂレクトリをいっこ登ると・・・(゚ε゚)キニシナイ!!
constに関しては、>>526が正解。参考文献は、Effective C++ の21項。
あと、Exceptional C++ の43項も読んだら、constの正しい使い方が理解できるよ。
うほほ
激重(汗 ようやく落ちた
const char* str なんつーダサい書き方は速く卒業してホスィ・・・
常に char* const str なら何も迷うこと無いでしょ
char const* の間違い?
>>542
あ、サンクス
>何も迷うこと無いでしょ

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

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

実際問題、ポインタ自体をconstにすることなんてほとんどねーんだし、
そうするくらいなら、参照渡せよ、って感じだし。
(使用頻度において、T const * >> T * const ,T const *const)
ポインタのポインタも、ポインタへの参照とか、vector<vector<T> >つかえば
いいわけだから、ポインタでconst使うのは、実質 T const * ptr だけっしょ。
だったら、迷うもなにも、 const T *ptrってやっとけばいいんでないかい?
漏れはバリバリ使う、9割方const
配列のときとかNULLのときとか参照使えないし
>> 461
>> 当たり前のことにも名前ついてて少しワラタ。

若干オソレスだが

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

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

だいたい、Gof本に書いてあることなんざ、ハッカーレベルじゃ全部当たり前。
>>548
取りあえずこれ抽象クラスにしたら継承するだけでいろんな事に使えるやろ?
おお。確かに。

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

日本的にあの名前達は有害かと。
しかし、参照は便利だねえ。
NULL渡しチェックの必要がなくなるのは嬉しい。
今までCOMに毒されてたから気が付かなかったよ。
>>550
逆にNULLが渡したくても渡せない罠。
>>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_);// メンバ変数
}

こんな感じで。
>>552
結局参照はPascalのvar以上の使い方はすべきでないですか?
554デフォルトの名無しさん:02/07/07 16:31
派生クラスを定義するときに
継承もとのクラスのコンストラクタをそのまま使いたいんだけど
良くわかりません。

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


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とメモリ消費しながら・・

この修正で正しいですか?間違ってますか?
いいんじゃないの?
そうでしたか。どうもです。
C++標準ライブラリ〜って本では文字列を渡してますが
VC++の癖ですかね〜
char const *からstringへの変換は存在するが、
pair<int, char const * const>からpair<int, string>への変換は存在しない。
560japh ◆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") );
書くのはvalue_typeにしとけ
562561:02/07/07 20:57
と思ったけどちょっと長いな
std::multimap<int,std::string>::value_type
563japh ◆J.5V8ta6 :02/07/07 21:28
>>561
うい、そっちの方が望ましいね。
長いのはtypedefで何とかすればよし。

564デフォルトの名無しさん:02/07/08 00:36
C++のソースで、cstdioじゃなくstdio.hをincludeすると、なにか問題ある?
stdio.hに愛着があるんで。
>>564
名前空間がstdに包まれなくなる。つまり通常のCのようになる。
おまえ死ねと言う気になる
グローバルネームスペースを汚すなと。
567デフォルトの名無しさん:02/07/08 00:39
>>564
これだからプロジェクトに加齢臭のするドキュソが入ってくるとロクなことにならねえ
と若い連中に思われる。
.cpp で使う分には問題は少ないでしょ。
569564:02/07/08 00:42
うわぁレスの早さからしてとてもだめなことを聞いたね。> 俺
今日から改めます。
570デフォルトの名無しさん:02/07/08 00:46
569は神。ジジイのカガミ。
名前空間についておさらいだッ
friendってどういう目的で使うのですか
クラスのprivateなメンバにアクセスしたり。
574デフォルトの名無しさん:02/07/08 01:42
g++の2.95で、std::basic_string<unsigned char>のc_str()で
エラーが出たりしますか?
cppってstdio.hインクルードすると良くないのかぁ・・・。
ストラップさんの本、読み直してみよう・・・。
576128:02/07/08 01:46
>572
引きこもりは全部friendにしてしまう傾向があるから注意・・
>>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の実体がないから。
こんなの初めて見た(ワラ
ワラウコトナイジャナイ...
>>578 とにかく覚えなさい。

class Test
{
public:
static int nHoge;
};

int Test::nHoge;

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

return 0;
}
クラス内の性的変数の定義の詳細を見ればどうにかなるんじゃない
>>582
int Test::nHoge; ←これが実体なの?

うーん謎。
>>584
class変数を複数作っても、staticメンバ変数は実体が一つしか
存在しない事に伴う特殊な書き方らしい。誰か詳細キボンヌ。
>>584
それが実体。初期化する場合もそこで。
>>585
class変数 を staticメンバ変数 と言い替えている罠

588デフォルトの名無しさん:02/07/08 02:30
アヒャヒャ!
>>584
staticメンバはクラスに固有なもの
インスタンスをいくつ作っても、staticメンバは複数作られない
それは、概念的にstaticメンバが、インスタンスの外にあるから。
>>587
わりィとちった。インスタンスだね。
>>589
なるほど。わかりやすいです。
staticメンバの宣言は、
各インスタンスの外にある1つの実体を指すための
ポインタ的(Cで使う意味じゃなく)なものだということだすね。
だからいくつインスタンスを生成しても指す場所は同じってことで、
値はいっしょということだと。
>>587
静的嫌がらせ
593デフォルトの名無しさん:02/07/08 15:19
ちょっと質問!
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。
>>594
サンクス、とりあえず、向こう逝きます、
596デフォルトの名無しさん:02/07/08 16:34
ここのみんなでさC++の入門書書かない?HTMLとかで
大勢で思考錯誤したり分担したりすればかなりいいものが作れる気がするんだが
痒い所に手が届くような大規模なFAQとかさ、、
学んでる最中の人のがいればどこがわからないとかが指摘できたりするわけで
ここには勉強中の人もかなりいるだろうからそう言うのも大丈夫だとおもう
597デフォルトの名無しさん:02/07/08 16:41
>>596
俺も似たようなことは考えてた。
>>596
俺はハナからあきらめてた
599デフォルトの名無しさん:02/07/08 16:49
class a{
friend class b;
}

class c : public b{
}

この class c にも class b に対して行ったfriend宣言の効力を
効かせたいんですけど無理ですかね?
やっぱり class c のfriend宣言をあらためて加えないと駄目ですか?
>>599
はい。
>>600
あなたヤホーの掲示板に居たでしょ?
>>599
なんでそんなことをしたいのよ?
603ななしあた:02/07/08 18:48
>>602
いいじゃない、別になんだってさ
604599:02/07/08 18:56
そうですか、残念。

>>599
class b の派生クラスを作る度に
class a の宣言を改定しなければならないのがイヤだったんです。
class b の能力としては class a のプライベートメンバにアクセス権を持つ
というのが含まれているんで、継承でそれを派生クラスに持ち越せないって
なんか変な感じがしますね。これはちょと不満かも。
605599:02/07/08 18:56
>>602の間違いでした。
>>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;
}
};
607599:02/07/08 19:20
>>606
それはまたトリッキーで・・。
でも class friendlyA は class C の内部クラスにしてしまえば
それなりに綺麗に書けそうかも。どうも参考になりました。
それか、今思ったんですがfriend宣言のところだけマクロにして
切り離すってのもアリかも。
608デフォルトの名無しさん:02/07/08 19:51
>>596
いまにそれが有名になってこの板が2chの看板に!
日本語で specialization を表すのに何を使ってますか?
「特殊化」や「専門化」は instantiation の訳に用いるほうがふさわしいし、
C++3rd の「特殊バージョン」は間違いではないにしろ、すわりが悪く感じます。
特別化
>>596
>>608
あれだけいってもC FAQ/C++ FAQすらよまねえ連中だらけなのにさらにゴミ文書増やすのかヨ

>>610
ふむ、それも「専門化」とかと同じで、意味があってないんだよね
>>612
何がしたいわけ?
>>612
限定化
615デフォルトの名無しさん:02/07/08 20:55
>> 614
いろいろと「〜化」って挙げてくれてるけど、それって「操作」を意味する「サ変名詞」でしょ
だから、正しくない。
specailization は「操作」じゃなくて、クラスや関数でしょ。
○○化物
>>613
単に、specialization を日本語で "正しく" 表記したいだけだよ。
いつもは「スペシャライゼーション」って書いてるけど、長ったらしいしね
言語のままspecializationと表記することに問題が?
原語
>>616
クラスや関数って「物」なんだろうか?
>>618-619
うん、問題ない。めんどくさいけどね。
読みやすいかといわれると、疑問もあるけど。
>>621
気持ちは分からんでもないが、戦時中じゃないんだから、
むりやり日本語にすることもあるまい。
623デフォルトの名無しさん:02/07/08 21:09
>>622
政府の見解は違うようだけどね(w
字面が場所とるのが嫌なんだが、現行どおり「スペシャライゼーション」で当面いきます。
おつきあい、ありがとう。
政府を窓から投げ捨てろ!
>>624
燃えるゴミの日に出したよ。政府
626デフォルトの名無しさん:02/07/09 06:44
templateは言うなればクラスの特殊な物なの?
具体的な型を指定してあげればクラスと同様に扱えますか?
つまり、基底クラスにして派生させてみたり、
その他いろいろ文法上はクラスと同等の扱いですか?
627デフォルトの名無しさん:02/07/09 07:57
>>626
>>templateは言うなればクラスの特殊な物なの?
逆、クラステンプレートは普通のクラスを型に対して一般化したもの。
同様に、関数テンプレートは関数を一般化したもの。

>>具体的な型を指定してあげれば、クラスと同様に扱えますか?
そのとおり、テンプレート引数を与えてやれば、コンパイラは
テンプレートをそれでインスタンス化してクラス定義を作成し、翻訳単位に挿入する。
そうやって作られたクラスは、通常のクラスとまったく同じように使用できる。
>627
ありがとうございます
629デフォルトの名無しさん:02/07/09 22:48
2次元配列の要素数を取得するにはどうすればよいですか?
vector?
string に数値を文字列にしていれるのに一番すっきりした方法はなんでしょう?
sprintf を使ったりしてみたのですが、なんかカッコ悪いような……
>>631
boost::lexical_cast<>
ちょい重いけど
int x = 10;
string s = static_cast<ostringstream&>((ostringstream() << x)).str();
とか。
itoa
>>633
それだったらboost::lexical_cast<>でいいじゃねぇか。
どうせあれも内部でstringstream使ってるし。
sprintfつかっとけ。
637デフォルトの名無しさん:02/07/10 17:24
stringオブジェクトの中身を編集したいのでstring::c_str()
で得られたconst char*をchar*にキャストして
そこがさす文字を置き換えたりとかしても平気ですか?
自分が確保した領域にstrcpyしてからのほうがええんじゃないか?
エエジャナイカ、エエジャナイカヽ(・∀・)ノ
>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;
}
基本的じゃなくて、絶対にやってはいけない。
内部文字列のコピーを返している場合もあるから。
なるほど。よくわかりました。
const_cast<>を使う時って、なんかいけないことをやってる気がするよ。
うん。
644デフォルトの名無しさん:02/07/10 19:48
コンソールアプリケーションの実行ファイルサイズを抑えるために、
なにか心がけるといいことはありますか?C++で
>>644
iostreamなどの標準ライブラリを使ったらすぐ大きくなる。
646644:02/07/10 19:53
>>645
そうですよね。特にg++ 3.1なんかでは半端じゃないですよね。
SGI STLのiostreamがでかいだけ。
gcc-2.95.3とかでは割と小さかったのにな。残念だな。
locale周りのサポートが入ったんだから、
でかくなるのは避けようがないでしょ
stringstreamを使うだけででかくなるのはいただけない。
どうしてもsprintfの誘惑に負けちゃうよな
だれかー初心者ですが

致命的エラー 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++ は右辺値なんでしょうか。
>>651
F1003は#error指令が出すメッセージです。
拡張子を.cppにしませう。
655japh ◆J.5V8ta6 :02/07/10 21:20
>>653
++xが左辺値なのは効率の為で、x++が右辺値なのはそうせざるをえないから、かな。
実装してみればわかるよ。
むきー、x++しか使っていない
俺はまるで非効率な男みたいではないか!!
>>652
描画インターフェースを定義して(IDrawable3D::Draw()とか)、
人間クラス、背景クラスがそれを "内部クラスで" 実装し、
そのインスタンスをD3D描画管理クラスに登録するというのはどうかな。
このやりかたなら、対象となるクラスが何であろうと、描画に持ち込むことができる。

デザインパターンでいうところの・・・何だっけ
658 :02/07/10 21:35
>>656
普通にプログラミングすれば、x++と--xだけあればいい。
++xやx--は使う前にアルゴリズムを見直してみることを勧める。
659デフォルトの名無しさん:02/07/10 21:36
++は右っ側、--は左っ側にするのか?
660652:02/07/10 21:42
>>654
ありがとうございまする
動きました!!GCCなら動いてたんだけどなぁ
BCCは動かないのね…

>アルゴリズムを見直してみることを勧める

そ、そんなに重大なことなのか!?
>>658
++xとx++は、コピーコンストラクタ云々で効率が違うんだと。
詳しくは知らん。
663japh ◆J.5V8ta6 :02/07/10 21:56
>>658
ん〜む。何故にx++と--xのみ…
よければ理由を教えてもらえないかな?
664デフォルトの名無しさん:02/07/10 22:00
>x++が右辺値なのはそうせざるをえないから、かな。
x++が左辺値だったら、なんかまずいワケ?納得いかん。
>>662
演算子の多重定義の事を考えてみると、前置++は参照値を返すように
書けるが、後置++はできない。関数内で一時変数を作成して、その値
を返すようにしなければならない。

それで、参照値が返せるというのは、すなわち左辺値になりうる、という
説明ではダメ?
666japh ◆J.5V8ta6 :02/07/10 22:05
そもそもxの通常の動作は
xをインクリメントし、インクリメントする前の古い値を返す
というもの。
「xをインクリメントする前の古い値」がxそのものであるはずがない…
つまり一時オブジェクトであるということだよ。

ちなみに、ユーザー定義型ではx++に代入させることも可能だよ。
俺はそんな型扱いたくないけどね。

>>664
前置/後置で左辺値/右辺値でバランス取れてるじゃん!
右辺値だけ使いたい時も在るさ、多分
668664:02/07/10 22:12
>>665
なるほど、納得しますた。
>>667
納得いくかっ!
669662:02/07/10 22:30
>>665
さんくす。
しかし、それでも後置を使いたいんだなぁぁ。
前置は気持ち悪いのよね。
>>669
気持ちが悪いという理由で演算子を使い分けられないのなら、プログラマは
向いてないと思われ……。

(それは仕様ですで何でも済ませるヤツもアレだが、仕様を納得できんのも
アレだ)
プログラマはというか、C++は絶対に向いてないね
しかしC++は後置だったりする
673662:02/07/10 22:52
>>671
確かに向いてないかも。
templateとかあんまり好きじゃないしね。
ヘッダにずらずらと、なんだか汚く感じるんだなぁ。
>>673
C++は他の言語のいい点をたくさん取り入れたが、汚い所もたくさん
取り入れてしまったね。
ヘッダに書いた方が良いと思うが。
セパレーションは運用楽だしコンパイル速度も遅くならないが、管理が面倒。
>>673
それは同意。
資源の浪費だし、テンプレートを使ったコードの最適化は信用できないし。

でも C++ は嫌いじゃないけど?
どの言語が一番好きかといわれたらダントツでC++だな・・・
んだんだ。
仕事には私情を挟むつもりは無いが
同じく俺もだ。
680652:02/07/10 23:50
>>657
ありがとうございます。
でもレスが少ないところを見ると、ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
私もラッパー程度の使い方にとどめておきます。
>>680
オレはOOだよ。
シーンやシナリオはステートパターンで。
スプライトとかオブジェクトにしとけば便利。
ゲームってOO使えそうじゃない
683デフォルトの名無しさん:02/07/11 00:14
例外処理が有効な時とか RTTI が有効な時に定義されるマクロって
何かありましたっけ?
__CPLUSPLUS みたいな感じの。

CodeWarrior と VC++ の場合を知りたいです。
VC++はヘルプにあった。
オブジェクトの何等かの状態を知りたい場合、intやdouble,booleanなどのメンバーに
アクセスする時にC++の教科書ではメソッドを介してアクセスされてますがなぜですか?

FieldやPropertyなど、メソッドを介さずに直接Publicなメンバーを用意して
値のやり取りも出来ると思うのですが。
>685 その理由を説明していない教科書は捨てろ。
(自分だけが)十分承知使うなら別にそれでもかまわんぞ
>>685
#define class struct
#define private:
#define protected:
とでもして使えばいい罠。
>>686
その理由に付いては何となく分かるんですが。(配列、ポインタ、インデクス
範囲、そんなキーワード思い付いたんですが)
教科書探して見ます。

>>687
わかりました。どうもです。
#define private public
#define protected public
だわな。
>>688>>690
極悪(w
>>688-690
ワラタ
>>680
> ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
絶対数は知らんが、俺は OO だよ。今度、転職する先のゲームメーカーでも
開発の主力言語は C++ だそうだ。

(別のトコロで C 主流ですって会社もあったけど、そっちは断った。言語が理由
じゃないけどね)
>>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すべきですか?
mainの最後とか
static Singleton* pinstance = NULL;
if (pinstance == NULL) {
 lock();
 if (pinstance == NULL) {
  static Singleton instance;
  pinstance = &instance;
 }
 unlock();
}
return pinstance;

こうすればいい
698695:02/07/11 14:28
>>696,697
ども。697を見てて思ったんですけど、
Singleton* Singleton::getInstance()//staticなメンバ
{
 static Singleton inst;
 return &inst;
}
なんてするとヤヴァイですか?
>>694
なるほど、そうすると、privateなメンバを持つクラスのヘッダファイルを
書き換えて、privateメンバをいじくって楽しむというのは危険な行為な
のですね。

まあもともとC++のカプセル化機構は、いくらでも壊すことができるから、
使う人に全責任があるわけですが。
700695:02/07/11 14:31
>>698
むりですた
>699
危険なヤシが居ます
702695:02/07/11 14:45
ガーン。二重deleteしてるだけだった。
とりあえず>>698でよさげなのですが、697さんのように
いちいちチェックしたほうがよいですか?
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では通りません。
ポインターの所にエラーがきます。どう直せばいいのでしょうか?
ぜんぜんC++じゃないじゃん。
> 連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。

このソースが通るコンパイラってあるのでしょうか…
>>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);
}
}
>>704
VCとunixとでは仕様が全然違う。きをつけろ
eki[20];
何型?
とおりましたありがとう。
ちなみに出力関数忘れてましたw。
>>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
ふざけてんの?
716713:02/07/12 19:09
>714
だからさ、5文字って指定しているのにどうして
8文字までOKなのかってことさ。
>>704
C++でmallocなんて化石は使うな。
と言ってみる。
718デフォルトの名無しさん:02/07/12 19:11
>>716
あんたの環境ではたまたま大丈夫だったってだけだろ?
719713:02/07/12 19:11
そんなもんなの???
720デフォルトの名無しさん:02/07/12 19:13
>>719
ss[4]以降もメモリーは続く。
721720:02/07/12 19:13
s/ss[4]/s+4/
722721:02/07/12 19:14
違う、ss+4だ・・
723 :02/07/12 19:15
ss/ss[4]/ss+4 ?
>>723
何気におもろかった。
>>716
OKじゃなかったらバッファオーバーフロウの心配なんてしねーよ。
726723:02/07/12 19:18
?
s/じゃなかったら/なら
728 ◆JAPH9PWA :02/07/12 20:10
つまり幅を制御したければstd::setwを使え、と。
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);
です
無い
vectorとかに格納してみるとか。
「newしたものをdeleteしわすれる」以外に
メモリーリークすることってありますか?
mallocしたものをfreeしわすれる
配列のdeleteに[]を付け忘れる。
>>735 >>736
以外でありますかね?
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
したらなぞのメモリーリーク検出するんですよねぇ。。
newもmallocもつかってないのに。。
Winの場合だけども、リソースを解放し忘れてるとか。
>>730
可変個引数はあきらめて、引数を1個、2個、3個、…持つ
テンプレート関数としてコンストラクタを定義する。
740734=737:02/07/13 14:06
どうも。コメントアウトしながらつきつめていったら、
どうやらstd::stringのつかいかたをあやまっていたようです。

std::string str;
str = "";
ってだめコードですか?
>>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++初心者なのでわかりませぬ…。。。
742741:02/07/13 14:18
関係ないところを訂正

MyException(const string&, int, const string&, variable_arg<T>);

ちょっと試してみよう。。。
>>740
駄目ではないと思う。
str.clear() だとリークは起こらないの?
744740:02/07/13 14:39
stringに関することはstlすれかな?微妙だけどとりあえずここで。
stlport(4.5.3=今の最新)はメモリリークが発生します。
SGIのアローケーターがよろしくないらしいので、
$stlport\stl\_site_config.hの
#define _STLP_USE_NEWALLOC 1
をコメントアウトするといいようです。
ってがいしゅつ?(だろうな)
ちゃいます。
普通はNode Allocatorが使われるので、
#define _STLP_USE_NEWALLOC 1

#define _STLP_USE_MALLOC 1
どちらかを定義します
746740:02/07/13 14:51
thx.
自分のソースで定義しろってことですよね?
違う
〜\stlport\stl_user_config.h
に書き加える。iostreamも使っている場合、
ビルドし直さないと原因不明のバグの元になる。
>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;
}
>>734
STLport使ってるとか?
この不具合ってSTLportについてだけ報告されてるの?
ostringstream() << 〜ってできないよ
>>750
不具合じゃないよ
パフォーマンスを上げるために一部をプールしてるだけ。
そうだったんだ。でも何時の間にかリークしてるっていうのは嫌だな。
>>753
リークはリークだけど、どれだけ運用してもリーク量は増加しないよ
「プール」は「リーク」じゃない
と、Effective C++に書いてありますが
>>750
sgiからおとしたほうも同じく起こります。
>>754
ってことはこのリークは気にしなくてもいいのですかな?
リークとは、それを指すポインタが失われて、解放する手段がなくなった
時。
>>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
(・∀・)カコイイ!!
カコワルイ
std::string(__FILE__) + __LINE__ + "HOGE(" + lexical_cast<string>(a) + ")" + lexical_cast<string>(b);
>>757
(・∀・)イイ!!
>>760を見てまたC++が俺の知らない間にトランスフォームしちまったのかと
焦った。Boostかあ、ちょっと見てみるかなあ。
>>760
それだけ見ると lexical_cast って、あまり使い勝手よいとは
思えないんだが、どういうインタフェースなの?
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);

こんな感じで。
>>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;
ってやるしかないんじゃないの?
os.width(4);
os.fill('0');
スマタ。ostringstreamか
printfの方がいいな。
つまり、>>758の方法では、>>730のやりたい事を完全に置き換えられないmmじゃない?
os << setwidth(4) << setfill('0') << n;
STLも改訂してCの書式出力をサポートしてくんないかな・・
>>772
自作の道がある。
>>771は間違いですから無視してくださいスマソ。
>>756
STLport が STL コンテナで使ってる node allocator の仕様だ。

いやなら _STLP_MALLOC_ALLOC (だったかな? マニュアル参照してくれ)
あたりのマクロを定義すると、node allocator 使わずに malloc / free するよ
うになるから、その手のリークチェッカに引っかからなくなる。

ただし、致命的にパフォーマンスが落ちるから、リリースビルドでは標準の
アロケータを使った方が良いと思う。
やっぱり>>730の方法が一番シンプルで良いと思う
>>770
#include <iomanip>
して、771 のように
ErrorMessage() + "setw(4) + setfill('0') + n;
でいける。
そんなわけわからん記述してまで・・>730がシンプルでいいじゃん。
まあまあ、半分ネタと思いつつやってるんだから (w
で、オレとしては、setfmt みたいなマニピュレータを定義して、
os << setfmt("04d")
とかだったら、
os.width(4);
os.fill('0');
とやってくれるようなのを作ればいいんじゃないかと。
78016メロミックス ◆/ECTibn. :02/07/13 21:45
パンピーより質問です。

日韓翻訳掲示板を作りたいのですが、
協力してもらう事は可能でしょうか?
ここは技術板で、制作板じゃない
78216メロミックス ◆/ECTibn. :02/07/13 21:55
>>781
スマソ
783デフォルトの名無しさん:02/07/13 22:02
exit();で終了するとメモリーリークが起きました。
exitの代わりになる物はないですか?
終了時のメモリリークは気にするな
リソースリークは気にしないとだめだが
785デフォルトの名無しさん:02/07/13 22:47
>784
どうも。ってことは代替物はない?
メモリーリークはどうも気持ち悪くて・・
それを潰してもプログラムの性能も安定性もまったく向上しないと思うが...
787デフォルトの名無しさん:02/07/13 23:15
windowsはリソースへっていかないの?
終了時の無駄な解法の分だけパフォーマンスが落ちるね
ちゃんと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
おまえ知ってるっちうか実行してるのか?
バカだな〜
仕方ねえな教えてやるよ
80才まで20本の歯を保とうだぞ?
世間の常識だから覚えとけよ。
>>793
俺は0-100だ。
たとえ重要じゃないところでもみっともないコードは残せない
796デフォルトの名無しさん:02/07/13 23:32
Windowsの場合プロセス終了してもメモリ解放してくれないんじゃなかったっけ?
>>795
えーと、あれだな。
たとえスライム一匹でもフルパワーを持って倒しに行くタイプ。
スライムが居るので議論が進みません。
0-100 ではないがスライムに対しては全力で挑む。
800デフォルトの名無しさん:02/07/13 23:44
スライムはほっといてメモリーリークはどうしますか?
全部潰す派ですか?
>>796
んなこたぁない。
解放されないのはリソース。
リークが怖いヤシはassert入れるなよ
解放忘れさえしてなければリークは気にしない派。
win32ならリソースも解放されるよ・・・
805デフォルトの名無しさん:02/07/13 23:51
じゃあ終了時のメモリリークはバグじゃないって事でいいですね?
>>804
9x系でDCにオブジェクトを選択したままプロセスが死ぬと
GDIリソースは解放されません。
>>806
「9x系で」ってことは、OSのバグってことでいいですね?
メモリリークは命がけで怪傑汁
>>807
バグじゃなくて仕様だって。
気に入らない動作=すべてバグ って厨房じゃないんだから。
全て仕様ってことで押し通す気ですね:-)
811デフォルトの名無しさん:02/07/14 17:20
numeric_limits の max/min が関数になってるのは何故ですか?
浮動小数点型とかだと、is_bound というメンバが true じゃないと
max/min が裕子にならないから、みたいだよ。
813811:02/07/14 19:08
>>812
その理由だと、 digits も関数になってるはず。
やっぱりわからん。
データメンバだと値を設定しないといけないじゃない
815812:02/07/14 19:58
そうか、整数型以外はクラス定義での static const な変数の
初期化はできなかったね。
816811:02/07/14 20:14
>>815
あー。それですな、きっと。理解しました。
ありがと。>>812,>>814
static でメンバ関数を宣言した時とそうでない場合の違いを教えてください。
static 関数で定義された関数を class :: 関数 で呼び出す時、
一時的にクラスは作成されるのか教えてください。
呼ばれるときにthisが漏れなく付いてくる(非static)か、
付いてこない(static)か。
819プログラマ・ペレ:02/07/14 20:30
>>817
C++ third editionを買ってください。
私ならそうします。
C++ は他のオブジェクト指向言語とは違い、動的にクラスを生成したり
することはできない。クラスはコンパイル時に静的に生成される。
821817:02/07/14 20:36
>>818〜820
速レスさんくす
Javaも動的にクラスを生成できないが?
たしか BSF 使えばできるよ。
BSFって?
Binary Sex Fucking
(両性どちらとでもOKです)
826 ◆JAPH9PWA :02/07/14 23:38
numeric_limits<>は全部関数だったらいいのに、と思ってしまうのは俺だけだろうか。
static constと入り混じってわかり難いよ…。
さっき発見したんだけど、C++ではifのなかで変数宣言できるんだね。
こりゃ便利。
>>827
式が書ける所ならどこでも宣言できる。
>>828
Test(class : public Base{}());とか出来ればいいのになぁ…。
830デフォルトの名無しさん:02/07/15 08:32
C++ではポインタはあまり使わずに参照をしたほうが良いのですか?
>>830
場合による。
>>830
正直、勉強不足。
833デフォルトの名無しさん:02/07/15 09:42
たかぎのMM (C++講座)
http://www.melonpan.net/melonpa/mag-detail.php?mag_id=000211
ここの人がそういってます。
C++の特徴を始めのほうで羅列しておりますがめちゃくちゃのような気がします。
ほとんど間違っていると思うのですがどうでしょうか?
↑このメールマガジンは参考になりますか?
>>827,828
でも、
if (int i = foo())
みたいに代入式しか書けないよね?
if ((int i = foo()) == 2)
みたいに条件判断も書けるといいんだけど。
プログラム言語で信じられるのはANSI/ISOとかのドキュメン
トと有名図書ぐらいでそれ以外の解説ははっきりいって役に
立たない。役に立たないどころか有害でさえある。
K&Rっていう遺物は有害だな。
838デフォルトの名無しさん:02/07/15 20:04
cygwinのgccでc++プログラムコンパイルしたら
テンプレートの定義が見つからないのかなんなのかやたらエラーがでました。
設定に問題があるのかサポート外なのか。。どっちですか?
バージョンは?
すんません。
自分で書いててあれ?gccだっけ
と思いg++でやったらできますた。。
あのう 自分forにつかうiとかjも事前に、
int i,j;
というふうにしとるんですけども。
やっぱりだめどすかね。
すまあとじゃねえどすかいね。
変数のスコープは最小限にしませう。
for内でi宣言すると
forからでたら、i無くなっちゃうんどすか?

初心者でスマソ
>>843
最近はそのとおり。昔は違った。
845843:02/07/15 21:36
844…あうーサンクスコですー
そうか最近は消えるのか…やっぱり年はとりたくないもんだなーって
それくらい実験すればわかったな…
なんでもきいてスマソ
いいんじゃない?相談室だし。
847843: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を後段で呼び出すのはどうすればいいんだ?
>>847
普通そんなこと考えない
849843:02/07/15 21:53
848
ごもっとも!
850848:02/07/15 21:54
俺は遊ばれたのですか?
851843:02/07/15 21:56
いやー方法あるなら聞きたいと思っただけです
遊んでおりません。
なんか this.i みたいなかんじであるのかなと…
逝ってきます
>>851
this.i?
853843:02/07/15 21:59
そんな夢のある方法を使えば
変数ひとつでプログラムがかけてしまう!とか何とか
思ったりしたと思われ…
>>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" ;
}
}
せめてthis->iって書いて欲しかった。
856843:02/07/15 22:04
>>852
変数のスコープも和歌ランぐらい初心者なので
ウル覚えですが…自分自身のクラスだったっけ???
グーぐる先生に聞きに逝ってきます
857843:02/07/15 22:07
>>854
>エラー E2316 a.cpp 6: 'setw' は 'std' のメンバーではない(関数 main() )
しくしく63

>>855
そうでした スンマソン
VC6 との互換性を考えて

{ for(int i; i < 10; i++){} }

と書くけど、やっぱダサい!
>>857
#include <iomanip>
if(0)else forよりカコイイ
#define for if(0); else for
862861:02/07/15 22:11
ぐあああ、俺だせぇ
863843:02/07/15 22:14
>>858
VC6ではそうしないといけないのか…大変だな
>>859
隊長!動きました…けどやっぱりダメみたいですね。
結果は無残だった。
足して駄目なら引いてみるとか?
865843:02/07/15 22:16
>>862
なるほどと思ったりなんかして…
#define for {for
あ、閉じる括弧は無理ジャン…
なるほどね
866843: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
867854:02/07/15 22:40
いや別に試さんでも…
冗談だし。しかし866のメモリレイアウトはどうなっているのだろう。
868843:02/07/15 22:44
あ、うまくいく場合もあるようですね
当然だが…
ポインタの差を求めてそれをたし元に戻すと…
ポインタの差が変わってて しょんぼりって…
これじゃ使えないジャンか!!
869デフォルトの名無しさん:02/07/15 22:46
boostでGUIプログラミングは作れないんですか?
だとするとあんまり役に立たないような・・やっぱ
MFCで逝くしかないのか・・
べつに作れるんじゃないの?
871843: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
分けることもできるけど、
その分けた実装がコンパイルされるときに
明示的なインスタンス化をやっとかないと
リンクエラーになるよん
>873
ありがとうございました、なんとかうまくいきました
875デフォルトの名無しさん:02/07/16 00:17
>for(int i=1;i<10;i++){
>for(int i=1;i<10;i++)
正直これは改悪だと思われ。

forやifの後に命令ひとつでも{}してしまいたくなる症候群なのですが
コンパイル時に実害はありますか?
>>876
最近のコンパイラはすごいです。
>>876
わしも
>>877
どうすごいの?
コンパイラvs{}
   ↓
コンパイラwin
>>879
脱いでもすごいです
なんか実害はなさげですかな?
コンパイラはそんなにあほではないのね。
>>878
やっぱりいるんだ。うれしいような
>>876
最近やめますた&1行だったらforの中に突っ込んですまいます。
>>876
いいと思う
if(i>=0) if(i>=1) if(i>=2) ;
else std::cout << i ;
こんなのあったら何がなんだか分からんし
そんな風にしちゃうのと、{} でくくらないのは別問題。
乗り遅れた。。
チィッ
887デフォルトの名無しさん:02/07/16 08:32
メンバ関数内にstatic変数を使うくらいなら
その変数はメンバ変数にしてしまった方がいいのでしょうか?
>>887
意味的には×かと。
他からアクセスする気がない変数なら敢えてそうする必要はないかと。
>>887
時と場合によりけり。
その変数をほかの関数からつかう可能性があればメンバ変数。
ほかの関数からは絶対呼ばないようなときは関数内static。
ま、「変数のスコープは最小限に」っつーことです。
でもその変数がそのクラスにとって重要ならメンバ変数でもよい。
890887:02/07/16 08:57
>>888-889
レスありがとうございます。

>時と場合によりけり。
とりあえず、迷ったらメンバ変数にする方向でいきます。
なんか、上司がstatic変数にブチギレしてたので。
本人曰く「staticアレルギー」らしいです…(藁?
マルチスレッドとかで痛い目にあったんだろうな。
つぅか出来る限りstaticを使わないと言うのが・・・
893デフォルトの名無しさん:02/07/16 13:26
メンバ関数の中の静的変数ってそのクラスの全部のインスタンスから
参照されてしまうからね。メンバにするのとは意味が違ってくる。
staticにするかしないかで迷うことなんてある?
通常のメンバ関数とstaticメンバ関数の違いがいまだによくわからない。
>>895
staticメンバ関数なら
ClassName::function();
と呼べる。
897 :02/07/16 20:16
>>895
staticメンバ関数なら、>>896 のようにインスタンスを作成せずに呼べる。
通常のメンバ関数だと、foo.function()のように
わざわざインスタンスを作成しなければならない。
898デフォルトの名無しさん:02/07/16 20:42
あげ
all right.
>>896>>897
サンクス。
901デフォルトの名無しさん:02/07/17 10:40
静的メンバ関数からは静的メンバ変数しかアクセスできない。
インスタンスがあろうと無かろうと。(無い場合を考慮すれば当然だが)
コールバックなんかには静的メンバ関数であれば渡すことができる。
903デフォルトの名無しさん:02/07/17 19:25
C++でデータベースにアクセスするとしたらどんなライブラリが一般的ですか?
DBごとにアクセス用のライブラリが用意されてると思うけど
Win上ならODBC経由だろうねー
905デフォルトの名無しさん:02/07/17 19:34
unixなら何でしょう??
標準は無いと思った。蛇足だけどJavaならJDBCだのー
つかスレ違いっぽいから他スレ行けよ。
そうすか。すんまそ。でわでわ
908デフォルトの名無しさん:02/07/17 20:52
クラスの宣言をヘッダに定義をcppファイルに書いています。
ここでこのクラスのオブジェクトを操作するようなグローバルな関数
(例えばswap(class T, class T)みたいな)ですが
プロトタイプはヘッダ、実装はcppに書く、というのが一般的な記述ですか?
>>908
疑問点が明確でない。どゆこと?
910デフォルトの名無しさん:02/07/17 21:01
つまり
このクラスを扱うグローバルな関数をこのクラスとセットで提供したいのです。
この場合関数をcppファイルに書いたのですが、プロトタイプはどこに書こうかなぁ、、と思いまして。
externキーワードつければcppファイルに書いても他のファイルから参照できるんでしたっけ??
>>908
もっとちゃんと句読点を入れて書けよ。

テンプレートを作りたいなら、全部丸ごとヘッダに書け。
そうじゃないなら、ヘッダには宣言だけを、*.c/*.cpp に定義を書け。
そのグローバル関数のプロトタイプを、クラスのヘッダに買いときゃ
いいんじゃないの?externつけるまでも無く
>912
そうですか。そうします。ありがとうございます。
関数はデフォルトでexternだから付けなくてもヨシ。
>>911
普通のクラスのメソッドの定義はヘッダじゃマズイっすか?
>>915
inlineじゃない場合、まずいんじゃない?リンク時にぶつかりそう
>>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のどちらかだ。

# ?(・∀・)? ソウダッケ?
プログラマの給料の為だろ
>>918
テンプレートのインスタンス生成は関数やクラスの外で行われるから。
(C++ 3rd, C.13.8.3)
これは仕様だが、なぜそういう仕様になっているかは知らない。
それを許すとあまりにもコンパイラを作るのが面倒になるからかなぁ?
bool Get() { return m_bBool; } を
bool * Get(){ return &m_bBool; } とやる利点を教えてください

923デフォルトの名無しさん:02/07/20 19:19
VC++でお勉強がてらコンソールアプリ作っているんですけど
画面をクリアする方法はないのですか?
system("cls");
>>918
テンプレート使いまくったプログラムのマップファイルを見れば、
少しは納得がいくと思うよ。
>>924
サンクス、systemでdosコマンド呼ぶんですね。
>>922
あえていうなら
・レジスタに乗らないようなサイズならば、参照するのに効率がよい
 (でも普通はconst参照にするんでは)
・ポインタ経由で値を変更できる

boolじゃあんまり利点ないと思うけど...
>>924
cls なんて外部コマンドはねーよ。
>>927
> ・ポインタ経由で値を変更できる
そんなことするぐらいなら素直に m_bBool をパブリックにした方がいいと
思うぞ。
普通に考えたら、とても変なことなので >>922 はそういうことしてる奴に
真意を確認した方がいいよ。普通はやらない。と言うか、やっちゃいけな
い。
>>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; }
};
931
bool変数をわざわざintで返すのですか?
933931:02/07/21 00:50
型付け忘れてたよ。。。スマソ
( ´∀`)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 です
シングルスレッドで問題ないなら、
同期まわりのバグのほうを疑うべきじゃないのか?
どこかでメモリ破壊をしている。
具体的なソースを上げられないなら、手の施しようがないと思うが。
939936:02/07/21 23:16
>>937,938
アドバイスに添って調べてみたら微妙なミスを発見しました。
解決できました。ありがとうございました!
940デフォルトの名無しさん:02/07/22 01:34
windowsでdllとアプリの間に共通の自作クラスを使用する場合は
どこで宣言するのが吉?
vector <myClass *> classes
みたいなオブジェクトをdllとメインプロジェクトの間でやりとりしたくて
迷っています
宣言は必要なところすべて
インスタンスの作成は所有者
942940:02/07/22 01:42
>941
そうですかやっぱりメインプロジェクトの方でも宣言しないとダメですかね。
どうもdllとlibの関係がわからない・・・
>>942
だめというか、そのクラスを使うところで
使いたい対象を知らなかったら使えないでしょ?
944940: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って普通に参照回数を数えているのとは違うらしい
んだけど、それは普通に参照回数を数えるのに比べて何がどう違って
いて、どうメリットがあるんでしょうか?
ドキュメント見たけど書いていないっぽいのでどなたか教えて頂けないでしょうか。
946940:02/07/22 04:22
すみませんもう一つだけ質問させてください。

メインプロジェクトで
myclass *test;
init(test);
としてdllの方のinit関数で
test = new myclass
などすることは可能なのでしょうか?
どうもここがうまくいきません。
947940:02/07/22 04:55
つまりdllの方で
動的にメモリ領域を確保してメインプロジェクトで使うことは可能かどうかということです
ちなみに
warning C4700: 値が割り当てられていないローカルな変数 'test' に対して参照が行われました。
という警告がでてはしまうのですが・・・・
>>940
メインで確保したメモリはメインで開放、
DLLで確保したメモリはDLLで開放する。
Windowsの力を借りれば、どっちで開放してもいいようにもできる。

その前に引数とはどういうものかを知れ。
>>945
use_count_ と weak_count_ を分けているので weak_ptr<> が作れるぞ、
ってゆーか、別に普通に数えているのと大差ないと思うけど。
つか、
myclass *test;
dll_init( &test );
  @dll
*test = new myclass
ダロ。ポインタわかってるか?
951945:02/07/22 10:53
>>949
ほほぅ、そうなんですか。それってパフォーマンス下がるんですかねぇ、やっぱり。
サイズ大きくなりそうだし・・・
952デフォルトの名無しさん:02/07/22 12:05
srand((unsigned)time(NULL));

この、unsigned っていうのはなんでしょうか?
C or C++自体初心者なので、頭についているのも理解できません。
>>951
局所的な、パフォーマンスが要求されるポインタには、scoped_ptrを使えって。
shared_ptrは、たとえばSingletonだったり、木構造だったり、
複数の参照元を管理するためにつかうもんだろ。
954デフォルトの名無しさん:02/07/22 15:13
今、VC6.0で音声認識を行うランチャーを作っています。
Microsoft Speech SDK5.1をダウンして、付属の音声認識サンプルプログラムcoffees0
をコンパイルしようとするとcofgram.hが見つからずエラーが出てしまいます。
ハードディスク内を全検索かけても、googleで検索かけても何も見つかりませんでした。
confgram.hはどーすれば手に入りますか?よろしくお願いします。
>>954
まるち は しね
956デフォルトの名無しさん:02/07/22 20:28
新スレいりますか?
いらないっつーに
958デフォルトの名無しさん:02/07/22 23:22
保守あげ
勃てますた。ヨロスク。
C++相談室 part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/
960945=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<> を使うべきかと。
2つのカウンタをインクリメント・デクリメントするコストが無駄だというんじゃないの?
963945=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 なる物は始めて知りました。確かにありますねぇ。
ちょっと見てみます。










































埋め立て
埋め立て!!
埋め立て!!
埋め立て!!
埋め立て
埋立て
埋立
埋立











埋め立て




u
m
e
t
a
t
e
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
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。