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


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

C++相談室 part15
501 名前:デフォルトの名無しさん :03/02/06 23:02
朝のぬるぽから夜のぬるぽまで幅広くサポート

502 名前:デフォルトの名無しさん :03/02/06 23:05
あるクラス(Aとしよう)のデストラクタがvirtualであれば、
そのクラスを継承したクラス(Bとしよう)のデストラクタは必ずvirtualになる。
Bのデストラクタに対しvirtualキーワードを付けるかどうかに依存しない。

これはメンバ関数についても当てはまる。

503 名前:デフォルトの名無しさん :03/02/07 00:26
class A {
virtual void func() const {}
};

class B : public A {
nullpo void func() const {}
};

Bのfunc()をvirtualで無くす方法。ぬるぽ。

504 名前:502 :03/02/07 00:31
502に追記。classとstructの違いは、デフォルトのアクセス権のみなので、
502の事柄はstructにも当てはまる。

505 名前:デフォルトの名無しさん :03/02/07 00:33
ぬるぽっていつごろからどういう意味で使われだしたの?

506 名前:デフォルトの名無しさん :03/02/07 00:37
ぬるぽ
http://pc.2ch.net/test/read.cgi/prog/1042017145/

507 名前:デフォルトの名無しさん :03/02/07 00:46
頭痛い...。

「デストラクタを途中で切る」
>>502 の言う通り。

「クラス階層以下で動的確保」
やっぱり意味が分からない。
多分 >>502 を踏まえれば意味の無くなる言葉なのだろう。

「NULLデストラクタ」
デストラクタは暗黙に
メンバ変数と基底クラスのデストラクタを呼ぶという後処理を含むので、
完全に無くなるというのはメンバ変数にデストラクタを呼ぶクラスがなく、
かつ基底クラスも同条件である場合のみ。

「NULL命令」
いわゆる NOP のことか?
上記の様に完全に消え去る場合は関数が呼ばれすらしないし、
それ以外でも NOP などは入らない。
関数と関数の間の詰め物として NOP を使うことがあるが、それは100%別の話だ。

それとも ((void*)0)(); という類のものか?
これは上の完全に消え去るということと同義なわけだが、
その条件は上の通り非常に厳しいものだ。

508 名前:デフォルトの名無しさん :03/02/07 00:50
>>506
途中まで読んでみたが理解できなかった

509 名前:デフォルトの名無しさん :03/02/07 00:52
「NULL命令」

もしかして空文のことか?

510 名前:デフォルトの名無しさん :03/02/07 00:54
>>508
どっかの誰かが書いたテンプレ

プログラム板の名物スレですな。こうでもしなけりゃ心が落ち着かない人が多いのです。
■ NullPointerExceptionを「ぬるぽ」と呼ぶスレ
http://pc.2ch.net/prog/kako/1024/10245/1024553352.html
■ NullPointerExceptionを「ぬるぽ」と呼ぶスレ2
http://pc.2ch.net/test/read.cgi/prog/1039481980/l50
<<関連スレ>>
■ ぬるぽ
http://pc.2ch.net/test/read.cgi/prog/1042017145/l50
■ (ム板)NullPointerExceptionを「ぬるぽ」と呼ぶスレ
http://pc2.2ch.net/test/read.cgi/tech/1043623143/l50
■ (モナ板)NullPointerExceptionを「ぬるぽ」と呼ぶスレ
http://pc2.2ch.net/test/read.cgi/tech/1043623143/l50

511 名前:デフォルトの名無しさん :03/02/07 00:56
>>510
あーそういうことか、ありがとう。

512 名前:デフォルトの名無しさん :03/02/07 01:08
まあ、リソースの解放を気にしているだけマシなのかもしれん。

513 名前:デフォルトの名無しさん :03/02/07 01:08
モナ板のアドレスが間違ってる。
http://aa.2ch.net/test/read.cgi/mona/1044358791/l50

514 名前:デフォルトの名無しさん :03/02/07 02:04
>>485のリンク先読んでみたけど、
"A Good Thing"と"Yuck"が訳せん…
特に後者。ひょっとして笑うところ?(んなわけないか)

515 名前:デフォルトの名無しさん :03/02/07 02:39
>>514
http://www2.alc.co.jp/ejr/index.php?word_in=yuck

>>485のリンク先読んでないからなんともいえないけど、
A Good Thing って言ったら、「それはいいことだ」とかそういうの。


516 名前:デフォルトの名無しさん :03/02/07 04:25
>>514
笑うところでしょ(笑)

517 名前:デフォルトの名無しさん :03/02/07 11:17

質問です。

↓のような op= の定義は、C++的にアリですか?

 std::wstring& operator=( std::wstring& lhs, std::string& rhs )
 {
  if( !s.empty() )
  {
    std::vector< wchar_t > buff( rhs.size()+1 );
    if( std::mbstowcs( &buff[0], rhs.c_str(), rhs.size() ) == -1 )
     throw charactertype_convert_exception();
    lhs = &buff[0];
  }
  return( lhs = L"" );
 }
  

518 名前:517 :03/02/07 11:34
>>517
…つーか グローバルな op= ってコンパイル通らないや。
ごめん、op<<=に変更 VC++7.0 で動作確認。

 std::wstring& operator<<=( std::wstring& lhs, const std::string& rhs )
 {
  if( !rhs.empty() )
  {
   std::vector< wchar_t > buff( rhs.size()+1 );
   if( std::mbstowcs( &buff[0], rhs.c_str(), rhs.size() ) == -1 )
    throw std::runtime_error("bad chartype convert");
   lhs = &buff[0];
   returnlhs;
  }
  return( lhs = L"" );
 }

アリですか、ナシですか?


519 名前:デフォルトの名無しさん :03/02/07 12:36
>>518
ちゃんと動くんならアリだと思うけど、<<=はあんまり見慣れないから、
ソースが読みづらくなりそうだと思いました。

520 名前:デフォルトの名無しさん :03/02/07 14:10
つーか・・・何がしたいの?

521 名前:デフォルトの名無しさん :03/02/07 14:28
if ("おっぱい" == "おっぱい")
 cerr<<"Is this undefined?"<<endl;

522 名前:デフォルトの名無しさん :03/02/07 14:31
つか書き方がキモい

 std::wstring& operator<<=( std::wstring& lhs, const std::string& rhs )
 {
  if( rhs.empty() )
   return( lhs = L"" );
  std::vector< wchar_t > buff( rhs.size()+1 );
  if( std::mbstowcs( &buff[0], rhs.c_str(), rhs.size() ) == -1 )
   throw std::runtime_error("bad chartype convert");
  lhs = &buff[0];
  returnlhs;
 }

523 名前:デフォルトの名無しさん :03/02/07 14:36
てかなんでこの処理を演算子にするんだ

