■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part8
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に載ってるんですけど…
例が悪いみたいですね…。すいません。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.