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


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

C++相談室 part25
501 名前:釣り氏 :03/11/17 23:59
前置・後置で水掛け論が白熱するあたり、
いかに2chのC++ユーザーが水面下レブェルで
あることが明らかになってしまったわけだが。



502 名前:デフォルトの名無しさん :03/11/18 00:04
↑国語の成績5段階で1

503 名前:デフォルトの名無しさん :03/11/18 00:09
>>495
これはどう使うのですか?

504 名前:デフォルトの名無しさん :03/11/18 00:32
template <typename Src> class Strong_typedef{
Src src_;
public:
Strong_typedef(const Src &src):src_(src){}
operator Src&(){ return *this; }
operator const Src&()const{ return *this; }
};

typedef Strong_typedef<int> new_int_type;

505 名前:デフォルトの名無しさん :03/11/18 00:49
typedef Strong_typedef<int> new_int_type;
typedef String_typedef<int> other_int_type;

この二つがいっしょになる時点でダメポ

506 名前:デフォルトの名無しさん :03/11/18 05:44
C++相談室か・・・、C++に移行してからはや10年経過したけど、
C時代から生産性がまるであがってない気がするって相談はだめ?

アセンブラからCへ移行した時は、明らかな生産性向上が見受けられた
のだが

507 名前:デフォルトの名無しさん :03/11/18 06:53
>>506
アセンブラ、Cは使いこなせたが、
C++は使えこなせてないってことではないですか?

508 名前:デフォルトの名無しさん :03/11/18 08:05
>>505
template <typename Src,int> class Strong_typedef

typedef Strong_typedef<int,__LINE__> new_int_type;
typedef String_typedef<int,__LINE__> other_int_type;


509 名前:デフォルトの名無しさん :03/11/18 08:06
>>508
そんなのつかいたくない

510 名前:デフォルトの名無しさん :03/11/18 19:53
偶然同じ名前・型の関数を持つインターフェースクラスがあるとします。

struct IA
{
 virtual void func() = 0; // これと
 virtual void hoge() = 0;
};

struct IB
{
 virtual void func() = 0; // これが同じ
 virtual void foo() = 0;
};

この2つのインターフェースを継承する実装クラスがあります。
IA::funcとIB::funcで別の実装を行いたいのですが
どう書いたらいいのでしょうか?

class C : public IA, public IB
{
 void func() { /* 何かの処理 */ }
};

こう書くと同じ実装になってしまいます。
別々のクラスで実装するしかないのでしょうか?

511 名前:デフォルトの名無しさん :03/11/18 20:09
struct A : public IA
{
 virtual void func(){}
};

struct B : public IB
{
 virtual void func(){}
};

struct C : public A, public B{};