524 名前:517 :03/02/07 16:53
>>520,523
 std::string& operator <<= ( std::string& lhs, std::string& rhs );
 std::string& operator <<= ( std::string& lhs, std::wstring& rhs );
 std::wstring& operator <<= ( std::wstring& lhs, std::string& rhs );
 std::wstring& operator <<= ( std::wstring& lhs, std::wstring& rhs );
 ...
 std::wstring& operator <<= ( std::wstring& lhs, int rhs );
 int& operator <<= ( int lhs, tstring& rhs );

などとそれぞれ作っておけば、型や方向を気にすることなく、

 target <<= source; とか、
 str <<= 123;

と何でも変換機みたく書けるなぁ…と考えたからです。
lexical_cast みたいにターゲットの型を明記する必要もないし。

ただ、>>519 のいうように、ソースみて混乱するかも…
つーか、書いてて無用の混乱を生み出しそうな気がしてきたな…
まぁ、忘れてください。


525 名前:デフォルトの名無しさん :03/02/07 22:52
wstringstream, stringstream
にそれぞれ operator<< を定義するっちゅーのはまぁいいと思うんだが。

526 名前:デフォルトの名無しさん :03/02/07 23:55
lexical_castが
UNICODE対応とトークン対応すりゃいいんだが。
(doubleもspecializeする必要あるが...)
(でも、すべてのコンパイラでUNICODE使えるかわからん)

cout << lexical_cast<string>("あい aうえ",L"う"); //あい a
な感じで

527 名前:デフォルトの名無しさん :03/02/07 23:57
L""ってgccだと悲惨なことにならんか?

528 名前:デフォルトの名無しさん :03/02/08 02:15
とりあえず前スレより上へ浮上age。

529 名前:デフォルトの名無しさん :03/02/08 02:23
>>524
「何でも変換」って時点で最悪。
キャストとかも explicit にすべきなのに、
代入演算子で暗黙の型変換なんかされた日にはもう。


530 名前:デフォルトの名無しさん :03/02/08 12:23
ロケールってあんま良く分かってないんだけど、とりあえず
setlocale( LC_ALL,"”);
のかわりにしたいなら
locale::global(locale(""));
ってやっときゃいいの?


531 名前:C++厨 :03/02/08 14:44
てsつとふぁせtto

532 名前:デフォルトの名無しさん :03/02/08 21:12
質問です。
#include<iostream.h>
int main()
{
cout<<rand()<<endl;
}
とやると、何度やっても答えが130になります。が、
int main()
{
cout<<rand()<<endl;cout<<rand()<<endl;cout<<rand()<<endl;
}
とやると、130、10982、1090となります。
数字を実行毎に変化させる事は出来ないのでしょうか?

533 名前:デフォルトの名無しさん :03/02/08 21:16
>532 srand

534 名前:デフォルトの名無しさん :03/02/08 21:27
srand(time(NULL));

535 名前:デフォルトの名無しさん :03/02/08 21:59
>533-534
アリガd
ところで、gmtimeってなんの略でしょう?

536 名前:デフォルトの名無しさん :03/02/08 22:01
give me your time.

537 名前:デフォルトの名無しさん :03/02/08 22:13
なるほど「お時間もらえますか?」ですね。アリガd

538 名前:デフォルトの名無しさん :03/02/08 22:16
Σ(゚Д゚)

539 名前:デフォルトの名無しさん :03/02/09 00:02
グリニッジ標準時(Greenwich Mean Time; GMT)だYO!

540 名前:デフォルトの名無しさん :03/02/09 00:08
ま、マリリンモンローのポポポスターが・・・

541 名前:デフォルトの名無しさん :03/02/09 00:12
>539
すると、残りのimeってなんの略ですか?

542 名前:デフォルトの名無しさん :03/02/09 00:15
Ikumaeno
Meidonomiyageni
Ehimemikan

543 名前:デフォルトの名無しさん :03/02/09 00:20
Greenwich Mean Time Ikumaeno Meidonomiyageni Ehimemikan

544 名前:デフォルトの名無しさん :03/02/09 00:23
和洋折衷すぎ

545 名前:デフォルトの名無しさん :03/02/09 00:36
>>541
g m time だYO!

546 名前:デフォルトの名無しさん :03/02/09 00:38
warota

547 名前:デフォルトの名無しさん :03/02/09 00:52
>>532-545
お前らいい仕事してはりますな

548 名前: :03/02/09 20:48
参照を使って次のようなコードを書いたとします。

int* p = NULL;
int& i = *p;
i = 100;

ここで3行目のように i を使うと segmentation fault を起こします。
(int*)NULL にアクセスすることになるのだから当然ですね。
また (&i == NULL) という式の値は真(非零)となります。

少なくとも僕の環境 Debian GNU/Linux 3.0r1 (gcc 2.95.1) ではそうなります。

で、お聞きしたいのは、ANSI C++ や Stroustrup の C++ の
言語仕様的には次のいずれなのでしょうか?

1) 2行目の宣言が不可能でその結果が未定義
2) 3行目の式の評価が不可能でその結果が未定義

549 名前:デフォルトの名無しさん :03/02/09 20:55
2行目の宣言…ではなく、
> *p;
null pointer の dereference が未定義。

550 名前: :03/02/09 20:59
ということは、2行目の時点で実行時エラーとなるような
実装もあり得ると言うことでしょうか?

551 名前:デフォルトの名無しさん :03/02/09 21:07
よく、サンプルプログラムについてる、

Return 0;

って何ですか?例えばこんなん。

#include <stdio.h>

main()
{
printf("name: ");
     return 0; //←これ。

}

552 名前:548 :03/02/09 21:11
>>551
多くの処理系(というか OS)では
main 関数の戻り値が 0 であった場合に
プログラムが正常終了したと見なします。

なので、特に main 関数の中で問題が発生しなかったときには
return 0 などとしているわけです。
でも 0 が正常終了を表さないような処理系もあるので、
次のように書く方が移植性が高いでしょう。

#include <stdlib.h>

int main (void)
{
     // your main code here
     return EXIT_SUCCESS;
}

553 名前:デフォルトの名無しさん :03/02/09 21:17
>0 が正常終了を表さないような処理系
ネタでつか

554 名前:デフォルトの名無しさん :03/02/09 21:20
>>552
なるほど。ありがとうございます。
何故かほとんどの記事がコレには触れないんです^-^;
bcc32ではreturn 0; 無くてもコンパイル・実行共に通ったので、
悩んでました。

555 名前:デフォルトの名無しさん :03/02/09 21:34
省略するのが一番移植性高そうだな。

556 名前:デフォルトの名無しさん :03/02/09 21:45
>>550
うむ。例えばCINTはそこで落ちるね。

557 名前:548 :03/02/09 21:50
>>556 ふーむ、やはりそうですか。
うちの環境で #include <iostream.h> やって、

     cout << *(int*)NULL << endl;

なんて実行すると (nil) って表示されたんで、
「ん? lisp みたいに nil を返すなんてこともトリッキーながらできたりして。」
って思ったわけです。

558 名前:548 :03/02/09 21:58
ある関数ないでエラーが発生したりして、
意味のある値を返すことができない場合は
次の二つの方法があると思います。

1) あり得ない値を返す。
  たとえば年齢として負の値を返すとか。

2) 戻り値とは異なる経路でエラーを伝達する。

3) 例外を発生させる。

で、lisp で言うところの nil みたいなものを扱う方法が C++ にあれば
1) をやる場合に便利だなぁと思ったわけで・・・
まぁ浮動小数点における NAN みたいなものでしょうか。

いや、 int をそのまま使わずに Java の Integer 型みたいに
クラスにくるんでしまえばなんとでもなるのはわかっているんですけど、
それも大げさだなぁ、と思った次第でして。


559 名前:デフォルトの名無しさん :03/02/09 22:03
>>553
dos の batkey とかは、リターンコードで情報を返したりするよ。

560 名前:デフォルトの名無しさん :03/02/09 22:10
>>559
だからどうした?

561 名前:デフォルトの名無しさん :03/02/09 22:21
>>560
うん ? >>553 に対して、ネタじゃないよと言うだけのことだけど。

562 名前:デフォルトの名無しさん :03/02/09 22:24
>>559が「0 が正常終了を表さないような処理系」だっていうのか?
へぇ・・・。

563 名前:デフォルトの名無しさん :03/02/09 22:31
>>562
そうだけど、それがどうかしたか ?

564 名前:デフォルトの名無しさん :03/02/09 22:34
C++ならstdlib.hじゃなくてcstdlibだろ

565 名前:デフォルトの名無しさん :03/02/09 22:39
なるほど、batkeyという「処理系」があるんですね。アリガd

566 名前:デフォルトの名無しさん :03/02/09 23:08
>>565
dos と言うものを知らんアフォが絡んできただけのことか...。

567 名前:549 :03/02/09 23:30
>>557-558
>     cout << *(int*)NULL << endl;
> なんて実行すると (nil) って表示されたんで、
ふおぉ。そんな風になってる処理系もあるのか。面白い。

「意味のない値」を返す話なら、boost::optional
  http://www.kmonos.net/alang/boost/classes/optional.html
なんかを覗いてみると良いかと。

568 名前:デフォルトの名無しさん :03/02/09 23:34
標準C++はmain関数に限り、return文を書かないと、return 0; を
実行して終了したのと同じ意味になるので、0が正常終了を表さない
処理系では標準C++は使えないね。

569 名前:デフォルトの名無しさん :03/02/09 23:49
>>568
main 関数の返す値とプログラムの返す値が同じである必要は無い。

570 名前:デフォルトの名無しさん :03/02/09 23:56
0とEXIT_SUCCESSとは、exitの引数およびmainの戻り値として渡されたとき、
同じ動作をする仕様となっております。

571 名前:デフォルトの名無しさん :03/02/10 00:05
>>569
ダウト。

572 名前:548 :03/02/10 00:06
>>567
いま boost の class optional のコードを読んでみました。
結局のところ、

class optional
{
   いろいろ
   省略

 private:
   bool m_initialized;
   storage_type m_storage;
}

となっていて、そのオブジェクトが有効か無効かを記憶しているだけですね。

573 名前:デフォルトの名無しさん :03/02/10 02:17
>>559
0 が正常終了を表さないような処理系もある
と言う事と
リターンコードで情報を返したりする
事は全く別の問題だろ

574 名前:デフォルトの名無しさん :03/02/10 06:36
アクセス関数でメンバにアクセスするとインライン化してもかなり重くなる
こういうのを全部publicにしちゃうのはC++的にどうですか?
ちなみにゲームのプログラムです。

575 名前:デフォルトの名無しさん :03/02/10 07:49
折れアクセサあんまり書かん。
安全上必要なときだけ書く。
面倒なだけじゃなく、コードが増えて可読性落ちる、保守性落ちる。
折れのまわりには、必ずアクセサ書く香具師いる。
いろいろ理由言ってるけど、最後は趣味の問題。


576 名前:デフォルトの名無しさん :03/02/10 08:05
>>575
OO厨の召喚ですか?

577 名前:デフォルトの名無しさん :03/02/10 10:38
>>575
アクセサにしとかんと、インターフェースと実装を分離できないやん。

>>574
> ちなみにゲームのプログラムです。
俺は本職のゲームプログラマだけど、性能が要求される部分なんて、全体から
見たらほんの一部だよ。

たとえばアクションゲームでプレイヤーの制御する部分なんか、しょせん 1/60s
に一階しか呼ばれないから、そこで間接ジャンプが 100 回ぐらい入っても誤差
誤差。

578 名前:デフォルトの名無しさん :03/02/10 11:32
>>577
C++なら、アクセサ無しでもテンプレつかって分離という手もあるぞ、まあお勧めはせんけど。

579 名前:デフォルトの名無しさん :03/02/10 11:37
>>578
テンプレートはコンパイル時にシグネチャに基づいて結合させるから、プレイヤーの
状態遷移の制御なんかにゃ使えんでしょ。(あっちは実行してみないと状態が確定
しないわけで)

580 名前:デフォルトの名無しさん :03/02/10 12:36
アクセサをインライン化しても重くなる場合ってどこでオーバーヘッドが
かかってるの?

581 名前:デフォルトの名無しさん :03/02/10 14:14
>>580
まぁ、>>574がなんか勘違いしてるくらいだろ。

582 名前:548 :03/02/10 14:16
>>581
デバッギングオプションを on にしていて、
実は inline になっていない、とか?

583 名前:デフォルトの名無しさん :03/02/10 14:54
//戻り値void, 引数void
void f(){ cout<<"f()"<<endl; }

f(f()); //error. why?

584 名前:デフォルトの名無しさん :03/02/10 14:59
引数voidってのはな、void型を受け取るって意味じゃぁないぞ。

585 名前:デフォルトの名無しさん :03/02/10 15:10
>>575が逝ってることは、不要ならGetやSetを書かんということじゃないの?
メンバ変数は当然privateとして。
そんなら、普通のことだが。



もし、メンバ変数をpublicにしるということなら。。。
ガクガクブルブル

586 名前:548 :03/02/10 16:30
>>585
使いたくないけど、どうしても必要なら friend ですかね。
でも漏れは今まで演算しオーバーロード以外で使ったこと無いですけど。

メンバ変数を public にするならむしろ明示的に class じゃなくて
struct って書いた方がいいかも。

587 名前:デフォルトの名無しさん :03/02/10 16:31
>>585
virtualじゃないなら書いてもコンパイルが遅くなるだけでアプリのスピードは変わらん。


588 名前:574 :03/02/10 16:54
すいません勘違いしてました。582sanの言うように設定ミスってました。

>>577san
そろそろ全体の負荷を把握しときたいなとプロファイラを導入したのが事の発端でした