512 名前:わむて ◆wamuteW7DE :03/11/18 20:15
@   __  みるまらーー!           ./ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  <_葱看〉,                     |    #7Hjj9qn$   |
/ i lレノ)))ヽ.__∧           A  ___ \   _____/
 /人 il.゚ ヮノヽД`;)  ウッ         <_葱看> |/
    ui Y つ,.:' と)           / i lレノ)))ヽ___∧
   〈|: _フつ (  (  ドスッ       /人 il.゚ ヮノヽД .゚;) ア・・アウアウアア・・
   (/  (____(_____)               u~~ iつ葱看葱看
                          く_ :|〉葱看葱看葱看
B                         し'J葱看葱看葱看
   ___
  <_葱看>  みるまらーーーっ      C
/ i レノノ))) \  葱看葱看葱看      ___       __
 (人il.゚ ヮ゚ノ人 葱看葱看葱看葱看    <_葱看>   <_葱看>、
   ヽ Yi/   葱看葱看葱看葱看   / i レノノ))) \/.(ハ((iヽl, i \
   く_ :|〉  葱看葱看葱看葱看     (人il.゚ ヮ゚ノ人   人゚ヮ ゚∠イ)
    し'ノ   葱看葱看葱看          ヽ Yi/      ヽiY /
                            く_ :|〉       〈|: _>
                             し'ノ       .ヽ∪

513 名前:デフォルトの名無しさん :03/11/18 20:27
多態が参照で受けたときだけになるけど。

class C: public IA {
public:
 class C_B: public IB {
  C * parent_;
  public:
  C_B(C * parent):parent_(parent) {}
  virtual void func() { std::cout << "IB::func" << endl; }
  operator C&() { return *parent_; }
 };
private:
 C_B b_;
public:
 C():b_(this) {}
 virtual void func() { std::cout << "IC::func" << endl; }
 operator C_B&() { return b_; }
};


514 名前:デフォルトの名無しさん :03/11/18 21:01
>偶然同じ名前・型の関数を持つインターフェースクラスがあるとします。

意図的ではなく「偶然」って時点で事故だな(合掌

515 名前:わむて ◆wamuteW7DE :03/11/18 21:31
 <_葱看>、
/.(ハ((iヽl, i \ みるまらーーーっ
 人゚ヮ ゚∠イ)
  ヽiY /
   〈|: _>
   .ヽ∪

516 名前:510 :03/11/18 21:57
>>511
その方法、実は既に思い付いていました。

class C : IA, IB
{
 void IA::func() {}
 void IB::func() {}
};

さっきこんな方法を思いついたのですが構文エラーでした。
どうやらひとつのクラスで解決する方法はないようですね。
>>511の方法でやることにしました。
皆さんどうもでした。

517 名前:デフォルトの名無しさん :03/11/18 22:23
人をむかつかせるのも一つの才能だな。

518 名前:デフォルトの名無しさん :03/11/18 22:44
質問です。
Cは始めたばかりなので馬鹿みたいな質問かもしれませんが・・・。

1つのプロジェクト内で全ての「○○.cpp」間で共通する変数を使いたいのですが、どうすればよいのでしょう?
ご指導お願いします。

519 名前:デフォルトの名無しさん :03/11/18 22:51
>510
Effective C++ 43項

>518
>Cは始めたばかり
C言語なら俺に聞け! Part 67
http://pc2.2ch.net/test/read.cgi/tech/1068464309/

520 名前:デフォルトの名無しさん :03/11/18 22:56
>>518
>1つのプロジェクト内で

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

521 名前:デフォルトの名無しさん :03/11/19 00:59
C++相談。

よく巷の書で「多重継承は控えろ」とあります。
が、なぜに言語使用として実装されてるこの機能を
控えるべきなのか、いまだ分からない。



522 名前:デフォルトの名無しさん :03/11/19 01:04
・おばかさんが糞コードを書くから
・おばかさんがコードを読めなくなるから
・メソッドのリネームが無いから


523 名前:デフォルトの名無しさん :03/11/19 01:46
なぁ、最近気が付いたんだけどさ、オブジェクト指向の概念を
理解するのは簡単でも、それを実践するのって、難しくないか?

丁寧にコーディング進めていっても、途中で収支がつかなくなってしまう。


524 名前:デフォルトの名無しさん :03/11/19 01:47
>>521
その昔、多重継承をサポートするかどうか、かなりもめた。
結局、サポートすることに決めたけど 522 見たいな問題があった。
インタフェースのない C++ では体重継承が無かったら無かったで困るんだけど、
Java とか C# みたいにインタフェースのみ多重継承可能にするのがベスト。


525 名前:デフォルトの名無しさん :03/11/19 01:53
>>524
スレ違いなのかもしれないけど…
C++でインタフェースの多重継承をすると、(大抵の実装では)vtableエントリが増えることになるよね?
Java/C# のように「多重継承はインタフェースのみ」って制限をつけると、このデメリットは軽減されますか?

526 名前:デフォルトの名無しさん :03/11/19 02:42
>>524
ベストっていうより 522 的なことに対する妥協策のような。。。
実装の多重継承もまぁまぁコアなところでは使われてるし。
Symbian OS とか Windows だと ATL / WTL とか。

トイプログラムに毛の生えたような業務SEの設計する
業務APに多重継承使い出したらきっとバグでまくって死むと思うけど。

527 名前:デフォルトの名無しさん :03/11/19 02:51
グローバル変数だって言語仕様として実装されてるが、濫用しないのは当然だろうが。

つーか、C++の多重継承って「C++では多重継承できない」っていわれてカチンと来た
禿が意地でつっこんだんじゃなかったか?

528 名前:デフォルトの名無しさん :03/11/19 03:08
多重継承を濫用するスタイル(mix-in)ってのもアリだと思うけど。
でもまぁ確かに流行ではないよね。
最近は継承じゃなくて template でクラス合成できるし。


529 名前:デフォルトの名無しさん :03/11/19 04:21
>>グローバル変数だって言語仕様として実装されてるが、濫用しないのは当然だろうが。
しかし、例えばそのアプリでの唯一のグローバルクラスがあったとして
そのグローバルクラスにメンバ変数を追記していく手法では、
その本質はグローバル変数の濫用と同一なのではないだろうか?


530 名前:デフォルトの名無しさん :03/11/19 04:25
>>529
書き換えできるクラスを限定すればいいんでは?他のクラスからはリードオンリー

531 名前:デフォルトの名無しさん :03/11/19 04:53
>アセンブラ、Cは使いこなせたが、
>C++は使えこなせてないってことではないですか?
じゃ、例えば、貴方の場合、
自分を振り返ってみて
今のC++時代の自分は、C時代の自分に比べて生産性は何倍ですか?

自分の場合、1.1倍かなー?場合によっては、1.0倍切ってることもある。


532 名前:デフォルトの名無しさん :03/11/19 05:09
一太郎はC言語で書かれていたらしいけどさ、
実際、国内の目だったソフトでC++化による
著しいソフトウェアの生産性・質的向上のサンプルってあるのかなー?


533 名前:デフォルトの名無しさん :03/11/19 08:36
俺はSTLだけで生産性は大幅にアップしたけど。
Cで同じようなもの作ってもすごい醜悪で使いづらいし。

534 名前:デフォルトの名無しさん :03/11/19 11:45
STLつかうと一気に実行ファイルサイズが10倍に?!

535 名前:デフォルトの名無しさん :03/11/19 17:44
>>534
>>28

536 名前:デフォルトの名無しさん :03/11/19 18:07
>>534
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

537 名前:デフォルトの名無しさん :03/11/19 18:13
>>536
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

538 名前:デフォルトの名無しさん :03/11/19 18:14
template
<
 class CreationPolicy = using_new,
 class ThreadingModel = single_threaded
>
class widget : public CreationPolicy, public ThreadingModel
{
 ...
 
};

みたいなことがしたいから、多重継承なきゃやだ。

539 名前:デフォルトの名無しさん :03/11/19 18:41
>>538
同意だが、これって多重継承というよりはmix-inだよね。
mixinがあれば十分な気はする。

540 名前:デフォルトの名無しさん :03/11/19 18:42
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

541 名前:デフォルトの名無しさん :03/11/19 18:55
>>540
#include <stdafx.h>

後死ね。

542 名前:デフォルトの名無しさん :03/11/19 19:05
>>541
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

543 名前:デフォルトの名無しさん :03/11/19 20:52
>>534-542
またデジャヴ?

544 名前:デフォルトの名無しさん :03/11/19 23:43
STLつかうと一気に生産性が10倍に?!

545 名前:デフォルトの名無しさん :03/11/20 00:13
1.2倍くらいじゃね?

546 名前:デフォルトの名無しさん :03/11/20 00:28
Microsoft Visual C++をインストールしたいのですが、
どうすればよいのでしょうか?
馬鹿にも分かるように教えてください。
よろしくお願いします。


547 名前:デフォルトの名無しさん :03/11/20 00:29
CDをPCに入れる

はい、次。

548 名前:デフォルトの名無しさん :03/11/20 00:31
>>547
そのCDはどこにあるの?

549 名前:デフォルトの名無しさん :03/11/20 00:32
1.1倍とか、1.2倍とか、お前らC++の何を使っているんだ、と。

550 名前:デフォルトの名無しさん :03/11/20 00:32
ソフトの販売店

551 名前:デフォルトの名無しさん :03/11/20 00:33
C--

552 名前:デフォルトの名無しさん :03/11/20 00:38
C++でマクロツールを作ろうと思ってるのですが、
参考文献、参考URL等を教えてください。
ロケットマウスやFree Macro!のようなツールを作りたいのですが。
主な使用目的はネットゲームの作業の自動化等です。

553 名前:デフォルトの名無しさん :03/11/20 00:38
>>548
nyでおとして、焼いてください。

554 名前:nanasi :03/11/20 00:42
質問があります

#include <stdio.h>
int add(int n);
void main(void)
{
int i= 1;
printf("1st time ; i=%d,address=%x\n",i,&i);
i = add(i);
printf("2nd time ; i=%d,address=%x\n",i,&i);
i = add(i);
printf("3rd time ; i=%d,address=%x\n",i,&i);
}
int add(int n)
{
int i=0;
printf("add function; i=%d,address=%x\n",i,&i);
i+=n;←なんでここにnを代入するのかわかりません教えてください・・ほんとに・
ここにnを代入する必要があるのでしょうか?
nを代入する意味が知りたいのです
このプログラムの意味は1つの引数を与えて加算する関数ですちなみに自動変数です
return i;

555 名前:デフォルトの名無しさん :03/11/20 00:44
マルチ市ね

556 名前:デフォルトの名無しさん :03/11/20 00:49
>>554
さぁなんでだろうね?
ところで、アドレスの出力は正しくは%pだよ

557 名前:デフォルトの名無しさん :03/11/20 01:04
多重継承なくせばiostreamがなくなるよな

抽象クラス山盛りにして悦にひたってる自分としては
多重継承は存在していて当然というか
これ無しでコーディングハイにはなれないしモチベーションも出ない

558 名前:デフォルトの名無しさん :03/11/20 01:12
仮想継承したクラスから親クラスを見ると何もかもがすべて
間接的にアクセスされていると初めて知った・・・・・

それじゃ速度が遅くなってしまうじゃん!と思わず叫びたくなった。
仮想継承を10段ほど重ねたらどうなってしまうんだろう。

559 名前:デフォルトの名無しさん :03/11/20 01:22
とりあえず設計者を殴ったらどうだ?

560 名前:デフォルトの名無しさん :03/11/20 01:25
VC6.0です。
newで作成したchar配列の途中の文字からそれ以降の全ての文字列を破棄しようとしました。
この配列の先頭のポインタはchar*のベクターの中に入れています。(vector<char*>Cvec)

delete &((Cvec[i])[j]);

↑だとなんかダイアログ付きのエラーが出ます(デバッグモード)
どうなってるんでしょか?



561 名前:560 :03/11/20 01:27
すいません。嘘を書いていました。
↓がエラーの出るコードです。

delete[] &((Cvec[i])[j]);


562 名前:デフォルトの名無しさん :03/11/20 01:29
>>561
オモロイ事やってるな

563 名前:デフォルトの名無しさん :03/11/20 01:30
え〜と、何から何まで間違ってるように思う。
そういう用途なら、vector<char>にしといたほうがいいよ。

564 名前:560 :03/11/20 01:40
配列の途中から破棄して先頭からそこまでの部分は残す、というのは無理なんでしょうか?

565 名前:デフォルトの名無しさん :03/11/20 01:45
>>564
ムリですよ。とりあえず、長さを切り詰めるだけなら
pointer = Cvec[i];
*(pointer + i) = '\0';
しとけば?

破棄するときは delete Cvec[i] したあとで vector からはずす。

566 名前:デフォルトの名無しさん :03/11/20 01:46
いちおー効果も
delete [] Cvec[i]

567 名前:560 :03/11/20 01:50
>>565
>>566
ありがとうございます。
そうしてみます。

568 名前:デフォルトの名無しさん :03/11/20 01:52
>>564
vector 使ってるなら resize() で終わりだが.

569 名前:デフォルトの名無しさん :03/11/20 01:53
メモリは解放しないけどな.

570 名前:デフォルトの名無しさん :03/11/20 01:53
そんなに切りつめたいなら、
Cvec[i] = realloc(Cvec[i], j);
おっとnewは使っちゃだめよん。

571 名前:デフォルトの名無しさん :03/11/20 06:25
>>1.1倍とか、1.2倍とか、お前らC++の何を使っているんだ、と。
けど、一般ソフトの規模って、C時代もC++時代も大して変化ないよね?
例えばMIFESだとか、MS-DOS時代からあったけど
機能としては劇的な差というのはない。おそらくC++でリライトしてるにも
かかわらず。

MIFESに限らず、他のソフトもそんな感じ。一太郎forWinだとかも、
DOS時代と大差ないし。


572 名前:デフォルトの名無しさん :03/11/20 06:39
このスレ読んで、思った疑問。

C++がもっとも活用された、
もしくはC++でなければ、現実的に完成しなかったであろう
プロダクトってあるのか?

Cであれば、腐るほどあるのだが・・・


573 名前:デフォルトの名無しさん :03/11/20 07:12
>>571
> 機能としては劇的な差というのはない。おそらくC++でリライトしてるにも
> かかわらず。

「リライト」で機能が追加されるわけ無いだろ。

574 名前:デフォルトの名無しさん :03/11/20 07:23
おそらくC++でコンパイルしただけで、C++の機能を積極的に利用しているわけではないと思う。

575 名前:デフォルトの名無しさん :03/11/20 07:26
Cで巨大なプロダクトを成し遂げた人(組織)ほど、
C++の機能には懐疑的になり、"Effective"な利用は遅れるのではないか?

576 名前:デフォルトの名無しさん :03/11/20 08:10
新しい道具の使い方を覚えるのが嫌いな人っているからね。
C++は変な言語だし。

うちの会社にもいるけど、Cで十分だと思っているならそれでいいじゃん。
Cに不満がない人間がCを使いこなせてるとは思わないけど。

577 名前:デフォルトの名無しさん :03/11/20 08:18
そいつらのせいでC++を何時までたっても使用できないんすけど。
C++は確かに変な言語だけど、Cよりかはいい。


578 名前:デフォルトの名無しさん :03/11/20 09:41
>>572
Microsoft Office, Internet Explorer, ...

あれ COM の塊だから,書く気になれば C で書けないこともないが,C++ の方が
圧倒的に楽.

579 名前:デフォルトの名無しさん :03/11/20 10:02
そうだな。COMは使用だけでも、
lpObj->lpVtbl->Func(lpObj, Arg1, Arg2);
とかいろいろ面倒だからなぁ。

580 名前:デフォルトの名無しさん :03/11/20 10:05
M$はまともなコンパイラ作れと言いたい

581 名前:デフォルトの名無しさん :03/11/20 15:00
>>579

タイプライブラリから自動生成されるヘッダファイルがあれば、some->Method(foo, bar) を
C から SomeObject_Method(come, foo, bar) みたいに使えるマクロが定義されるんで、
そこまで使いにくくはならないと思う。

582 名前:デフォルトの名無しさん :03/11/20 17:10
並を食べるときは吉野家、大盛りを食べるときは松屋にしています。


583 名前:デフォルトの名無しさん :03/11/20 19:04
_UNICODEが定義されているかどうかで
std::stringとstd::wstringを切り替えるようなものは用意されてないんでしょうか?

584 名前:デフォルトの名無しさん :03/11/20 20:09
>>580
VC6 の時代はともかく VC7.1 は,かなりまともだと思うぞ.

585 名前:デフォルトの名無しさん :03/11/20 20:38
C++の規格を完璧に満たすコンパイラって存在するんですか?

586 名前:デフォルトの名無しさん :03/11/20 20:49
>>583
自分で定義しる

587 名前:デフォルトの名無しさん :03/11/20 21:03
>>586
typedef std::basic_string<TCHAR> tstring;
とすることにしました。

588 名前:デフォルトの名無しさん :03/11/20 21:12
// Aはクラス
A a1;
A a2;
A a3;

と書いた場合、VC++6.0ではこれらが破棄される順番は
構築の逆順(a3→a2→a1)になりました。
このことはC++の規格として保障されているのでしょうか?

589 名前:デフォルトの名無しさん :03/11/20 21:35
されてる

590 名前:デフォルトの名無しさん :03/11/20 22:00
>>587
coutうまくいってる?

591 名前:デフォルトの名無しさん :03/11/20 22:38
>>590
問題ないようです。VC++6.0標準STL、非UNICODEで確認。

592 名前:588 :03/11/20 22:42
>>589
ありがとう

593 名前:デフォルトの名無しさん :03/11/20 23:01
>>588
規格票もってないだろ?
・金がない ・・・そりゃお気の毒
・脳がない ・・・氏ね

594 名前:デフォルトの名無しさん :03/11/20 23:43
>>593
規格「票」だとプププ

595 名前:デフォルトの名無しさん :03/11/21 00:09
>>594
JIS 用語だと、それが正解だったりする。

596 名前:デフォルトの名無しさん :03/11/21 00:19
>>593
金なんか無くても、これで十分だろ。
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

597 名前:デフォルトの名無しさん :03/11/21 00:24
>>591
そりゃ非 UNICODE なら cout でエラーでないの当たり前じゃ。
tstring が string と同じになるんだから。
UNICODE なら tstring が wstring と同じになるから、
wcout を使わないといけなくなる。
だから、

#ifdef _UNICODE
std::wostream& tcout = wcout;
#else
std::ostream& tcout = cout;
#endif

とか汁。

598 名前:デフォルトの名無しさん :03/11/21 00:37
>>597
591じゃないけど、勉強になった。ありがとう。

599 名前:デフォルトの名無しさん :03/11/21 02:27
>>596
氏ね...っていいたいところだけど、
最近の値段はいくらなんでも高すぎるので、
ISO、氏ね。

600 名前:591 :03/11/21 02:30
>>597
coutもUNICODEで変えなきゃならんのか…
まぁ今回はGUIアプリだからいいけど。

601 名前:デフォルトの名無しさん :03/11/21 03:21
UNICODE の切り替えが必要になるのは
大抵 GUI というか、Windows プログラミングの時だから、
別に tcout 作る必要性が出てくる状況は殆どないと思うけどね。
マイナーな COM とか使ってると A/W のどちらか片方しか使えないことがあるけど、
そうでもなければ態々こんな切り替えを気にする必要性はない。

602 名前:デフォルトの名無しさん :03/11/21 04:01
やっぱさ、C++って大して効率上がってないよ。
Cで書かれたソースをC++で書き直したくなる衝動ってのは
5〜10年前は、みんな躍起になってたけどさ、
書き換えてみて大して変わらなかったもん。

当社比 +20%ってとこかな。

オブジェクト指向って、C言語のころから存在してたものだし
プロならそのようなワークをしていた。

どちらかというと、ジェネッリク(STLのようなテンプレートライブラリ)
のほうが、C++を使うありがたみとして大きい。

このスレの住人のみんなって、例えばC++のコードを月間、何行くらい
書いてるの?

603 名前:デフォルトの名無しさん :03/11/21 05:27
>>601
ですね。
あえて言うなら ofstream とか ifstream のファイル名のところが UNICODE になる版が欲しいかも。

604 名前:デフォルトの名無しさん :03/11/21 11:49
>>602
> 書き換えてみて大して変わらなかったもん。

書き換えただけで何がどう変わることを期待してるの?

605 名前:デフォルトの名無しさん :03/11/21 17:41
stringとvectorを使うだけで俺は幸せ。

606 名前:デフォルトの名無しさん :03/11/21 18:44
例外も便利だ

607 名前:デフォルトの名無しさん :03/11/21 18:51
for_each copy replace accumulate ... アルゴリズム便利

608 名前:デフォルトの名無しさん :03/11/21 19:04
map,set,list便利

609 名前:デフォルトの名無しさん :03/11/21 20:04
std::auto_ptr、boost::shared_ptr……スマートポインタ便利便利

610 名前:デフォルトの名無しさん :03/11/21 20:10
main()の最後にreturn 0;を自動的に書いてくれる・・・・便利便利

611 名前:デフォルトの名無しさん :03/11/21 21:25
void main() も使える・・・・便利便利

612 名前:デフォルトの名無しさん :03/11/21 21:42
605〜611

やっぱ、STL頼みのようだな。
で、それら便利ツール使っても、劇的には便利にならなかった。
C++への移行コストは、それほど高くなかったけど
だとしても、それに見合うメリットがユーザーに降り注いでない
気がする。

以上



613 名前:デフォルトの名無しさん :03/11/21 21:48
そりゃあんたがC++的なプログラミングをしてないだけじゃないか。

614 名前:611 :03/11/21 21:49
>>612
ボケにボケ返しされた。
_| ̄|○

615 名前:デフォルトの名無しさん :03/11/21 21:51
ポリモーフィズムでプログラムが楽チン

616 名前:デフォルトの名無しさん :03/11/21 21:56
>>612が自分のアホさ加減を自慢していますが、どうしましょう。

617 名前:デフォルトの名無しさん :03/11/21 22:30
ポリモーフィズム
コンストラクタ、デストラクタ
アクセス制限
参照
整数定数の静的リンケージ化+配列サイズ指定可
関数の途中や for の ( ) の中などで変数宣言可
インライン関数
テンプレート
STL
例外

618 名前:デフォルトの名無しさん :03/11/21 23:17
クラスの設計がうまくいくとちょっとうれしい

619 名前:デフォルトの名無しさん :03/11/22 00:42
>>612が自分のアホさ加減を自慢していますが、どうしましょう。
↑荒れるから止めろ、抵学歴厨が。

620 名前:デフォルトの名無しさん :03/11/22 00:42
>>618
Bjarneしく同意

クラス化することにより注意点が増えるばかりで逆効果な
ヘボクラスが世の中多すぎるし自分も書いてしまいがち

完璧に隠さなければならないことはいいんだが
逆に隠してはならないことを
もっとうまく分けられる方法がないものかとよく思う

621 名前:デフォルトの名無しさん :03/11/22 01:57
>>クラスの設計がうまくいくとちょっとうれしい
はげ藁同。うむうむ分かる!
でも、オナニーに似た感覚でもあるんだよな。出来上がったものの品質には
なんら変化がないことも・・・



622 名前:デフォルトの名無しさん :03/11/22 05:05
>>619
学歴コンプレックス丸出しでなに興奮してんの?w

623 名前:デフォルトの名無しさん :03/11/22 07:55
>>620
> Bjarneしく同意
わらた

624 名前:デフォルトの名無しさん :03/11/22 07:56
cppllの連中、キモイ香具師おおすぎ
いつ初心者をぶったたこうか、うずうずしてるやつとかいるし。
脱退しますた。

ノシ

625 名前:デフォルトの名無しさん :03/11/22 09:03
>>624
最近なんかあったっけ?

626 名前:デフォルトの名無しさん :03/11/22 09:11
エビステーメーとか?

627 名前:デフォルトの名無しさん :03/11/22 09:53
うーん…
質問の内容をだす前後で、うざい文章がでる時があるけど
(へりくだり杉)
まぁ礼儀のうちじゃ?

628 名前:デフォルトの名無しさん :03/11/22 10:35
確かにcppllはキモイね

629 名前:デフォルトの名無しさん :03/11/22 11:15
>>628
肝委。非常に閉鎖的だよな。まあ見てるけど。
ここのスレの方がまだ有意義。にたようなもんだけど。

エピって、初期のころ2ch嫌いって言ってたのに、
一時期2ch語使いまくってたよな。そういえば。

630 名前:デフォルトの名無しさん :03/11/22 11:30
>>602

いまさら蒸し返すほどのコトじゃないけど、ひょっとして論理的な思考ってのを誰からも教えてもらってないのかと思うと
ちょっとかわいそうになってきたので、ちょっとフォローを。単なる煽りのつもりで書いたんだったらごめんね。

僕はC++マンセー派だけど、別にC派は否定しないので、あくまでも内容ではなくて、文章力と論理力についてのコメントです。

> やっぱさ、C++って大して効率上がってないよ。

効率ってのは開発効率のことだよね?
開発効率って観点だと、躍起になって書き直すってこと自体あんまりしないと思うんだけど、どう?

> 当社比 +20%ってとこかな。

20%も上がっているなら非常に効率がいいと思うんだけど。他のところと論点が違うのかな?


631 名前:デフォルトの名無しさん :03/11/22 11:30
>>602

> オブジェクト指向って、C言語のころから存在してたものだし

オブジェクト指向の優位性とC++の優位性は関係ないと思う。
C++をオブジェクト指向開発をしやすくする言語だと思えば少なくともCには劣らないと思うんだけど。

> どちらかというと、ジェネッリク(STLのようなテンプレートライブラリ)

ここも意味がよくわからないんだけど。
・オブジェクト指向開発はもともとしている。
・ジェネリックプログラミングのほうが便利。
・C++はそんなに開発効率が高くない。
ってなにか関係がある?

> このスレの住人のみんなって、例えばC++のコードを月間、何行くらい
> 書いてるの?

開発効率とコーディング量の関係がよくわからないんだけど。
タイピング量って意味なら言語によらず一定だと思うし、開発効率が高い言語ならコード量は少なくなるよね。
でもここで「月に数百行かな?」って書いても、開発効率に関してはなんの参考にもならないと思うんだけど。


632 名前:デフォルトの名無しさん :03/11/22 11:47
>>630-631

キモイ

633 名前:デフォルトの名無しさん :03/11/22 13:35
>>619=>>612 (w

634 名前:デフォルトの名無しさん :03/11/22 14:06
>>624,626-629
最近なにかあったの?なかったの?
cppll BBS のほうでも似たような書き込みがあって
具体的にどのことを言ってるのかきかれても答えねぇし、
ただの私怨厨か?

635 名前:デフォルトの名無しさん :03/11/22 15:17
わからないって言ってるヤシちゃんと読んでるのか?
たしかにキモイがboost訳などたまーーに訳にたつ両刃のr

636 名前:デフォルトの名無しさん :03/11/22 15:37
>>635
誰がわからないなんて言った?
ちゃんと読んでないのはおm(ry

637 名前:デフォルトの名無しさん :03/11/22 16:04
>>636
ちゃんと読んで欲しいなら
最後まで書k(ry

638 名前:デフォルトの名無しさん :03/11/22 16:08
(ryとかwとかキモすぎ
cppllとスラドは二大キモヲタコミュニティ

639 名前:デフォルトの名無しさん :03/11/22 16:28
つーか、cppllに初心者で足を踏み入れる者がいるのがすごいかも。

640 名前:デフォルトの名無しさん :03/11/22 16:54
cppll の話ならこっちでしれ。
http://jbbs.shitaraba.com/computer/5651/cppll.html

641 名前:デフォルトの名無しさん :03/11/22 16:54
多いときは月5000から一万行ぐらい。
Cだと作業的にオーバーフローするなぁ。
ミドルウェアとか商用のライブラリパッケージ使わんから自作多いよ。

642 名前:デフォルトの名無しさん :03/11/22 17:10
一日で1000行くらい書くけどなぁ。
#コメントなどを含む
20日毎日書くわけじゃないけどコーディング中心の月は10kじゃ利かないな。

643 名前:デフォルトの名無しさん :03/11/22 17:38
凄く初歩的な質問で申し訳ないのですが
人まとまりの処理を、ヘッダーファイルに関数として書いて
ソースからインクルードして関数を使うのと
クラスに書いて使うのとでは、どのようなメリット・デメリットがあるのでしょうか?
特に処理速度の点から考えると差はあるのでしょうか?


644 名前:デフォルトの名無しさん :03/11/22 17:41
>>643
Inside C++ Object Model という書籍を買ってきて読め.

645 名前:デフォルトの名無しさん :03/11/22 18:33
>>643
クラスにまとめるメリットは、処理のまとまりを意味付けて伝えることができること。
デメリットは、きっちりクラス分けできてないとロクでもないことになる。
処理速度の点でのデメリットは一般的には無い。

646 名前:デフォルトの名無しさん :03/11/22 19:42
>>643
>特に処理速度の点から考えると差はあるのでしょうか?
おすすめbook

C++オブジェクトモデル
内部メカニズムの詳細
S.B.リップマン 著
三橋二彩子,佐治信之,原田曄 訳
トッパン
ISBN4-8101-8101-4

647 名前:デフォルトの名無しさん :03/11/22 20:22
>>20%も上がっているなら非常に効率がいいと思うんだけど。他のところと論点が違うのかな?
その「20%上昇」とやらが良いか悪いかはキミも含めて、
主観では判断できないものでしょ?


648 名前:デフォルトの名無しさん :03/11/22 20:25
>オブジェクト指向の優位性とC++の優位性は関係ないと思う。
>C++をオブジェクト指向開発をしやすくする言語だと思えば少なくともCには劣らないと思うんだけど。
なんか、良く読むと、
上行と下行とで矛盾してるな。ひょっとして二人がかりのカキコか?


649 名前:デフォルトの名無しさん :03/11/22 20:39
cppll でなにかあったのかとの問いには返事がないままだし、
>>638 とか見てるとやっぱりただの私怨厨か。

650 名前:デフォルトの名無しさん :03/11/22 21:40
>>648
C でもオブジェクト指向をしようとすればできるが、
継承とかいろいろやろうと思うと C++ に比べてコードが汚くなってしまう。
ということ。

651 名前:デフォルトの名無しさん :03/11/22 21:50
コードが汚くなる程度ならいいが、C++ならコンパイラが弾いてくれるような
些細なバグでも自力で検出せざるをえないのが致命的だと思うんだが。

652 名前:デフォルトの名無しさん :03/11/22 21:53
>>648
いや、これはパラドックスだろ
見方によっては禿に対する煽り

653 名前:635 :03/11/22 21:54
漏れがさす「わからない」人っていうのは、
C++のことがわからないってことじゃなくて、
cppllのどこがきもいかわからない人のことね。

つまり649おまえさんの事だ。
そんなに人あおってまで、知りたい事なら、
cppll過去ログでもよめばよかろう。

cppllの雰囲気が苦手なら、参加しなきゃよし。
べつにあのメーリングリストにはいってなきゃ、
「もぐり」になるってわけでもないし。

654 名前:デフォルトの名無しさん :03/11/22 22:20
>>651
それも含めて「汚い」と言ったんだけどね。
まぁ、俺も端折り過ぎたな。

655 名前:デフォルトの名無しさん :03/11/22 22:25
>650
Cで多重継承のやり方をおしえてくらはい。

656 名前:デフォルトの名無しさん :03/11/22 22:52
>>655
struct A{};
struct B{};

struct C{/* 継承 */
struct A a;
};

struct D{/* 多重継承 */
struct A a;
struct B b;
};

657 名前:デフォルトの名無しさん :03/11/22 23:16
>>653
お前こそよく読め。誰も cppll のきもさがわからないなんて言っとらんぞ。

658 名前:デフォルトの名無しさん :03/11/23 00:01
>>655
仮想継承もできるぞ

659 名前:デフォルトの名無しさん :03/11/23 00:06
>>656
それはコンポジションでは。(敢えて誰も言わないのだろうが)

660 名前:デフォルトの名無しさん :03/11/23 00:08
>>659は勘違いをしてそうだ

661 名前:デフォルトの名無しさん :03/11/23 00:12
>>659
先生!激しく>>655嫁!

662 名前:デフォルトの名無しさん :03/11/23 00:13
>>659
ちがうよ。

663 名前:デフォルトの名無しさん :03/11/23 00:31
>>659の継承はおそらくunionだろう

664 名前:生殖活動 :03/11/23 00:47
C++なプログラマーさんは頭脳職なのでしょうか?

なぜ、幼いころにセックスをしてはいけいないのか?
http://www.so-net.ne.jp/renaikagaku/news/content/020520.html]

↑長文だけど、読んで味噌。

665 名前:デフォルトの名無しさん :03/11/23 01:21
>>660-663
なーんだ、Cかよ。まさかC++のスレにCが書いてあるとは・・・
でもメンバ関数を持ったりしたらさすがに苦しいだろ。書けない
事はないだろうが。仮想関数なんか面倒そう。

666 名前:デフォルトの名無しさん :03/11/23 01:24
>>665
>>655 ぐらい嫁よ。

667 名前:デフォルトの名無しさん :03/11/23 01:39
>>665は関数ポインタも使えない低脳かw
配列・・・いやそれは禁句だろうな

668 名前:デフォルトの名無しさん :03/11/23 01:39
>>665
gtk見たこと無いのか?

669 名前:デフォルトの名無しさん :03/11/23 01:41
>>665
いつも空気読めなくて友達の中で一人だけ浮いてるだろ。
>>650>>655>>656


670 名前:デフォルトの名無しさん :03/11/23 04:11
>>665
#include <stdio.h>

typedef struct A_ A;
struct A_ {
 int x;
 void (*foo)(const A* v);
};

void A_foo(const A* a) {
 printf("A: %d\n", a->x);
}

void A_constructor(A* a, int x) {
 a->foo = A_foo;
 a->x = x;
}

typedef struct B_ {
A a;
} B;

void B_constructor(B* b, int x) {
A_constructor(&b->a, x);
}

671 名前:デフォルトの名無しさん :03/11/23 04:12
typedef struct C_ {
B b;
int y;
} C;

void C_foo(const A* a) {
const C* c = (const C*)a;
printf("C: %d + %d = %d\n", c->b.a.x, c->y, c->b.a.x + c->y);
}

void C_constructor(C* c, int x, int y) {
B_constructor(&c->b, x);
c->b.a.foo = C_foo;
c->y = y;
}

typedef struct D_ D;
struct D_ {
int z;
void (*bar)(const D* v);
};

void D_bar(const D* d) {
printf("D: %d\n", d->z);
}

void D_constructor(D* d, int z) {
d->bar = D_bar;
d->z = z;
}

672 名前:デフォルトの名無しさん :03/11/23 04:12
typedef struct E_ {
 C c;
 D d;
} E;

void E_constructor(E* e, int x, int y, int z) {
 C_constructor(&e->c, x, y);
 D_constructor(&e->d, z);
}

void test_foo(const char* s, const A* a) {
 printf("%s::foo: ", s);
 a->foo(a);
}

void test_bar(const char* s, const D* d) {
 printf("%s::bar: ", s);
 d->bar(d);
}

673 名前:デフォルトの名無しさん :03/11/23 04:13
int main() {
 A a;
 B b;
 C c;
 D d;
 E e;

 A_constructor(&a, 10);
 B_constructor(&b, 20);
 C_constructor(&c, 30, 40);
 D_constructor(&d, 50);
 E_constructor(&e, 60, 70, 80);

 test_foo("A", &a);
 test_foo("B", &b.a);
 test_foo("C", &c.b.a);
 test_bar("D", &d);
 test_foo("E", &e.c.b.a);
 test_bar("E", &e.d);

 return 0;
}

674 名前:デフォルトの名無しさん :03/11/23 04:26
息をするのもメンドクセェ
って感じだな。

675 名前:デフォルトの名無しさん :03/11/23 04:29
ゲイラは帰っていいよ

676 名前:デフォルトの名無しさん :03/11/23 04:31
構造体をメンバーに含むと継承になるのか。

677 名前:デフォルトの名無しさん :03/11/23 04:59
だからこその C++ だな。

678 名前:デフォルトの名無しさん :03/11/23 05:23
>>676
「どうやって"模して"いるのか」って話なんだから、
微妙に成立していない点があっても、それは深く突っ込む所じゃ
ないのではないかと。

679 名前:デフォルトの名無しさん :03/11/23 05:38
C++ もコンパイルすればアセンブリ言語(マシン語)なわけだから、
極論すればアセンブリ言語(マシン語)でもオブジェクト指向は可能。
要するに言語の違いはどこまでオブジェクト指向のプログラムが組みやすいかの違いに過ぎない。

でも、実用上それはクリティカルに効いてくるんだけどね。

680 名前:デフォルトの名無しさん :03/11/23 08:13
>>679
そういったことはできてから言うね
可能、不可能の問題ではないんだよ、ボンクラ君w

681 名前:デフォルトの名無しさん :03/11/23 08:32
>>680
>>679の最後の行はまさにそう言ってるんだと思うが。

682 名前:デフォルトの名無しさん :03/11/23 09:21
>>679
て言うか、C++ → C のトランスレータがあったんだから、C で C++ の機能が実現できるのは当たり前。
(もちろん、コンパイラって言うのは C++ → アセンブリ言語/マシン語 へのトランスレータだから、アセンブリ言語でオブジェクト指向が可能なのも当たり前。)

> 要するに言語の違いはどこまでオブジェクト指向のプログラムが組みやすいかの違いに過ぎない。

FORTRAN で、多重継承を実現してみてください。

683 名前:デフォルトの名無しさん :03/11/23 10:07
全ての言語はチューリング等価であるという意味で同等の力を持つ
って誰かが言ってたよ

684 名前:デフォルトの名無しさん :03/11/23 10:21
>>682
まず、オブジェクト指向=多重継承が出来なくてはならないという
勘違いから直してはどうだ?

685 名前:デフォルトの名無しさん :03/11/23 10:26
実装はともかくインターフェースの多重継承もできないのはつらいと思うが。

686 名前:デフォルトの名無しさん :03/11/23 10:30
>>683
そりゃそうだ。
例えばでかい配列作ってそこで仮想機械動かすと言うアプローチはありうる。

>>684
別にオブジェクト指向 = 多重継承ができること と思ってるわけじゃないよ。
単に、>>655 に倣っただけだよ。

で、あんたは「何ができればオブジェクト指向ができる」と言えると思ってるんだ ?
で、それは FORTRAN で実現できるのか ?

687 名前:デフォルトの名無しさん :03/11/23 12:44
>>673
なるほど、thisの代わりに自分のアドレスを持たせればいいのか。

688 名前:デフォルトの名無しさん :03/11/23 12:47
>>687
新しい勘違いですか?

689 名前:デフォルトの名無しさん :03/11/23 13:26
>>688
だってC++なら不要な&aとか&bという引数がことごとく付いてるじゃん。

690 名前:デフォルトの名無しさん :03/11/23 15:04
>>673
それだと既定クラスのインターフェース経由で、派生クラスのメンバを触れなくなる。

struct Base1 { virtual void add() = 0; };
struct Base2 { virtual void dec() = 0; };
struct Deriv : public Base1, public Base2 {
  int n_;
  void add() { ++n_; }
  void dec() { --n_; }
};

void func(Base2* p) { p->dec(); }

Deriv d;
func(&d);

たとえば、こんな状況を考える。func() 関数中では p は Deriv の先頭ではなく、
Deriv 中に含まれる Base2 部分オブジェクトの先頭を指す必要がある。一方、
Deriv::dec() が呼ばれた直後には this ポインタは Deriv 先頭を指してる
必要がある。

その調整も自前でやらないと。

691 名前:デフォルトの名無しさん :03/11/23 19:51
>>682
>FORTRAN で、多重継承を実現してみてください。

だから、やればできるよ。

できないのはキミくらいのものだろう。
多重継承とは : と , を使うことという理解では不可能だからだ。


>「何ができればオブジェクト指向ができる」と言えると思ってるんだ ?

データ構造とサブルーチンを、意味づけに基づいてグループ化すること。
継承は付加的な考え方で、オブジェクト指向の本質ではない。

従来製品に上位互換の新製品を作ること、それが継承だ。
複数の従来製品に上位互換の新製品を作ること、それが多重継承だ。
どうやって実現しているかという手段の詳細は本質ではない。

繰り返すが、FORTRANならFORTRANで、できないのはキミだけだ。

692 名前:デフォルトの名無しさん :03/11/23 21:32
>>691
> だから、やればできるよ。
コード示さないと説得力ゼロだぞ。

693 名前:デフォルトの名無しさん :03/11/23 21:43
>>692
そうかもしれんが、ここは C++ のスレなんだからそれ以上は他所でやれ。

694 名前:デフォルトの名無しさん :03/11/23 22:28
>>692
ニホンゴワカリマスカ?

>複数の従来製品に上位互換の新製品を作ること、それが多重継承だ。
>どうやって実現しているかという手段の詳細は本質ではない。

695 名前:デフォルトの名無しさん :03/11/23 22:53
C++ だと多重継承時のオフセット調整問題は、

1. オフセットを調整したうえで実際の関数を呼び出す thunk と呼ばれる関数を
 コンパイラが自動生成する
2. オフセット調整値を仮想関数テーブル (vtbl) に記録しておく

いずれかの手法を用いるのが一般的。どちらもコンパイル時に解決する
アプローチだが、まったく別の手法として個々のインターフェースに
固有の ID 値を割り振り、インスタンス側に ID を渡すとオフセット
調整を済ませたポインタを返す関数の実装を強制するっつーのもある。
(Win32 で使われている COM 方式)

実行時効率は 1, 2 最後に COM 方式。プログラマから見た利用の手間は
1 = 2 で、COM 方式はかなり面倒。Microsoft もそれは分かっていて、
COM では ID 値の管理のためにツール・ライブラリを提供した上で、
さらに言語毎とのサポートも提供している。

そこまでやらないと、現実問題として使い物にならんよ。

696 名前:デフォルトの名無しさん :03/11/23 23:13
>>691
例えば、
> データ構造とサブルーチンを、意味づけに基づいてグループ化すること。
をやろうとしたら、サブルーチンをなんかの方法でデータと結びつけることが必要だと思う。
C なんかだと、関数ポインタでやってるけど、最近の FORTRAN は関数/手続きポインタが使えるようになったのか ?
もしそうなら、俺の無恥と言うことで忘れてくれ。
また、関数/手続きポインタなんかなくても実現できると言うなら、その手段を晒してくれ。

697 名前:デフォルトの名無しさん :03/11/23 23:16
FORTRAN なら、配列を構造体とみなして
>>670-673 と同じようなことをすればいけるね。
関数の呼びわけをする関数を用意して、
どの関数を呼ぶかを示すインデックスを保持しとけば
ポリモーフィズムも実現できる。
嫌んなるほどメンドクセェが、できないわけではない。

698 名前:デフォルトの名無しさん :03/11/23 23:25
>>697
>>690 の問題が解決してないぞ。

699 名前:デフォルトの名無しさん :03/11/23 23:28
>>698
もう少し考えてからものを言ったほうがいいと思います。

700 名前:デフォルトの名無しさん :03/11/23 23:33
>>696
関数ポインタがどうしたって????
多態ならswitchでもできるぞ

701 名前:デフォルトの名無しさん :03/11/23 23:34
>>698
実装したけりゃ自分で勝手に実装すりゃええやろ。
もう、そこまでやってられんわ。

702 名前:やねうらを氏はどう? :03/11/24 00:18
http://www.sun-inet.or.jp/~yaneurao/nlog/

一見、シモネタ話のようで
氏のページはC++、JAVAなどの弱点と長点を客観的な視点で述べ
とても参考になるTOPICが豊富だと思う。

C++相談といえば、まずは氏のページへ足を運ぶことを強く
お奨めする。


703 名前:デフォルトの名無しさん :03/11/24 00:22
>>702
その名は禁句だ。

704 名前:デフォルトの名無しさん :03/11/24 00:26
>>702
きもい。

705 名前:デフォルトの名無しさん :03/11/24 00:36
>>700
そもそも、歴史的には switch - case をソースコード中にばら撒くと
保守性が落ちる、どうする? ってことで多態が出てきたんじゃ?

706 名前:デフォルトの名無しさん :03/11/24 00:38
>>705
そうだけど、何か?

707 名前:デフォルトの名無しさん :03/11/24 00:47
それでは「多態できる」とは言えない気が。

708 名前:デフォルトの名無しさん :03/11/24 00:53
>>707
気のせいだ。もう寝ろ。

709 名前:デフォルトの名無しさん :03/11/24 00:56
そこかしこで、たまに聞きますね、彼の名前。

エピステーメー氏もやねうらお氏の書籍を薦めていた。
国内でのC++の普及に最も貢献している人の一人では?


710 名前:デフォルトの名無しさん :03/11/24 01:08
キャラはイタいかもしれんし、たまに変なことも言うけど、
まともなことも沢山言ってるしな。
まともと思ったところだけを拾い聞きしときゃええっしょ。
むしろ、もっとイタい信者やアンチがいる方が困りもんだな...。

711 名前:デフォルトの名無しさん :03/11/24 01:11
国内で最初に、
STLの必要性というか、噛み砕いた説明をしたのも、うらお氏だったかと。

C++まわりのネタなら、うらお氏のHPにたくさんあるんで、
とりあえずここで質問する前に、FAQがわりにチェックすると良いかも。


712 名前:デフォルトの名無しさん :03/11/24 01:14
ネタはもうお腹いっぱいだって……

713 名前:デフォルトの名無しさん :03/11/24 01:17
mapやmulitimapにて
iterator を順にたぐってる最中に、ある条件を満たしてeraseをかけたとき
そのiteratorは無効になってしまうのだろうか?

714 名前:デフォルトの名無しさん :03/11/24 01:21
うらお信者が混ざりこんだようだな。

715 名前:デフォルトの名無しさん :03/11/24 01:21
delete this;ってやっていいの?

716 名前:デフォルトの名無しさん :03/11/24 01:21
つまらんギャグ書き散らしてしょーもないキャラだとは思うが、
抑えるべき要所はしっかり抑えているというか、
C++の近代的な機能を真っ先に実際に使ってみて、その落とし穴や
実際にぶつかる具体的な問題を提示した点で高く評価できると思うな。


717 名前:デフォルトの名無しさん :03/11/24 01:23
BM98の作者だよね?KONAMI相手にいろいろ揉め事があったようだが?

718 名前:デフォルトの名無しさん :03/11/24 01:27
>>715
いいよ。delete this;した後にメンバ変数に触るのはダメだよ

719 名前:デフォルトの名無しさん :03/11/24 01:28
あと仮想関数も呼んだらダメ。

720 名前:デフォルトの名無しさん :03/11/24 01:33
>>716
> C++の近代的な機能を真っ先に実際に使ってみて
古いって。英語読めるプログラマは、とっくに CUJ とか Modern C++
Programming, Gems などで情報を仕入れて試してる。

自分でやねうらおと同じ情報リソースにアクセスできないようだと、
先が暗いぞ。

721 名前:デフォルトの名無しさん :03/11/24 01:41
>>719
ちゅーか、static でないメンバ関数は全部呼んじゃダメ。
static でないメンバ変数を使ってるからこそ
static なメンバ関数にしてないわけだし。

>>715
メンバ変数に触るなって、そんなん当たり前だし、そんなことしないよ、
と思うかもしれないけど、
コールバックする場合には気づきにくいこともある。

void Foo::foo() {
 delete this;
}
void Foo::bar() {
 m_hoge.callback(this);
 cout << m_y << endl; // 下の m_x を表示するコードが無くても、ここでエラーが発生
}
void Hoge::callback(const Foo* f) {
 f->foo();
 cout << m_x << endl; // foo で f が破棄されるので f.m_hoge も破棄されており、ここでエラーが発生
}

722 名前:デフォルトの名無しさん :03/11/24 02:05
>>715
そのオブジェクトが必ずnewで生成されてる必要もある。
必ずnewでないと生成出来ないようにもできる。

723 名前:デフォルトの名無しさん :03/11/24 03:48
class A
private:
 A() { ... }
public:
 static A* create() { return new A; }
};

724 名前:デフォルトの名無しさん :03/11/24 04:46
>>711
トップページから見る気が失せたよ。。。

725 名前:デフォルトの名無しさん :03/11/24 05:02
>>トップページから見る気が失せたよ。。。
中身を見ろよ。

726 名前:デフォルトの名無しさん :03/11/24 05:06
○○言語でオブジェクト指向はできるか?
って話になるとなぜ変換できるかどうかの話になるの?

727 名前:デフォルトの名無しさん :03/11/24 05:06
>古いって。英語読めるプログラマは、とっくに CUJ とか Modern C++
>Programming, Gems などで情報を仕入れて試してる。
とりあえず、713のイテレータ絡みの質問に答えてやれよ。


728 名前:デフォルトの名無しさん :03/11/24 05:20
>>714
奴がきもいのは奴のHPとか見に行かなけりゃ済む話だけど、
きもい信者はどうしたらいいもんでしょう?

貢献度や人格を考えたらエピたんが叩かれた時にもう少し擁護する奴がいてもいいとは思うけど、
奴の信者はあきらかにきもい。・・・本人が信者を演じてるのか?

729 名前:デフォルトの名無しさん :03/11/24 05:56
いや、キモいか否か?の問題ではないのだが・・・。
なんか、こうピント外してる人、多いね。休日だから頭も休めてるのかな?


730 名前:デフォルトの名無しさん :03/11/24 07:02
eraseしたiteratorって無効なのでは?たしか

731 名前:デフォルトの名無しさん :03/11/24 09:19
アンチも度が過ぎると信者とキモさは変わんないよ。
注意だ。

732 名前:デフォルトの名無しさん :03/11/24 09:56
>>722
>必ずnewでないと生成出来ないようにもできる。

漏れは715じゃないんすけど、、
More Effective C++ にあるコンストラクタで例外とばすやつ?
new Foo [x] がいまいち合理的に解決できなくて悩み厨。

new Foo [x] で生成したオブジェクトの場合 delete this は
危険な香りがするんだけど、、。

733 名前:デフォルトの名無しさん :03/11/24 10:11
>>732
>723

734 名前:732 :03/11/24 11:15
>>733
気づかなかった。。(よく見ろ>漏れ)
ありがとう。

735 名前:デフォルトの名無しさん :03/11/24 12:22
>>727
Effective STL に、そのものずばりの解答があるぞ。確か Item 9 だったと
思うが。

vector, deque では erase したら iterator は全て無効になる。それ以外
では erase したオブジェクトをさしていた iterator は無効になるが、
それ以外のオブジェクトをさしていた iterator は依然として有効。

736 名前:デフォルトの名無しさん :03/11/24 12:38
型Tに対して、
 &T(...);
という式は有効なのだろうか?

5.2.3.2 によると、 T(...) は右辺値であり、
5.3.1.2 によると、演算子 & のオペランドは左辺値でなければならない。
この二つを見る限り、無効だと思うのだが、
g++(3.3.1)では"warning: taking address of temporary"
ということで、警告止まり。

737 名前:デフォルトの名無しさん :03/11/24 13:05


738 名前:デフォルトの名無しさん :03/11/24 13:09


739 名前:デフォルトの名無しさん :03/11/24 13:26
 

740 名前:デフォルトの名無しさん :03/11/24 13:52
>>738
じゃあ「age」と。

741 名前:デフォルトの名無しさん :03/11/24 15:21
STLが新種のOTLに見えたよママン・゚・(ノД`)・゚・
漏れもうダメだ吊ってくる…