589 名前:デフォルトの名無しさん :03/02/10 16:57
>>586
てきとーなこといってんじゃねぇよ。
得意げな顔してなにが「 fiend ですかね。」だ。
お前は本当に、以下略。

590 名前:デフォルトの名無しさん :03/02/10 17:00
>>585
> もし、メンバ変数をpublicにしるということなら。。。
> ガクガクブルブル
なんでメンバ変数をpublicにしたらいけんのか小一時間

591 名前:デフォルトの名無しさん :03/02/10 17:01
>>589煽りでtypoカコワルイ!!!

592 名前:デフォルトの名無しさん :03/02/10 17:02
>>590
データメンバをpublicにするなら、classの中に置いてある意味が無くなるだろ。

593 名前:デフォルトの名無しさん :03/02/10 17:05
>>592
データメンバをpublicにするなら、classに置くのもグローバルにするのも
同じと言いたいのですか?

594 名前:デフォルトの名無しさん :03/02/10 17:07
>>590は明らかに釣り。

595 名前:デフォルトの名無しさん :03/02/10 17:07
>>590
君は、

 1.ただのばか
 2.いろんな可能性でうんちくを述べたいばか

のどちらかだろうから、とりあえず、息の根を止めてよかよ。

596 名前:デフォルトの名無しさん :03/02/10 17:09
ばかが一人でもはいるとC++の開発は破綻するって、名言だなあ。

597 名前:デフォルトの名無しさん :03/02/10 17:09
あはは。煽りうざいなぁ。息の根止めて氏ねよ。

598 名前:583 :03/02/10 17:28
>>584
内側のf()は何も返さないのだからOKになるのが普通じゃないですか?

599 名前: :03/02/10 17:40
言われてみるとそんな気もしてきたけど・・・
ハッ?漏れは >>583 にだまされているのか?

600 名前:デフォルトの名無しさん :03/02/10 17:46
575じゃないが、時と場合によっては、
メンバ変数をパブリックにしてもいい場合もあると思うが。

メンバを勝手に変更しても、問題ない場合とか。

class RectDrawer
{
 ...
public:
 Point begin;
 Point end;
};

他にも、Point とか、Rect とか、Matrix みたいなのは、その典型。



601 名前:デフォルトの名無しさん :03/02/10 17:48
引数をとらない関数の「引数リスト」に引数を記述すること自体が
構文として間違っているのでは。


602 名前:デフォルトの名無しさん :03/02/10 18:04
>>600
C の構造体に、操作に便利なメソッドを幾つか追加したってタイプのデータ構造な。
個人的には struct にするけど。

603 名前:デフォルトの名無しさん :03/02/10 20:16
最近C#使い始めて、移植性の都合上で意図的にメンバを public にする事が多くなってる。
C++ にもプロパティーが欲しい今日この頃。

604 名前:デフォルトの名無しさん :03/02/10 20:41
プロ仕様のパティー

(゚д゚)ウマ-

605 名前:デフォルトの名無しさん :03/02/10 20:43
ファイルのプロパテー

606 名前:デフォルトの名無しさん :03/02/10 21:17
>>603
operator=もメンバだが?

607 名前:デフォルトの名無しさん :03/02/10 21:23
Java3DのVectorとかMatrixとかも速度のために成分がpublicになってるでござる。
って普通かも。

608 名前:デフォルトの名無しさん :03/02/10 21:56
>>606
それはね、使ってみると分るよメッチャ便利だから。
特にテンプレートと組み合わさったら無敵になると想像。

609 名前:デフォルトの名無しさん :03/02/10 23:18
>>607
VECTOR や MATRIX みたいな、値指向の型だとそれもありだろう。OOP でいうところ
のオブジェクトではなく、むしろプログラミングのネジ・クギにあたる具象クラスってヤツ
な。

プログラミング言語 C++ でも散々解説されてるけど。

610 名前:デフォルトの名無しさん :03/02/10 23:22
プロ現C++高いよアニキ〜

611 名前:デフォルトの名無しさん :03/02/10 23:57
下手な本2,3冊買ってしまうより,なんぼかまし.
どんと買っとけ

612 名前:名無しさん :03/02/11 00:19
>>610
本棚の肥やしになっている…

613 名前:デフォルトの名無しさん :03/02/11 01:01
C++Primerもそのアンサーブックも買ったよ。
プロ現C++よりさらに分厚くて、見て笑ってしまう。

614 名前:デフォルトの名無しさん :03/02/11 06:00
所謂has-aの場合、クラスの外からメンバクラスへのアクセスがだるいのですが。


615 名前: :03/02/11 06:56
漏れ的には、いまだに A級B型C++ が
初心者にはもっともわかりやすいと信じて疑わないんだけど、
でも廃刊。しょぼーん。

616 名前: :03/02/11 07:49
class A
{
   //いろいろとかく
};

typedef B A;

これって、エラーになりますよね。
単純な型以外で typedef のようなことはできないものでしょうか?

class B : A {}

と継承しても良さそうなものですが、
オーバーロード演算子は継承されませんよね。

617 名前: :03/02/11 07:49
やっぱり #define でプリプロセッサの助けを借りるしかないのでしょうか?

618 名前:デフォルトの名無しさん :03/02/11 07:52
typedef A B;
じゃないのか?


619 名前: :03/02/11 07:57
ごめん、>>616 は typo
で、よくソースみてみたら

typedef A : B;

ってやってたよ!
何で真ん中にコロンなんて入れちゃったんだろう。

620 名前:デフォルトの名無しさん :03/02/11 12:57
( ゚д゚)ポカーン

621 名前:デフォルトの名無しさん :03/02/11 14:36
コンパイルは通るのですが、実行すると落ちまする。
殿,どうかご助力を。

#include <stdio.h>

aisatsu()
{
printf("hello");
return 0;
}

main()
{
int ans;
int loop;

ans = 0;

printf("処理を選択してください\n");
printf("1.aisatsu 2.aisatsu");
scanf("%d",ans);
 if (ans == 1)
  aisatsu();
 else
  aisatsu();
}

622 名前:デフォルトの名無しさん :03/02/11 14:42
&ans;

623 名前:622 :03/02/11 14:42
なんで俺セミコロン書いてるんだ・・・?

624 名前:デフォルトの名無しさん :03/02/11 14:45
>>622
Σ( ̄ロ ̄; 
実行できました。かたじけのうござる。
どうして &をつけるとうまくいくのでござろうか。

625 名前:デフォルトの名無しさん :03/02/11 14:49
Cスレでやってよ

626 名前:デフォルトの名無しさん :03/02/11 14:50
あれ?Cスレ?

627 名前:デフォルトの名無しさん :03/02/11 14:50
かぶた

628 名前:C++厨 :03/02/11 14:55
こんにちわ、C++厨です。

629 名前:デフォルトの名無しさん :03/02/11 15:03
厨はすっこんでろ

630 名前:デフォルトの名無しさん :03/02/11 16:08
一瞬、豚はすっこんでろ、かとオモタヨ。

631 名前:デフォルトの名無しさん :03/02/11 16:11
たしかに豚もすっこんでて良い

632 名前: ◆8x8z91r9YM :03/02/11 16:20
こんなソフト探してます!
又はスキルがある方安く作成して頂けませんか?
ttp://popup6.tok2.com/home2/DMmaster/
 

633 名前:デフォルトの名無しさん :03/02/11 16:32
>>632
そういうのを使う用事のある人に対して反感を持っています。
無作為にor不特定多数にメールを投げるのはやめなさい。
もっとまっとうな商売をしなさい。

634 名前:デフォルトの名無しさん :03/02/11 16:35
つか、こいつこの板に常駐してね?
前もどっかのスレで作ってくれって言ってたよ。

635 名前:デフォルトの名無しさん :03/02/11 16:51
In-Depthシリーズの「C++ ネットワークプログラミング」を買おうか子一時間迷った。

636 名前: :03/02/11 17:37
C++ というかオブジェクト指向の言語を使っていて、
いつも悩むのが 「ああ、コンストラクタが失敗してたらどうしよう・・・ 」

もちろんこういうことは例外で処理するのがスマートなのだとは思いますが、
例外処理を使いたくない場合は皆さんどうしておられるのでしょうか?

1) クラスの中に、コンストラクト成功・失敗のフラグを用意する。
  で、アクセス関数として int IsAvail(void) みたいなのを用意する。

2) コンストラクタの引数に成功・失敗を返すための変数への参照を取る。
   MyClass::MyClass ( int & flag)
  でも引数なしのデフォルトコンストラクタだとどうしようもない。

これ以外に何か方法あります?

#グローバル変数使ったりするのは即却下。


637 名前:デフォルトの名無しさん :03/02/11 17:38
コンストラクタで初期化処理を行わない

638 名前: :03/02/11 17:49
た、確かにそれは一つの解決法ですね。
どうしてもコンストラクタが必要になるケース以外では。

1) 引数なしのデフォルトコンストラクタが自動的に呼び出される場合。
2) 型変換のためにコンストラクタが自動的に呼び出される場合。

「自動的」って言い方はよくないかなぁ。
「暗黙に」といった方がいいのかもしれないですが。

639 名前:デフォルトの名無しさん :03/02/11 17:49
> 安く作成

(・∀・)カエレ!

640 名前:デフォルトの名無しさん :03/02/11 17:54
>>635
Aceとかいうのを使ってナニする奴かい?
漏れも一瞬迷ったけど、変な物使うぐらいならと思ってWinSock2.0の本を買って帰ったよ。

641 名前:デフォルトの名無しさん :03/02/11 18:21
636じゃないですが、

例外処理を有効にしてコンパイルするときに、
例外処理のオーバーヘッドを最小限に抑えるためのアプローチって、
なにか一般的なものはありませんか?

642 名前:デフォルトの名無しさん :03/02/11 18:37
例外の無い言語使えばいいじゃん

643 名前: :03/02/11 18:45
例外処理を有効にしてコンパイルしている時点で、
例外処理によるオーバーヘッドは仕方ないものだと思います。

#実行時型情報もオーバーヘッドありますね。

644 名前:デフォルトの名無しさん :03/02/11 18:57
やはりオブジェクト指向は高水準言語の方が適してるのか

645 名前: :03/02/11 19:06
速度が求められるところは C++ で書いて、
それ以外は Scheme とかで書きたいなぁ、なんて思う今日この頃。
いや、10分ほど前から libguile のマニュアル読み出したところなんだけど。

646 名前:641 :03/02/11 19:09
メモリの動的確保を採用してもそのオーバーヘッドを
最小限に抑えるようなアプローチは結構一般的なものがあると思ってるけど、
例外処理については>>643のように「仕方ないもの」で
済ませてしまっているようで、もうちょっとなんとかならんものか、と。

手当たり次第に throw() を付けていくってのは効果的なんでしょか?

647 名前:デフォルトの名無しさん :03/02/11 19:27
CとかC++使えちゃえば他のジャヴァとか覚えるのは簡単ですか?

648 名前:デフォルトの名無しさん :03/02/11 19:29
覚えるんじゃなくて学ぶんだよ。

649 名前:デフォルトの名無しさん :03/02/11 19:55
(゚Д゚)ハァ?

650 名前:デフォルトの名無しさん :03/02/11 19:56
(゚O゚) オオ?

651 名前: :03/02/11 22:01
みんなどこいっちゃったの? オロオロ

652 名前:デフォルトの名無しさん :03/02/11 22:07
>>651
姿は見えなくても、いつも漏まえのそばにぬるぽ。

653 名前:デフォルトの名無しさん :03/02/11 22:32
VC6の場合、static_cast<>使う場合はコンパイラに実行時型情報を要求されるんですが
static_cast<>の場合って普通の型キャストとおなじなので実行時型情報はいらないですよね?


654 名前:デフォルトの名無しさん :03/02/11 22:40
> static_cast<>の場合って普通の型キャストとおなじなので実行時型情報はいらないですよね?
これはたしかにそうだが、

> コンパイラに実行時型情報を要求される
これの意味がわからん。

655 名前:デフォルトの名無しさん :03/02/11 22:58
1行目は dynamic_cast の typo の悪寒。

656 名前:デフォルトの名無しさん :03/02/12 02:19
>>646
>手当たり次第に throw() を付けていくってのは効果的なんでしょか?

throw() があると、例外の有無をチェックするコードが挿入されるので、
逆に効率が悪くなる。

657 名前:デフォルトの名無しさん :03/02/12 03:31
>>656
げ、そーなの?俺>>646じゃないけど、throw()付けとけば
例外投げない宣言として変なコードが挿入されないだろうとばっかり思ってた・・・

658 名前:641 :03/02/12 03:56
>>656
それはthrow()を付けた関数の中に、throw()のついてない関数の呼び出しがある場合。
とはいえ、インターフェース決めるときの手がかりにはならんな。

gcc3.2で少し試してみたけど、例外が発生しなかった場合のコードに注目すれば、
throw()を付けても付けなくてもほとんど変わらないようだ。
追加コードも妥当なものだった。
もっと想像を絶するコードになるかと思ったが、結構理想的な実装になってるじゃないか。

throw()をつけるつけないで効率が変わるのは、コンパイラの実装が未熟なのだろう。
そうなると、一般的なアプローチがないのもしょうがないな。

659 名前:デフォルトの名無しさん :03/02/12 17:13
>throw()を付けた関数の中に、throw()のついてない関数の呼び出しがある

↑個人的にはこの場合はコンパイルエラーにして欲しいな。

660 名前:C++厨 :03/02/12 17:16
unexpectedォーーー

661 名前: :03/02/12 17:48
えっちだ!

662 名前: :03/02/12 17:48
誤爆スマソ

663 名前:デフォルトの名無しさん :03/02/12 23:35
fstreamとofstreamってなにか違いが有りますか?
例:
fstream fl;
fl.open(ios::app){...}
fl.close()