742 名前:デフォルトの名無しさん :03/11/24 15:41
>>741
OTLって何? C++と関係あるもの?

743 名前:デフォルトの名無しさん :03/11/24 15:52
>>742
_| ̄|○

OTL

744 名前:デフォルトの名無しさん :03/11/24 16:24
>>741-743
なるほど。STLは象が鬱になってるみたいだな

745 名前:デフォルトの名無しさん :03/11/24 17:38
>古いって。英語読めるプログラマは、とっくに CUJ とか Modern C++
>Programming, Gems などで情報を仕入れて試してる。
とりあえず、713のイテレータ絡みの質問に答えてやれよ。
-----------------------------------------------------
やねうらお氏のページに、EffectiveSTLよりも詳細かつ具体的な
解答が掲載されている。
erase()が削除した次のiteratorを返す仕様になっていることが望ましいが
C++標準委員会では、パフォーマンスに問題があるとし、erase()の
返却はvoidである。したがって、eraseした場合は、また最初からiterator
を回さねばならない。

しかし、

vc++6.0やvc++.netの実装では、eraseは次に有効なiteratorを返却する
仕様になっている。

STLPortを含む標準STLと、VC++付属のSTLとで、このあたりに大きな仕様差
があることを、やねうらお氏は指摘している。
http://www.sun-inet.or.jp/~yaneurao/cppmaniax/chap0004.html