ofstream ofl;
ofl.open(ios::app){...}
ofl.close()
って、やってることは何か違うのでしょうか?

664 名前:デフォルトの名無しさん :03/02/12 23:46
>>663
openのデフォルトモードが異なる。

std::fstreamはstd::ios::in及びstd::ios::out
std::ofstreamはstd::ios::outのみ

665 名前:デフォルトの名無しさん :03/02/12 23:54
あーでもstd::fstreamはstd::istreamとstd::ostreamを継承しているけど
std::ofstreamはstd::ostreamしか継承してないから、std::ofstreamに
>>なんか適用しようとするとエラーが出るかも知れない。試してないけど。

666 名前:デフォルトの名無しさん :03/02/13 00:11
>664-665
為になる情報を有難うございます。
非常に参考になりました。

667 名前:デフォルトの名無しさん :03/02/13 00:13
わからないので教えてください
AをベースにB、Cを継承してクラスを作り
A *hoge; で、hogeにBまたはCのポインタを持たせた場合
hogeが保持しているクラス型を特定することはできますか?
クラスBなら1、クラスCなら2などと応答するメンバ関数を作らないとだめですか?


668 名前:デフォルトの名無しさん :03/02/13 00:20
typeid().name()を使ってもだめだったー

669 名前:デフォルトの名無しさん :03/02/13 00:25
>>667
何をしたいのかがわからん。
特定するだけならtypeid()でいいんじゃないの?

670 名前:デフォルトの名無しさん :03/02/13 00:28
>>667
わかりました。基底クラスのAが一つでも仮想関数を持っていれば、
typeid(*hoge).name()で実際の型がわかります。
もしAが仮想関数を持っていなければ、typeid()の結果は常にAに
なります。

671 名前:667 :03/02/13 00:55
おおお、できましたありがとうございました!
こんな演算子があったなんて・・・


672 名前:デフォルトの名無しさん :03/02/13 02:17
標準入力を標準出力に流すだけのプログラムを↓のように書きました。

#include <iostream>
main(){ std::cin.tie(0); std::cout << std::cin.rdbuf(); }

cygwinのgcc3.2で実行すると、1文字でも入力すると無限ループに陥ってしまいます。
なにかまちがってるんでしょうか?

673 名前:672 :03/02/13 02:23
超高速事故解決しました。
std::ios_base::sync_with_stdio(false);

674 名前:デフォルトの名無しさん :03/02/13 09:59
ifstreamの内容をstringstreamに読み込んで、複数回読み取りを
行おうとしましたがうまくいきません。どこがおかしいのでしょうか。

int main()
{
std::ifstream ifs("stringstream1.cpp");
std::stringstream str;
char ch;

str << ifs.rdbuf();
str >> std::noskipws;

while (str >> ch) std::cout << ch;
str.seekg(0, std::ios::beg);
while (str >> ch) std::cout << ch; // だめぽ・・・
}

675 名前:デフォルトの名無しさん :03/02/13 10:07
674です。自己解決しました。
strにeofbitが立っていたのが原因でした。clear()をかませると
うまく動作しました。

int main()
{
std::ifstream ifs("stringstream1.cpp");
std::stringstream str;
char ch;

str << ifs.rdbuf();
str >> std::noskipws;

while (str >> ch) std::cout << ch;
str.clear();
str.seekg(0, std::ios::beg);
while (str >> ch) std::cout << ch;
}

676 名前:デフォルトの名無しさん :03/02/13 10:20
自己解決ブーム

677 名前:デフォルトの名無しさん :03/02/13 10:37
>>672>>673
MinGW3.2.2だとsync_with_stdio(false);がなくてもハングしないよ。
環境に依存する問題なのかな。

678 名前:デフォルトの名無しさん :03/02/13 15:35
なんでfstream系にファイルサイズ返すメソッド無いの?

679 名前:デフォルトの名無しさん :03/02/13 15:50
>>678
それは俺も悩んだ。ファイルサイズというもの自体が環境依存だから
らしい。
従来のようにバイナリでfopenしてfseek()とftell()を使って求めてる。

680 名前:デフォルトの名無しさん :03/02/13 16:04
C++Primerには
string f(){
 string str;
 ....
 return str;
}
のようなコードが良く出てますが、これって無駄に文字列のコピーが行われますよね?

681 名前:デフォルトの名無しさん :03/02/13 16:08
>>680
autoのstd::stringのリファレンスを返すと大変な事になるから。

682 名前:デフォルトの名無しさん :03/02/13 17:09
ファイルがあってファイルサイズがないとはこれは随分矛盾した話だ

683 名前:デフォルトの名無しさん :03/02/13 17:12
>>680
最適化で少しはマシになるんじゃない。

684 名前:デフォルトの名無しさん :03/02/13 17:31
>>682
例えばUN*Xのようなシステムにおけるデバイスファイル(スペシャルファイル)
のようなものにはファイルサイズはないだろ。
デバイス、FIFO、ソケット、ディレクトリ、etc...を含めたファイルの種別
だの、そのファイルシステムにおける管理のされかたなんてものは
立派に環境依存だ。


685 名前:デフォルトの名無しさん :03/02/13 17:41
そうか、C++は低水準言語だったな
それじゃしかたない

686 名前:デフォルトの名無しさん :03/02/13 20:04
>>680
g++3では、最適化を禁止してもコピーが抑制されるよ。
規格上オッケーなのかなあ?

687 名前:C++厨 :03/02/13 20:50

                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< C++って超最高!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< 最高最高さいこ〜
超最高〜〜〜〜!   >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /

688 名前:デフォルトの名無しさん :03/02/13 21:26
int main() {
return 0;
};
//↑ これってなんかまずいですか?

689 名前:デフォルトの名無しさん :03/02/13 21:42
>>686
コピーが抑制って >>680 のstrのデストラクタが呼ばれないってこと?

690 名前:デフォルトの名無しさん :03/02/13 22:41

http://www.pro-g.co.jp/download_files/DVDConverter.zip

691 名前:デフォルトの名無しさん :03/02/13 22:49
>>690
何コレ dvdconverter?

692 名前:デフォルトの名無しさん :03/02/13 22:49
>>689
ちがう。
戻り値をどっかで受けるときにコピーが発生するはず?だが
g++3はコピーせずに戻り値のところに直接生成する。

693 名前:デフォルトの名無しさん :03/02/13 22:54
>>691
市販アプリのソースコード

694 名前:デフォルトの名無しさん :03/02/13 23:13
あんた!この携帯代どうすんの!?
おかん払っといて
おかん??!!
プオーーーン
あんた・・・本当はやったら出来る子やのに・・・(涙

695 名前:デフォルトの名無しさん :03/02/14 00:08
>691
【盗作】Pro-G Divxコンバータ その2【疑惑 】
http://pc.2ch.net/test/read.cgi/pcnews/1044893317/
【PC】プロジーの『DivXコンバータ』にGPL違反の疑い
http://news2.2ch.net/test/read.cgi/newsplus/1044854247/

スレ違いだけどな。

696 名前:デフォルトの名無しさん :03/02/14 00:10
>>686
RVO( Return Value Optimization ) で検索しる。

697 名前:デフォルトの名無しさん :03/02/14 00:46
>>688
} のあとの ; はいらない。
それ以外は別に何も。

698 名前:デフォルトの名無しさん :03/02/14 03:30

初心者質問ですが、一般に、例外を投入して、
catch ブロックにぶっ飛んだ後、問題を処理して
元のtryブロックのコード(の次)に戻りたいときは
どうしたら良いのですか?

投入する構造体に、細かいデータを与えておけば
可能でしょうけど、例えばMFCのCFileException には
そんなデータは入ってないみたいだし、そういう動作は
想定していないのでしょうか?



699 名前:デフォルトの名無しさん :03/02/14 03:36
>>698 ttp://www.research.att.com/~bs/bs_faq2.html#resume

700 名前:デフォルトの名無しさん :03/02/14 03:40
>>698
try の中に try を書けば?

701 名前:デフォルトの名無しさん :03/02/14 03:55
>>699
ありがとうございます。
ややこしくなるから、実装しなかったということですか。

>>700
例外を投入する可能性のある関数ごとに、執拗に1つずつ
try - catchで囲っていくのって、なんかソースが冗長で美しく
なくなる気がするんですよね。そんなことないですかね?

標準関数に例外を投入する関数があるから、使わないわけ
にもいかないし・・・。



702 名前:デフォルトの名無しさん :03/02/14 04:11
>>698
goto

703 名前:デフォルトの名無しさん :03/02/14 04:12
if(! foo())
 { /* 失敗した時の処理 */ }

try{ bar(); } catch(,,,)
 { /* 失敗した時の処理 */ }
の差をどう感じるか、かな。
失敗した時の処理が必要ないなら冗長に感じるのも分かるけどね。
マクロでも作ると楽かも?

でも、そもそも例外ってのはすぐ復帰できるようなものには使わず、
そういう時は bool 値か何かを返すのが普通だと思うんだけど、
その関数はそういう仕様にはなってないのかな?

704 名前:デフォルトの名無しさん :03/02/14 04:13
>>702
goto キタ━━━( ´∀`)・ω・) ゚Д゚)・∀・) ̄ー ̄)´_ゝ`)-_-)=゚ω゚)ノ━━━!!!!

705 名前:デフォルトの名無しさん :03/02/14 04:14
たかが goto でそんなに嬉しい?

706 名前:デフォルトの名無しさん :03/02/14 04:16
たかが goto 。
されど goto 。

707 名前:デフォルトの名無しさん :03/02/14 04:19
>>702
goto ってやっぱり最後の手段じゃないかなぁと。
ただcatchから戻るのは goto しかないですね。
おそらく戻る必要のないようにエラー処理をするのが
正しい書き方なのでしょうが。



708 名前:デフォルトの名無しさん :03/02/14 04:28
>>703
自分が想定していたのはMFCのCFileです。
ファイルが存在しないときに、CFileExceptionを
投入するんですが。

直接、CFile でファイルを開こうとすると、file not found で
例外投入の可能性があるし、CFindFile でファイルを
検索してからだと、CFileにcatchブロック書くのが不必要な気がするし。
まあ、堅牢なソースには良いのでしょうが、個人用にちょこちょこ
と作ったアプリだと、その辺が面倒に感じてしまう・・。



709 名前:デフォルトの名無しさん :03/02/14 04:55
>>707
gotoに必要以上に敏感になる必要はない。
適切に使われてる限り何の問題もないどころか、
ラベルを適切な名前にすることでソースの可読性を上げることができる。
そういうところで意地んなってdo/whileとか使ってると余計わけわかなコードになる。