746 名前:デフォルトの名無しさん :03/11/24 17:54
やね信者だー
たすけてー

747 名前:デフォルトの名無しさん :03/11/24 19:48
>>745
なにが言いたいのかよくわからないんだけど。
やねがじゃなくて、745が。

748 名前:デフォルトの名無しさん :03/11/24 22:25
C++を初めて間もない入門者なんですが...

テンプレートってやつを使おうと思って、
hoge.hppで

template <class T>
class fraction{
T numerator, denominator;
double value;
public:
fraction (T numerator_, T denominator_);
};

とし、hoge.cppという別ファイルで

#include "hoge.hpp"
template <class T> fraction<T>::fraction(T numerator_, T denominator_)
{
numerator = numerator_;
denominator = denominator_;
}

とコンストラクタを作りました。



749 名前:デフォルトの名無しさん :03/11/24 22:25
そしてmain関数のファイルで

#include "hoge.hpp"

int main (void)
{
fraction<int> frac(1, 1);
return 0;
}

としてg++でコンパイルすると、
"fraction<int>::fractionがundefined referenceです"
と怒られてしまいます。

テンプレートにしなかったり、hoge.cppをhoge.hppに含めてしまうと
上手くコンパイル/動作するのですが...

よろしくお願いします。

750 名前:デフォルトの名無しさん :03/11/24 22:29
>>748
> とコンストラクタを作りました。

作られるわけないだろ。
どんな型かもしれないのに、どうやってコード生成するんだよ。

それは、テンプレートの定義だけだから、hoge.hpp に入れないと当然ダメだよ。


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