710 名前:デフォルトの名無しさん :03/02/14 06:50
>>709
まぁ概ね同意だけど、
catch から goto で戻るというのはあかんかと(w
try ブロック内のオブジェクトのデストラクタが全部呼ばれてるというのに
戻っちゃまずいっしょ。

>>708
直接 CFile のコンストラクタで開こうとせず、
CFile::Open を使って開こうとすれば
第3引数を指定することで例外を投げないようにできます。

711 名前:デフォルトの名無しさん :03/02/14 09:40
基礎クラス(仮想メソッドがあって、new出来ないヤシ)って、
名称にbaseとか入れたりします?

712 名前:デフォルトの名無しさん :03/02/14 09:50
仮想メソッドがあってnew出来ないヤシって
何のことかと思ったがpure virtualのことか

713 名前:デフォルトの名無しさん :03/02/14 09:50
質問させてください。C6Entです。

タスクトレイ(時計が表示されている所です)にあるアイコンの
ToolTipTextを取得する為にはどうすればよろしいでしょうか?
やりたい事は・・・

あるアプリ(他人のアプリ)がありタスクトレイのアイコンのToolTipTextに記
載されている文字が「pp」と「ss」とあったとします。そして「pp」であれば
何もしない。「ss」であればそのアプリを強制的に終了させる。

という動作を行いたいと思っています。

よき方法をお教え下さい。お願いします。

714 名前:デフォルトの名無しさん :03/02/14 09:51
MFCスレへ逝け

715 名前:デフォルトの名無しさん :03/02/14 09:57
>>711
まあ名前付け規則は趣味の問題って感じだが。
漏れは付けない。
通常、そのベースクラスが外から使うインターフェイスになることが多いので、
一般的な名前にする。

716 名前:デフォルトの名無しさん :03/02/14 10:38
>>715
じゃ、他の方法、例えば、ファイル名とかでベースクラスって分かるようにするの?

C言語な人が多い環境でベースクラスを普通にCVSしといても無視されるかゴミ扱いされる悪寒。

717 名前:デフォルトの名無しさん :03/02/14 10:49
>>715
そうやね。漏れも同じ。
Stream ← StreamFile, StreamXXX
特殊化(派生)するならこんな具合につける。

718 名前:デフォルトの名無しさん :03/02/14 11:04
>Stream ← StreamFile, StreamXXX

これも逆もあったりするね。
某だと、
TStream ← TFileStream TSocketStream
とか。

順番どっちが良いよ。

それから、Streamにプリフィックスも無し?


719 名前:717 :03/02/14 11:18
>>718
クラス名をアルファベット順に並べたときのすっきり感と
基本:派生:派生…のほうが意味が(漏れには)わかりやすいので
そうしているけど、それぞれ個人の好みでしょうなぁ。

>それから、Streamにプリフィックスも無し?

あれは例なので、クラス名が衝突しそうなら紛らわしいので
ひねって別名を考えています。
うーん。prefix が必要なケースもありますかな?
経験不足なせいか、漏れはあまり使った記憶はないのですが。

720 名前:デフォルトの名無しさん :03/02/14 11:20
baseが外部に隠された実装詳細でしか無いのであればbaseつきだろうが
そうでなかろうがどうでもいい気がするが、baseが外部に公開されており
しかもそれが一般的にインタフェースとして利用されることを期待している
場合は、baseなんて付いていないほうがいいと思うけどね。
"base"ってのは要は実装で、そのクラスの概念とは全く関係の無いものだろ。
そういうのを思わず外に漏らしてしまうような名前の付け方ってのは、
俺はあんまり好きじゃない。

# とは云えそれが用いているデザインパターンを明らかにするために
# FacadeやFactoryといった名前を付けることは多いし一般的なんだよな。。
# プログラマにとっては分かりやすいとも云えるし。しかしオブジェクト指向の
# 本質からいって、クラスの名前はそのクラスの概念を表すのが本筋だと
# 思う。


721 名前:デフォルトの名無しさん :03/02/14 11:42
>>719
別名を考えるのは面倒
名前の衝突を恐れずに namespace で分けたほうがいいYO!
長くなるけど
TaroFoo TaroBar ッテクラスメイミルトメマイガ・・

722 名前:デフォルトの名無しさん :03/02/14 11:43
>基本:派生:派生…のほうが意味が(漏れには)わかりやすいので
これは納得。こちらが流行って欲しいけど、英語圏では違和感があるのかな。

># とは云えそれが用いているデザインパターンを明らかにするために
そう。
これをしたいんだけど、みんな、どーしてるのかなー、と思って。
名前に付けるのかファイルに付けるのか。(Javaだとこの点不自由だね)

723 名前:デフォルトの名無しさん :03/02/14 13:59
#ifndef __cplusplus
#error Must use C++ for STDCOMP.H
#endif

STDCOMP.Hに上のようなステートメントがあって、エラーになります。
STDCOMP.Hというのは、最初に自分で手直しして使うもんなんでしょうか?

724 名前:デフォルトの名無しさん :03/02/14 14:05
>>723
マルチすんなボケ

725 名前:デフォルトの名無しさん :03/02/14 14:12
>>724
その上>>723はマルチボケだったりするから恐い

726 名前:デフォルトの名無しさん :03/02/14 14:18
まさにマルチとマルチのハーモニー。

727 名前:デフォルトの名無しさん :03/02/14 16:01
コンストラクタの初期化リストは左から右に必ず実行されますか?

C() :a_(0), b_(f(&a)) {} //f()呼び出しの前にaは必ず生成されている?

728 名前:デフォルトの名無しさん :03/02/14 16:45
>>727
Exceptional C++のソースを見ると
保証はされていない印象。

729 名前:デフォルトの名無しさん :03/02/14 16:48
>>727
初期化順序は、常に「宣言定義の登場順」。
class A {
 int b_;
 int c_;
 A(): c_(0), b_(0) {}
};
ならば、b_が先に初期化される。
ちなみにまぎらわしいのでコンパイラによっては順序が違うと警告が出るよ。

730 名前:sage :03/02/14 16:54
>>727
コンストラクタの初期化順は「基底クラスの宣言順→メンバの宣言順」だ。
でも a_ を初期化しても a は初期化されていない罠。


731 名前:デフォルトの名無しさん :03/02/14 17:00
そんなヤツはわらぶき屋根にすみません。

732 名前:727 :03/02/14 17:59
>>729-730
ほんとありがとう

733 名前:デフォルトの名無しさん :03/02/14 20:03
参考書の例題で、変数nに0→1→0→1を永久に繰り返させる例として
int n;
OnTimer(UINT nIDEvent)
{
n = (n + 1) % 2;
としているのですが、int型変数nが計算過程で領域より大きい数字を扱うのは
問題ないのでしょうか?


734 名前:デフォルトの名無しさん :03/02/14 20:05
>>733
領域?
何を問題にしてるのか分からん

735 名前:デフォルトの名無しさん :03/02/14 20:18
int n = 0;
n ^= 1;
俺ならこう書くが。

736 名前:デフォルトの名無しさん :03/02/14 20:23
俺は n = !n; 派

737 名前:おふとぴ :03/02/14 20:35
BASIC時代は N=1-N をよく使った。
応用もあって、3と5を交互に入れ替えるなら N=8-N とかもできる。

738 名前:デフォルトの名無しさん :03/02/14 20:40
n=(a+b)-n か。いいね。
n=(a^b)^n でもいけるかな。

739 名前:デフォルトの名無しさん :03/02/14 21:05
souka!!

740 名前:デフォルトの名無しさん :03/02/14 21:05
プププ

741 名前:デフォルトの名無しさん :03/02/14 22:05
>>636-638
637に一票。
使って欲しくないコンストラクタはprivateにするとかFactoryパターンを使うとか。
暗黙の呼び出しは…、使わない。明示的な変換関数を用意する。

ちなみにデストラクタでも例外は投げないようにするため、
後始末はデストラクタ実行前にやっておく。
それが行われたかどうかをデバッグ時に確認(assert)するだけ。

742 名前:デフォルトの名無しさん :03/02/15 02:03
>>741
コンストラクタから例外投げないように細工するってこと?
例外処理が問題なく動作する環境でもそうするの?
それは勘弁してほしいなぁ。

743 名前:デフォルトの名無しさん :03/02/15 07:57

C/C++って2進数表記が使えないのはなんでだろう?
32bitくらいまでだと、2進数表記でも
冗長うにならずに、かえって分かりやすいと
思うんだが。



744 名前:デフォルトの名無しさん :03/02/15 09:21
>>743
漏れもわからん
ANSI-ISO標準化のときに取り入れてもよかったと思うけど
要望が少なかった(8,16進で表現できる)から?

2進数表記のためにわざわざパーサ組むのも面倒くさいな

745 名前: :03/02/15 09:51
それよりも、ビットローテートがないのが悲しい。

746 名前:デフォルトの名無しさん :03/02/15 13:11
下のようなコードでimage1,image2がクラスoneのオブジェクトで
image1->v = 100;image2->v = 200;
であるとしたとき、base1,base2とも200になるのはなぜ?
base1には100をbase2には200入れたいのだけど、
どうしたらよいでしょう?
setで定義されたjに上書きしてるようなのですが・・・。
int* one::set(){
int j;
j = v;
return &j;
}
int *base1, *base2;
base1 = image1->set();
base2 = image2->set();



747 名前:746 :03/02/15 13:13
int j;
のところは
static int j;


748 名前:デフォルトの名無しさん :03/02/15 13:22
class one {
 int* v;
public:
 int* set();
};

int* one::set(){
 return &v;
}
じゃ駄目?

749 名前:748 :03/02/15 13:23
すまそ、int* v; → int v;

750 名前:746 :03/02/15 13:29
>>748
コードを簡略化してたのですが、
int jのところは構造体で
構造体にクラスの変数の値を入れて構造体を返すようにしたいです。



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