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


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

C++相談室 part30
751 名前:デフォルトの名無しさん :04/05/27 07:59
コンストラクタに初期化子があるなら、
デストラクタにも同様の状態があるべきだ。

あれ、デストラクタ呼び出し中って仮想関数どうなるんだっけ

752 名前:デフォルトの名無しさん :04/05/27 10:01
初期化子なしでコンストラクタで代入すると
先にデフォルトコンストラクタが呼ばれてから
代入演算子が呼ばれるので無駄。
代入でも問題ないのはPODときぐらいだな。

753 名前:706 :04/05/27 10:46
>>710,>>711,>>712
coreファイル吐かないし、gdb使ったら挙動が変わったよママン。
素直にトレースしてみた。おまいらありがとう。

754 名前:デフォルトの名無しさん :04/05/27 10:47
>>749
それに突っ込まなかったのは、単なるtypoだと思ったから。
どうせエラーになるんじゃないか? 試してないから知らんけど。
問題の本質は初期化の仕方だしな。

755 名前:デフォルトの名無しさん :04/05/27 10:52
>>751
何が言いたいのか、何を聞きたいのかわかりません。
デストラクタの働きをご存知ないような書き方に見えますが。

756 名前:デフォルトの名無しさん :04/05/27 10:58
おっさんのジョークだと思われます

757 名前:720 :04/05/27 11:01
>>754
その通りです。おれが悪かった。正しくは

MyClass::MyClass():
my_inta(10),my_intb(20)
{
}

758 名前:744 :04/05/27 11:27
そんなにいぢめないでくれ。
初期化子の書き方知らないなんて思いもしないから、
「こんな書き方」っていうのがtypoじゃないって思ったんだよ…orz

759 名前:デフォルトの名無しさん :04/05/27 12:12
boost::mplつかうと一気に実行ファイルサイズが10倍に?!

mplつかってたら、不自然にexeのサイズが大きくなる。
アセンブラで追っかけても確かにコードは最適化で正しく消えている。
どうやら、mplで組み合わせたクラスにvirtual関数が含まれている為、
type_info用(?)のやたら長いクラス名(200文字)が組み合わされた分だけ
exeに含まれた模様。

type_info使ってないんだから最適化してよ...orz

760 名前:デフォルトの名無しさん :04/05/27 12:43
RTTIをoffにすればいい

761 名前:759 :04/05/27 13:21
dynamic_castは使いたいんだよう。


762 名前:デフォルトの名無しさん :04/05/27 13:48
じゃあ、内部でtype_info使われてるんだからあきらめろ

763 名前:671 :04/05/27 17:29
>>684
遅レスになりましたが
はっきりわかりました
ありがとうございます

764 名前:デフォルトの名無しさん :04/05/27 18:00
>>720の書き方で配列の初期化はどう書くの?


765 名前:デフォルトの名無しさん :04/05/27 18:38
仮想基底クラスと非仮想基底クラス
を継承したときの
アップキャストとダウンキャストは
どういう風に実行されるのですか?

なぜ仮想基底クラスからダウンキャストは
できないのでしょうか?

766 名前:デフォルトの名無しさん :04/05/27 19:52
多重継承を使わない(ようにしている)から知らないなぁ。
仮想関数や仮想デストラクタと同じく、基底クラスをポインタで持っているんだろうと推測してみる。
スレ汚し、スマン。

767 名前:デフォルトの名無しさん :04/05/27 19:59
>>765
>なぜ仮想基底クラスからダウンキャストは
>できないのでしょうか?

dynamic_castでできるよ
制限あるけど、それは仮想継承とは無関係

768 名前:デフォルトの名無しさん :04/05/27 20:08
int len = 1;
char* a = new char[len+1];
ZeroMemory(a,len+1);

std::string str = a;

delete[] a;

これを実行したらdelete[] aで落ちます。
stringはaの内容のコピーを持っているだけではないのですか?

769 名前:デフォルトの名無しさん :04/05/27 20:09
落ちませんが何か?

770 名前:768 :04/05/27 20:15
気付きました。
ZeroMemory(&a,len +1)とやっていました。
すみません。


771 名前:学生 :04/05/27 23:36
フリーで使いやすいコンパイラあったら教えてください。

772 名前:デフォルトの名無しさん :04/05/27 23:44
>>771
そんな都合のいいものはありません。

773 名前:デフォルトの名無しさん :04/05/28 00:51
>>759
mplの中でvirtual使ってるクラスなんて見当たらないんですが、
問題の再現するサンプルコードかなんか、出してもらえますか?

774 名前:デフォルトの名無しさん :04/05/28 03:49
>>771
g++では不満なのか?


775 名前:学生 :04/05/28 06:49
それなんて読むんですか?
じー足す足す?

776 名前:デフォルトの名無しさん :04/05/28 06:53
>>767
なんでtypeidで型を調べながらプログラムすればいいのにそうしないんでしょう?

777 名前:デフォルトの名無しさん :04/05/28 08:27
>>775
ゲ・ペラ・ペラ です。

778 名前:デフォルトの名無しさん :04/05/28 08:38
グッピッピ

ちなみにGCCはグッシッシ

779 名前:759 :04/05/28 09:51
>>773
mplに含まれているのではなく、タイプリストから生成する
多重継承クラスのベースがvirtualを含むという意味。
作っているのがtemplateライブラリなのでsrc単位で
RTTIをoffにもできずお手上げです。しょうがないので、
多重継承クラスの変わりにタプルを生成して、関数ポインタ
で代用した。

mpl使うと基本的に型名が長くなるので、基本的にはvirtualを
絡ませるような使い方は厳しいような気がします。type_info
の実装にもよるんでしょうけど。

780 名前:デフォルトの名無しさん :04/05/28 10:07
>>767
では継承は全部仮想継承にしても問題ないように思うんですが
なぜそれは駄目なんでしょう。その理由がダウンキャストができなくなるから
と聞いたのですが。

781 名前:デフォルトの名無しさん :04/05/28 10:22
>>780
http://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/

ピンポイントで引用すると、
「仮想継承は、単一継承や多重継承よりも、インプリメントと使用のコストが格段に高くなります。」

782 名前:デフォルトの名無しさん :04/05/28 10:29
>>764
メンバ変数として配列を持つと、それを初期化するコードは書けません。
C++の仕様の穴というか、まぁC++では配列を(なるべく)使うなってことだ。
C++っぽい機能と配列を一緒に使うと、不思議なことが起こったりするから、
素人にはお勧めできない。

783 名前:デフォルトの名無しさん :04/05/28 10:34
>>782
>C++っぽい機能と配列を一緒に使うと、不思議なことが起こったりするから

思い当たる節がないのですが。
具体例をあげてみて下さいな。

784 名前:デフォルトの名無しさん :04/05/28 10:55
>>782
その発言がいかにも素人。

785 名前:デフォルトの名無しさん :04/05/28 11:01
>>783
派生クラスの配列を、基底クラスの配列(というかポインタ)を引数にとる関数に渡せちゃったりとか。
templateを使ったMPっぽいことをすると、配列が使えなかったりとか。

786 名前:デフォルトの名無しさん :04/05/28 11:09
>>782
コンストラクタから配列初期化用のメンバ関数を呼ぶのではだめなん?

787 名前:デフォルトの名無しさん :04/05/28 11:53
>>786
意味的には初期化だろうけど文法的には代入なので、POD以外の場合にオーバーヘッドがかかる。
constメンバだとconst_castする以外に手はない。

788 名前:デフォルトの名無しさん :04/05/28 12:36
constならばstatic constにすればいいじゃないか。

789 名前:780 :04/05/28 13:00
>>781
そこを読むと計算コストが増してしまうことはわかるのですが
継承の機能が制限されることはないのでしょうか?
憂鬱なプログラマのためのオブジェクト指向開発講座
という書籍の中には

仮想基底クラスを使うと副作用が発生します。
それは残念ながら、速度が遅くなるとか、サイズが大きくなるとかいう
レベルの問題ではなく、継承というメカニズムが持っている性質そのものを
スポイルしてしまいます。ここでは具体的に説明しませんが
ダウンキャストが困難になります。

というようなことが書いてあるのですが、これは
どのように解釈したらいいでしょうか

790 名前:デフォルトの名無しさん :04/05/28 13:16
>>788
はて?

791 名前:デフォルトの名無しさん :04/05/28 13:31
>>789
その書籍、古くないですか?
dynamic_castとRTTI登場以前とか。

792 名前:デフォルトの名無しさん :04/05/28 13:32
仮想基底クラスって純粋仮想関数持ってるクラスのことだっけ?

793 名前:デフォルトの名無しさん :04/05/28 13:42
>>792
ちゃうちゃう。多重継承時におじいちゃんが独りになるようにする奴。

794 名前:デフォルトの名無しさん :04/05/28 13:45
仮想継承した場合の基底クラスのことだと思ったけど。

795 名前:デフォルトの名無しさん :04/05/28 14:05
>>791
仮想基底クラスの場合って
アップキャストするとポインタをたどって
基底クラスそのものになってしまって
そのあとダウンキャストしようとしても
派生クラスの情報はどこにもなくて
ダウンキャストできないってなるんじゃないですか?
dynamic_castも必ず失敗するのでは?

違いますかね
自信はあまりないんですけど



796 名前:デフォルトの名無しさん :04/05/28 14:11
使うなこんな危なくていろんなものに依存しまくりなものを。

797 名前:デフォルトの名無しさん :04/05/28 14:14
>>795
杞憂・誤解・妄想
少しはググって勉強しれ。

798 名前:デフォルトの名無しさん :04/05/28 14:15
「憂プロ」が言ってるのは、菱形継承時の実行時曖昧検出のことかいな?
禿本の15.4.2 引用/説明はちと面倒なのでパス(w 禿本持ってたら見てみて。

799 名前:デフォルトの名無しさん :04/05/28 14:16
>>796
なんだか解らないから使わないのと、いろいろ解ってるから使わないのとではかなり違う。
あんたの書き込みは、ただ単に馬鹿っぽい。

800 名前:デフォルトの名無しさん :04/05/28 14:29
>795
いわゆるvptrが指すvtblが、まさに派生クラスの情報だろ。

801 名前:デフォルトの名無しさん :04/05/28 14:58
>799
きいたふうな言葉を使うな若造

802 名前:デフォルトの名無しさん :04/05/28 14:58
>>795
RTTI や仮想基底クラスの無い時代の多重継承でアップキャストした場合にはそうなります
(どっち側からアップキャストしたのか、プログラマ(ム)が覚えておかなきゃならない)。

仮想基底クラスの場合は dynamic_cast でRTTI 使って適切にオフセットしてくれます。

803 名前:デフォルトの名無しさん :04/05/28 15:07
>>801
それを796に言ってやらないのは、あんたが796だからか?(w
今の話題についていけないなら、黙ってな。

804 名前:デフォルトの名無しさん :04/05/28 15:22
ついていきたくないので黙ってます。

805 名前:デフォルトの名無しさん :04/05/28 15:33
ワロタ

806 名前:デフォルトの名無しさん :04/05/28 15:48
そんなに頭を痛めてまで得られるものって何なの?もっと楽に生きれば?

807 名前:デフォルトの名無しさん :04/05/28 15:52
頭痛めないと理解できないんですね、
それならC++を捨てるのが得策だと思いますが。

808 名前:デフォルトの名無しさん :04/05/28 16:33
いいじゃん、釣りとネタなんだから。
今悩んでるのは >>795 だけでしょ。

809 名前:デフォルトの名無しさん :04/05/28 17:57
多重継承なんか使う奴は莫迦です。

…とまでは言わないが、
「雪山を無礼るな!万全の体制を整えるんだ!」
とか言って連れて行かれそうになったら
「そもそも、そうまでしてその山を越える必要が本当にあるんですか?」
くらいは聞くかもなあ。

810 名前:デフォルトの名無しさん :04/05/28 18:01
ほんとプログラマって例え話好きだよなぁ。

811 名前:デフォルトの名無しさん :04/05/28 18:05
>>810
論理的同一性と家

812 名前:780 :04/05/28 18:14
「憂鬱な・・・」は1998年5月30日に初版発行
そして「独習C++改訂版」は1999年4月30日に初版発行で
独習C++にはdynamic_castがすでにのっているので
1998年6月以降にdynamic_castが出てきており
「憂鬱な・・・」の情報は古いってことでいいのでしょうか?

結論としては仮想継承は計算コストが増大すること以外は
通常の継承と変わりないってことでいいでしょうか?

813 名前:780 :04/05/28 18:21
>>800
vptrがあるのは仮想継承でできた派生クラスで
継承されたほうの基底クラスにはないですよね?
念のため確認

814 名前:780 :04/05/28 19:22
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp;
Father *fap, fa;
Mother *mop, mo;
Child ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
fap = &ch; cout << typeid(*fap).name() << endl;
mop = &ch; cout << typeid(*mop).name() << endl;

return 0;
}

これを実行すると
GrandParent
GrandParent
GrandParent
Father
Mother
となりました。 RTTIが派生クラスのものになってくれません。

815 名前:デフォルトの名無しさん :04/05/28 19:29
>>814
当たり前だろ。仮想基底クラスであるGrandParentはそこから派生したクラスの
情報など持ってない。

816 名前:デフォルトの名無しさん :04/05/28 19:33
>>814
GrandParentに仮想関数(デストラクタでヲケ)を追加してみ。

817 名前:デフォルトの名無しさん :04/05/28 19:43
>>814
RTTIを使うには仮想関数が必要。
つーか基底クラスとして使うクラスのデストラクタは仮想にするのが大原則だから覚えておき。

818 名前:デフォルトの名無しさん :04/05/28 20:04
近親相姦かよ。

819 名前:デフォルトの名無しさん :04/05/28 20:12
>>818
それを避けるためのvirtual。
実の親ではなく義理の親。だから兄妹に血のつながりは無いのでOK。

820 名前:デフォルトの名無しさん :04/05/28 20:22
>813
基底クラスの(隠し)メンバでなければ、
基底クラスのポインタからアクセスできんだろうが。

>819
もしかして笑うところ? 意味が解らないのだが。

821 名前:デフォルトの名無しさん :04/05/28 20:34
>>817
1行目がまっとうな理解
2行目はアフォの頭の中

822 名前:デフォルトの名無しさん :04/05/28 20:50
>>821
> 2行目はアフォの頭の中
私817じゃないけど何で?
private継承,protected継承はなしよ.


823 名前:デフォルトの名無しさん :04/05/28 21:03
>>822
まさかお前は基底クラスとして使うクラスのデストラクタは全部仮想にしてるのか?

824 名前:デフォルトの名無しさん :04/05/28 21:03
>>822
全然関係ないぞ??

>>*
struct V
{
int vm;
virtual ~V() {}
};
struct A : public virtual V { int am; };
struct B : private virtual V { int bm; };
struct C : public A, public B { int cm; };

int main()
{
C c;

V* pv;
pv = &c;
cout << pv << endl;

B* pb;
pb = dynamic_cast<C*>(pv); // これ、どう思う?
cout << pb << endl;

return 0;
}

825 名前:デフォルトの名無しさん :04/05/28 21:09
>>823
822 じゃないが、原則として公開継承する基底クラスのデストラクタは仮想に
するだろう。そうでないとアップキャストしたら大惨事確定だし。

826 名前:デフォルトの名無しさん :04/05/28 21:10
デストラクタがvirtualじゃないと困るのはポリモフったポインタをdeleteするときだったはず

827 名前:デフォルトの名無しさん :04/05/28 21:10
>>823
822 じゃないが、原則として公開継承する基底クラスのデストラクタは仮想に
するだろう。そうでないとアップキャストしたら大惨事確定だし。

828 名前:デフォルトの名無しさん :04/05/28 21:52
>>827
>原則として公開継承する基底クラスのデストラクタは仮想に
>するだろう。

繰り返さなくていいよ。
だからしないってば。

>そうでないとアップキャストしたら大惨事確定だし。

んなわけない。アップキャストしただけで大惨事ってなんだよ?

829 名前:780 :04/05/28 22:10
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ public: virtual ~GrandParent(){} };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp; Father *fap, fa; Mother *mop, mo; Child *chp, ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
fap = dynamic_cast<Father *>(gpp); if(fap)cout << typeid(*fap).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
mop = dynamic_cast<Mother *>(gpp); if(mop) cout << typeid(*mop).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
chp = dynamic_cast<Child *>(gpp); if(chp) cout << typeid(*chp).name() << endl;

return 0;
}
結果
class Father
class Father
class Mother
class Mother
class Child
class Child

GrandParentに仮想デストラクタを追加した結果うまくいきました。
教えてくれた皆さんありがとうございました。

830 名前:780 :04/05/28 22:08
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ public: virtual ~GrandParent(){} };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp; Father *fap, fa; Mother *mop, mo; Child *chp, ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
fap = dynamic_cast<Father *>(gpp); if(fap)cout << typeid(*fap).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
mop = dynamic_cast<Mother *>(gpp); if(mop) cout << typeid(*mop).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
chp = dynamic_cast<Child *>(gpp); if(chp) cout << typeid(*chp).name() << endl;

return 0;
}
結果
class Father
class Father
class Mother
class Mother
class Child
class Child

GrandParentに仮想デストラクタを追加した結果うまくいきました。
教えてくれた皆さんありがとうございました。

831 名前:デフォルトの名無しさん :04/05/28 23:09
>>828
struct Deriv : public Base {};
struct Base* p = new Deriv;

これでアウトでしょ。こういう使い方をしないのであれば、そもそも
継承ではなくコンポジションにしいた方が良いと思われ。

832 名前:デフォルトの名無しさん :04/05/28 23:11
>>831
deleteしないアフォはどうしましょうか?

833 名前:デフォルトの名無しさん :04/05/28 23:19
禅問答みたいだな

834 名前:デフォルトの名無しさん :04/05/28 23:22
>>832
どうせ、そやつのプログラムはぬるぽだろう。ほっとく。

835 名前:デフォルトの名無しさん :04/05/28 23:32
>>831
>こういう使い方をしないのであれば、そもそも
>継承ではなくコンポジションにしいた方が良いと思われ

んなこたぁない。
少なくとも世の中に、んなこたぁない例がゴロゴロしてる。

836 名前:デフォルトの名無しさん :04/05/28 23:36
>>831
polymorphicに使いたいときはそうだ。
だが実装の手間を減らすために仮想関数を持たないクラスを
public継承することもある。
例えばboost::iterator_facadeとか。


837 名前:デフォルトの名無しさん :04/05/28 23:36
>>828
Effective C++ 14項 「基底クラスには仮想デストラクタを持たせよう」を参照せよ。
これは割と常識に近いものだと思っていたが……

838 名前:デフォルトの名無しさん :04/05/28 23:41
freeしない(自粛)はどうしましょうか?
void operator delete(void*)
{
/* no operation */
}


839 名前:デフォルトの名無しさん :04/05/28 23:43
>>837
そっくり返す。
見出しだけじゃなく、本文も熟読してくれよ。

840 名前:デフォルトの名無しさん :04/05/28 23:49
>>831
追加のデストラクタがいらないので、(ほんとうにそれだけなら)セーフ。

841 名前:デフォルトの名無しさん :04/05/29 00:30
>>836
あれはクラステンプレートだから話が違う。しかも第一引数に派生クラス型を渡し、
常に

1 その派生型に static_cast<> する形でアクセスする
2 あるいはイテレータが指している要素にアクセスする

いずれかを強制する形になっており、基底クラスにアップキャストして使うことを
想定してない。

反例として挙げるには、むしろ例外的なケースだと思うぞ。

842 名前:デフォルトの名無しさん :04/05/29 00:59
> 反例として挙げるには、むしろ例外的なケースだと思うぞ。

「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

843 名前:デフォルトの名無しさん :04/05/29 01:08
> 反例として挙げるには、むしろ例外的なケースだと思うぞ。

「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

844 名前:デフォルトの名無しさん :04/05/29 01:45
>>842
何があってもデストラクタは仮想にしろ、って主張するヤツもバカだが、
「RTTI 使えない→基底クラスとして使うクラスのデストラクタは仮想にする
のが原則」って話をしてるときに、文脈無視してクラステンプレートの
話持ってくるのもアレですぜ。

845 名前:デフォルトの名無しさん :04/05/29 07:48
>「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

繰り返さなくていいよ。
だから間違ってるんだってば。

841はなぜ例外に当たるのかちゃんと説明しているだろう。
理由も言わずに「誰かが言っていたから(boostがそうしてるから)」
だけじゃあ、話は進展しないって。

846 名前:822 :04/05/29 09:08
話ふっといて,離れていたすまん.
>>823
> まさかお前は基底クラスとして使うクラスのデストラクタは全部仮想にしてるのか
Yes.私の意見は831と全く同じ.
836の「実装の手間を減らすために仮想関数を持たないクラスをpublic継承する」
ってのは気持は分かるけど,そういう時はpriavte継承かprotected継承にして,
usingを使って使用するメンバ関数を公開する方が,まだ良いと思う.

>>826
> デストラクタがvirtualじゃないと困るのはポリモフったポインタをdeleteするときだったはず
「ポリモフったポインタをdeleteしない」を自分と関わりのある全てのプログラマに守るよう徹底して廻るか,
そもそも「public継承はポリモフれて,基底のポインタからdeleteできる」のだから
デストラクタは常にvirtualにしておくか,の選択かと思うけど,私は後者だな.

1. vtableによる速度低下,サイズの増大が気になる.
2. usingするのさえ面倒臭いほどメンバ関数が多い.
3. 作ったクラスは自分だけで使うし,設計方針を2度と忘れない自信がある.
これらの条件が揃ったらデストラクタを仮想にしないと決断するかもしれない.


847 名前:デフォルトの名無しさん :04/05/29 10:04
C++のOOで細かいことぐちゃぐちゃ言うな。所詮クラシカルな仕様なんだよ。

848 名前:デフォルトの名無しさん :04/05/29 10:09
>>846
> 「ポリモフったポインタをdeleteしない」を自分と関わりのある全てのプログラマに守るよう徹底して廻るか,
選択肢としては、デストラクタを protected にするってのもアリ。いちおう。

849 名前:デフォルトの名無しさん :04/05/29 11:30
継承を推奨するクラスの場合
デストラクタ virtual
デストラクタ protected
このどちらかをしておくのが派生クラス作成者がヘボな場合でも
問題が起こりにくいクラスだろう。
ポイントは基底クラス作成者と派生クラス作成者の実力差を
カバーする必要があるか否かだと思う。ただ、俺は自分の間抜けさを
認識しているのでどちらかの手法を取る。

850 名前:822 :04/05/29 11:34
>>848
問題.
「デストラクタを protected にする」ことで以下の(3),(4)を禁止したい.
デストラクタを protected にするのはどの階層か?
なお,(1),(2)は触らぬこと.

class GrandParent {};
class Parent: public GrandParent {};
class Child: public Parent {};
int main()
{
GrandParent gp; // <- (1)
Parent p; // <- (2)
Parent *pp (new Child ());
delete pp; // <- (3)
GrandParent *gpp (new Child ());
delete gpp; // <- (4)
return 0;
}


851 名前:デフォルトの名無しさん :04/05/29 12:08
何でこう「あらゆる場合にこの方法をとるべし」と捕らえる人が多いのかねぇ……

852 名前:デフォルトの名無しさん :04/05/29 12:15
ただなにかにケチをつけたいんだよ!!

853 名前:デフォルトの名無しさん :04/05/29 12:16
原則と言う単語の意味を理解してないからそのような感じを受けるだけだよ。
もちろん何事にも例外はあるが、一部の例外を持ち出して
「あらゆる場合」と揚げ足をでっち上げた上で、その揚げ足取りを取ってるんだもんな。
反発されて当然だっての。

854 名前:デフォルトの名無しさん :04/05/29 12:18
ケチをつけたいだけなんだけど、
#include <****.h>
に誰もつっこまないのはなぜ?


855 名前:822 :04/05/29 12:22
>> 851
>何でこう「あらゆる場合にこの方法をとるべし」と捕らえる人が多いのかねぇ……
何でだろう? コードの再利用性を追求しているうちに,こうなっちゃたような気がする.
この場合はこう,あの場合はこう,っていちいち例外を考えるよりは....


856 名前:849!=848 :04/05/29 12:22
>>850
まぁ落ち着け。>>848はそういう方法もあると提示しただけだろう。

君自身も>>850みたいな何でも来いクラスのGrandParentなんか
作らないタイプのプログラマなんでしょ?多分。

インターフェース、ポリシー、実装と分けて考えるのが吉。

857 名前:849 :04/05/29 12:24
>>855を読んで気が変わった。
何でも来いクラスを作る人だったのな。ちょっとがっかり。
前言撤回。


858 名前:デフォルトの名無しさん :04/05/29 12:25
>>854
「その『役不足』の用法は間違っている」っていっつも書き込んでるの?

859 名前:デフォルトの名無しさん :04/05/29 12:30
>>858 >>853?

860 名前:デフォルトの名無しさん :04/05/29 12:33
>>インターフェース、ポリシー、実装と分けて考えるのが吉
この考えに沿った例と悪い例を提示していただけるとありがたいです。

861 名前:822 :04/05/29 13:11
>>857
私のことはどうでもいいよ.
でも,がっかりされて私もがっかり.

850は書き方が高慢だった.すみません.


862 名前:デフォルトの名無しさん :04/05/29 14:33
>>860
例えばこんな風にやるといいと自分は理解している。
//ポリシー
struct NoisyShout{
protected:
void shout(){std::cout << "いていていて!" << std::endl;}
~NoisyShout(){}
};
struct DefaultShout{
protected:
void shout(){std::cout << "いてっ" << std::endl;}
~DefaultShout(){}
};

863 名前:デフォルトの名無しさん :04/05/29 14:34
>>862
続き
//インターフェース
struct Target{
virtual void hit() = 0;
virtual ~Target(){}
};
struct NullInterface{
protected:
~NullInterface(){}
};


864 名前:デフォルトの名無しさん :04/05/29 14:34
>>863
続き
//ポリシー、インターフェースを結合する実装
template<typename S, typename I>
class Man : public S, public I{
public:
void hit(){
std::cout << "なぐられたーっ" << std::endl;
S::shout();
}
//他にもいろいろ実装があるだろう...
~Man(){
std::cout << "Man::destructed" << std::endl;
}
};

865 名前:デフォルトの名無しさん :04/05/29 14:35
>>864
続き

使い方1。
std::cout << "# 一人ずつ殴るだけ" << std::endl;
Man<NoisyShout, NullInterface> young;
Man<DefaultShout, NullInterface> middle;
young.hit();
middle.hit();


866 名前:デフォルトの名無しさん :04/05/29 14:36
>>865
続き
使い方2。
std::cout << "# まとめてぶん殴る" << std::endl;
Target* targets[2];
targets[0] = new Man<NoisyShout, Target>;
targets[1] = new Man<DefaultShout, Target>;
for(Target** i = targets; i < targets + 2; ++i)
{(*i)->hit();}
for(Target** i = targets; i < targets + 2; ++i)
{delete (*i);}

867 名前:849 :04/05/29 14:43
>>862-866
ここまで俺の書き込み。
インターフェースまでポリシーっぽく扱ったのはふさわしくないかもしれない。
実際のアプリ開発ではポリモーフィズムされるかされないか大抵決められる
はずなので、あそこまでやることは稀だと思う。
(凄く効率と汎用性を求めるクラスならやっても良いのではないだろうか。)
書いてしまったけど、叩かれないかビクビクしてる臆病者の俺…。

>>822
さっきは余計なことまで勢いで書いてしまった。
俺が勝手に期待しただけだ。悪かった。

868 名前:デフォルトの名無しさん :04/05/29 15:51
ここはEQの高いインターネッツですね。

869 名前:デフォルトの名無しさん :04/05/29 16:52
struct A
{
  virtual ~A(){};
  virtual void release()=0;
};
struct B: A
{
  virtual ~B()
  {
    cout << "~B" << endl;
    release();
  }
  virtual void release()
  {
    cout << "B::release" << endl;
  }
};
struct C: B
{
  virtual void release()
  {
    cout << "C::release" << endl;
  }
};
int main()
{
  B* p = new C;
  p->release();
  delete p;
  return 0;
}
C::releaseが呼ばれてほしいーーーーーーーー

870 名前:869 :04/05/29 16:54
あ、deleteされたきも呼ばれてほしいって意味です

871 名前:デフォルトの名無しさん :04/05/29 16:57
だせえ言語だ

872 名前:デフォルトの名無しさん :04/05/29 17:24
ダサすぎ

873 名前:デフォルトの名無しさん :04/05/29 17:56
>>869
C::~C(){ release();}


874 名前:デフォルトの名無しさん :04/05/29 18:03
デストラクト中のオブジェクトの状態を理解していれば出ない疑問だな。

875 名前:デフォルトの名無しさん :04/05/29 18:07
>>873
あほ?それをしなきゃならんのがダサいんだろ

876 名前:デフォルトの名無しさん :04/05/29 18:10
>>875
だったらC::release()を呼び出したくない場合はどうするん?

877 名前:デフォルトの名無しさん :04/05/29 18:16
>>876
けいしょうしない

878 名前:デフォルトの名無しさん :04/05/29 18:26
ねんしょうけい

879 名前:デフォルトの名無しさん :04/05/29 21:40
みなさんBoost C++ Libraryって会社でも普通に使ってます?

うちのところではだれも導入してないです。
boostのライセンスみると商用利用でも全く問題ないのに。
顧客からboost使うなといわれてるわけでもない。

boostを使うとまずい場面ってあるんでしょうか?

本も出たことだし、利用を呼びかけてみようと思ってるんですが。
http://www.kmonos.net/pub/BoostBook/


880 名前:デフォルトの名無しさん :04/05/29 21:46
外に出すプログラムの場合、
boostのコードの品質管理も自社の基準で行わないといけないから
結局位置から作る方が手間が掛からないってのが大きいんじゃ?


881 名前:デフォルトの名無しさん :04/05/29 21:47
>>879
問題は商用が *禁止* されているかどうかじゃない
もちろん禁止されていれば使わないが

882 名前:デフォルトの名無しさん :04/05/29 21:47
>>879
その本、LAOXの書籍売り場の目立つところにディスプレイされてるね。
業者さんでつか?それとも著者?(プ

883 名前:デフォルトの名無しさん :04/05/29 21:49
>>880
その理屈からいくと、当然std::hogehogeなコードも全部作っているんですね?
boostはそこらの馬の骨が作ったものじゃないですよ。

884 名前:デフォルトの名無しさん :04/05/29 21:52
>>879
なきゃ書けないってものでもないし、元々使い方を知らなきゃ使う気にもならないでしょう。
導入してないところは、それだけのところでは?

885 名前:デフォルトの名無しさん :04/05/29 21:55
懐かしいなあ
使っていいものと、いけないもの
俺もなかなか憶えられなくて

886 名前:デフォルトの名無しさん :04/05/29 21:58
↓秀和のジサクジエン

887 名前:デフォルトの名無しさん :04/05/29 22:01
>>883
そうですよね。boostは信頼のできるライブラリです。

ただboostのバグを見つけた場合って勝手に直していいんでしょうか?

888 名前:デフォルトの名無しさん :04/05/29 22:02
888

889 名前:デフォルトの名無しさん :04/05/29 22:04
>>887
sourceforgeか開発MLに投げれ。

890 名前:デフォルトの名無しさん :04/05/29 22:05
>>887
なぜ聞く? 勝手に直せよ。改造したっていいんだぞ?
本当にバグを直したなら。コミュニティかここで発表すれば喜ばれるし、場合によっては神と呼ばれるかも知れないぞ。

891 名前:デフォルトの名無しさん :04/05/29 22:06
>>879
スマートポインタや lambda あたりは普通に使ってます。

>>887
良いんじゃないの? ただ、開発元に連絡しとくと、次のバージョンで修正が
取り入れられて(自分も含めて)幸せになれると思うけど。

892 名前:戦争はじまります :04/05/29 22:07
【国際】「資源独占の恐れ」日中境界海域にガス採掘施設、欧米企業も参加−中国★4
http://news13.2ch.net/test/read.cgi/newsplus/1085826910/

【中国】(資源独占の恐れ!) 日中境界海域に施設(日本は調査予定なし)★2 [05/28]
http://news17.2ch.net/test/read.cgi/news4plus/1085792271/

中国が尖閣諸島周辺の国境付近で資源採掘を開始ししだしました
ガス採掘施設となってますが、それだけではなく

ここにはなんと、 「世界2位の規模を誇る原油」 が眠っています

そしてほとんど日本の領土側に眠っている資源が
ジュースのストローで吸い上げられるように中国に持っていかれます。

 こっから採掘吸い上げ全部中国へ
       ‖
       ‖|   
       ■|■■■■■■■■石油■■■■■■■■■■
       ■|■■■■■■■■■■■■■■■■■■■■
中国領土← | →日本領土

これがあれば日本は強力な資源大国になれます。
今の不況や失業など一気に吹っ飛ば、安全なバブルが到来します
この暴挙をみすみす許している日本政府と外務省、
国家の一大事であるにもかかわらず一切放送しないマスコミ
今声を上げないと、この国は終わるかもしれません。

893 名前:デフォルトの名無しさん :04/05/29 22:08
>>883
社内のプログラマが作るコードがboostと比較して糞コードである事の方が多いだろうけど、
品質管理を通ってしまえば社内基準は通過しているので、要件を満たしているコードと言える
boostは未来永劫要求を満たしつづけてくれるかと言えばそうではないだろ?

新規ならばboostの特定バージョンを検査して、それを導入すればいいだろうけど
普通は品質管理基準をクリアした汎用部品の蓄積があるんだから、
あえて無駄なコストをかけてまで導入する理由が無いじゃないか。

あと、std::hogehogeなんかは商用ライブラリ導入時に検査を行っているか、
メーカーと保守契約を結んでいる場合がほとんどだろ。

894 名前:デフォルトの名無しさん :04/05/29 22:15
>>893
はいはい、ほとんどねぇ。よかったですね。あなたが、そのほとんどに含まれる仕事をしていることはわかりました。
はい、では次の人、どうぞ。

895 名前:デフォルトの名無しさん :04/05/29 22:18
馬鹿じゃねーの?
boostがそんなショボイライブラリの訳ねーだろ。
ちゃんと計算されてる。角度とか。

896 名前:デフォルトの名無しさん :04/05/29 22:20
久しぶりに見たな。角度とか。

897 名前:デフォルトの名無しさん :04/05/29 22:22
boostのスレあったような気がするんだが、落ちたの?

898 名前:デフォルトの名無しさん :04/05/29 22:23
まさか、なんたらエンタープライズを店頭で買ってきてそのまま使ってたり、
gccに標準で入っている標準ライブラリをそのまま使って作った
ソフトをろくにコード検証もせずに、他所様に垂れ流してるんですか?

899 名前:デフォルトの名無しさん :04/05/29 22:23
>>897
templateスレと一緒になったんじゃなかったっけ?

900 名前:867 :04/05/29 22:28
>>899
あなる

901 名前:デフォルトの名無しさん :04/05/29 22:30
>>875
あほはお前だろ。マンドクセ。

902 名前:デフォルトの名無しさん :04/05/29 22:34
>>898
なんたらエンタープライズとboostを一緒にされても・・・

gccに標準で入っている標準ライブラリとかstd::hogehogeに
対する検証ってどの程度で行ってるんでしょうか。
全検査できる体制があるなら羨ましい限りです。

903 名前:デフォルトの名無しさん :04/05/29 22:43
おいおいprivateの理念わかってないやつ、こんなにいたのか?

904 名前:デフォルトの名無しさん :04/05/29 22:48
publicの理念も分かりませんが何か?

905 名前:デフォルトの名無しさん :04/05/29 22:49
ぱぶりっこ

906 名前:デフォルトの名無しさん :04/05/29 23:47
ifで囲まれたスコープ解決演算子付きのメソッドのあるコードがあったんだけど、
その前に、!があるんだけど、これは戻り値の否定でいいんだよね?

こんなの↓

if(!::method(,,,)){
}




907 名前:デフォルトの名無しさん :04/05/29 23:47
>>906
オーバーロードしていなければ。

908 名前:デフォルトの名無しさん :04/05/29 23:51
>>906
いい。

909 名前:デフォルトの名無しさん :04/05/30 00:00
>>906
釣りか?
operator ! でサフェースアナライズする気だろ
その手に乗るかってんだ

910 名前:デフォルトの名無しさん :04/05/30 00:06
サーフェスアナライズってなーに?

911 名前:デフォルトの名無しさん :04/05/30 00:17
上っ面だけの解析?

912 名前:デフォルトの名無しさん :04/05/30 00:24
>>910
わかんなきゃ先ずぐぐれ

http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A7%E3%82%B9%E3%82%A2%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%BA
http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=%22surface+analyze%22&lr=


・・・ヒットしねぇ。つかsurface analysisだろ?

913 名前:デフォルトの名無しさん :04/05/30 01:07
いたるところにトラップが仕掛けてあって、こんな危なっかしい言語使えねー罠

914 名前:デフォルトの名無しさん :04/05/30 01:44
>>898
今は gcc + STLport の仕事してるけど、さすがに gcc のソースコードや
newlib, STLport の詳細までは追ってないなぁ。実際に使ってみて問題が
出なければ、まぁ良いやって感じ。

別にバグがあっても人死にが出るタイプのソフトじゃないんで、そこにコスト
掛けるなら、顧客の要求に素早く対応する方にコスト掛けた方が良いっつー
判断。

915 名前:デフォルトの名無しさん :04/05/30 04:47
>>912
surface analysisって何?

916 名前:デフォルトの名無しさん :04/05/30 12:21
>>862 煽りではなく純粋に質問です。
その場合、複数のメンバ関数に一つずつインターフェースを
指定すると、templateの数が膨大になるので非現実的ですよね?
旨くやる方法ってあるのでしょうか?教科書的には、NoisyShout、DefaultShout
を基底クラスから導出すると思うのですけども。スレの流れはちと忘れて。

917 名前:デフォルトの名無しさん :04/05/30 12:25
>>915
表面分析

918 名前:デフォルトの名無しさん :04/05/30 12:33
体表面アナル化

919 名前:デフォルトの名無しさん :04/05/30 13:32
>>862じゃないけどメンバ関数すべてにインターフェイスを用意するという意味で言ったんじゃないんじゃないと思う
そもそもポリシーは互いに関連する複数のメンバ関数を提供するのが普通だし、
むしろ「インターフェイス、ポリシーを分けて考えろ」ってのは
インターフェイスがポリシーごとの差異を細かく反映していくつも用意されることに異を唱えてるんだと俺は解釈したが。

920 名前:デフォルトの名無しさん :04/05/30 13:55
>>917
「operator ! で表面分析する」ってどういう意味さ?

921 名前:デフォルトの名無しさん :04/05/30 13:56
ModernC++は極最近読みました。ポリシーにまだ慣れていないので
なかなかピンと来ないのですが、
>>インターフェイスがポリシーごとの差異を細かく反映していくつも用意されることに異を唱えてる
の具体的な例を示してもらえませんか。
インターフェイスがポリシーの差異を細かく反映していくつも用意されている例と、
インターーフェイスとポリシーと実装を分離してうまく解決している例と。
例を見ないと学習がスムーズに進まない性分なのでお願いします。

922 名前:デフォルトの名無しさん :04/05/30 14:33
>>921
すまんが、俺はちょっと例までは出せない。
というか
>インターフェイスがポリシーごとの差異を細かく反映していくつも用意される
ってのは君が心配しているような(想像上の)場合を述べたもので、
実際にはポリシーに当たる部分を分離して一つのクラスを作っているなら
その段階で全体のインターフェイスとの関連性は自然になくなるはずなんだよね。
実際にあるみたいな言い方したせいで誤解させてしまったようだけど。

923 名前:922 :04/05/30 14:49
「自然になくなる」って言い方は言いすぎだったか。
>>862の例だとポリシーは実装に利用されるだけだからインターフェイスには関わってないけど。


924 名前:デフォルトの名無しさん :04/05/30 14:50
うーん、やっぱり具体的なソースが想像出来ませぬ…orz

925 名前:デフォルトの名無しさん :04/05/30 16:15
こんなのかな?
/* 悪い例 */
struct VariableNoisyShout{
protected:
void shout(int noisiness){
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
};

/* 良い例 */
struct VariableNoisyShout
{
set_noisiness(int n){nn = n;}
protected:
NoisyShout():nn(3){}
void shout(){
int noisiness = nn;
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
private:
int nn;
};

926 名前:デフォルトの名無しさん :04/05/30 17:31
初歩的な質問だけど>>849のprotectedは何故問題が起こりにくいの?

927 名前:デフォルトの名無しさん :04/05/30 18:03
>>926
struct base{protected:~base(){}};
struct derived : public base{};

base *p = new derived;
delete p; /* コンパイルエラー */

928 名前:デフォルトの名無しさん :04/05/30 18:18
あ〜、もう訳が分かりません。
良い例と以下はあんまり変わらないと思いますけど、
この例にポリシーってあるんですか?

struct VariableNoisyShout{
protected:
void shout(int noisiness = 3){
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
};


929 名前:デフォルトの名無しさん :04/05/30 18:54
正直、「インターフェース」「ポリシー」をどう定義して話しているのかわからない。
あげく、「ポリシーってあるんですか?」ときた。
話している両者で定義が違っているような気がするんだが、
ちゃんと噛みあった会話になってるの?

漏れとしては、
「インターフェース」
 広い意味では、提供者と使用者の間での約束事のこと。
 たぶん今の会話の中では、純粋仮想関数のみを持つクラス型のこと。
「ポリシー」
 テンプレート引数として動作をカスタマイズできるように、
 必要なメンバ(要求)が定義されているクラス型のこと。
 広義のインターフェースに含まれる。
だと思ってるんだけど、あってるかな?

930 名前:デフォルトの名無しさん :04/05/30 19:40
日本語では正直分からないのでソース例を見て、
理解したいと思ったしだいです。

931 名前:925 :04/05/30 19:44
やっぱり例が悪かったな。
忘れてくれ。

932 名前:デフォルトの名無しさん :04/05/30 19:48
なぁみんな、そろそろ>>930は放置でいいんじゃないか?

933 名前:デフォルトの名無しさん :04/05/30 19:52
>>932
「日本語」と「ソース」が逆だったら賛成だが・・・
現状、あんたがおかしい

934 名前:デフォルトの名無しさん :04/05/30 20:23
>>929
概念ではなく実装レベルで見ると

インターフェース
 純粋仮想関数と仮想デストラクタだけを含むクラス

ポリシー
 typedef と定数定義だけを含むクラス

かね。形だけ見ても、それをどう有効活用するか理解してないと
意味不明だから、あまり良い説明じゃないんだが。

935 名前:デフォルトの名無しさん :04/05/30 20:26
>>934
うそくせーなんかうそくせー

936 名前:926 :04/05/30 20:34
>>927
誰かが公開してやらなきゃいけない上に
virtualじゃない基底クラスポインタを作れないという事か。
ありがとう。

937 名前:デフォルトの名無しさん :04/05/30 21:04
>>935
どうした、なんか発作でも起こしたのか?

938 名前:デフォルトの名無しさん :04/05/30 21:06
放置して下さい

939 名前:849 :04/05/30 21:15
>>916
俺の書いたソースで混乱させてしまったようですまない。
言葉が足らなかったのでとりあえず>>862-866にこめた
気持ちを書きます。ちょっと酔ってるのでわかりにくいかもしれんが
なんとなくこのまま放っておけないので。

ポリシーはModernC++Designで定義されている用語です。
俺がだらだら説明するなんて無駄だから知りたい方は
読まれると良いでしょう。

ポリシーもインターフェースも複数メンバがあっていいです。
どちらも意味的にわかりやすい単位でまとめていいでしょう。


940 名前:849 :04/05/30 21:15
>>939のつづき
件の話の流れから、「デストラクタvirtual」と「デストラクタprotected」の
使い分けのような部分を示したかったのです。
俺の理想としてはインターフェースから導出→(当然)デストラクタvirtual
実装の再利用及び、アプリケーションの特性を示すクラス→デストラクタprotected
の気持ちを持っています。※基本APIはここでは考えません。

で、インターフェースから導出するのは
なるべく動的にクラスが扱われる場合
(一緒の配列に格納したりStateパターンを使ったりするような場合)
にするべきだということです。使用例2において配列で示しました。
動的でなければほとんどテンプレートでコンパイル時に静的解決できるだろうと
考えています。動的に使用しないなら使用例1で十分(インターフェース不要)
ということです。

こうするとインターフェースばかり(仮想関数ばかり)で
効率が下がってしまうという問題を回避できるのではないかという意味でした。
デストラクタにvirtualをつけるのを嫌がるのは効率を考えるからだ、
というふうに受け止めているからです。


941 名前:849 :04/05/30 21:16
>>940のつづき
また、もし一つのメンバ関数を一つのポリシーに対応させて作っても
コンパイル時に最適化されて一つのクラスになるし、
ポリシーに分けた部分を継承で実装するならクラス数も同様に
増えると思うので、これに関してデメリットは無いだろうと思います。
ポリシーは似て非なるクラスを作りたい時にその「似て非なる」を
他になるべく影響を与えずに切り出す手段だと思っています。

えらい長文すみません。ちゃんと伝わるといいんですが。


942 名前:デフォルトの名無しさん :04/05/30 21:18
int (*hoge)[10] = new ...;

...には何を指定すればいいでしょうか?
int[10]としたらおこられました。



943 名前:デフォルトの名無しさん :04/05/30 21:46
int* (hoge)[10] = {new int, new int, new int, ...};

944 名前:デフォルトの名無しさん :04/05/30 21:51
それは違うだろ

945 名前:デフォルトの名無しさん :04/05/30 21:59
>>942
int (*hoge)[10] = new int[n][10];

946 名前:デフォルトの名無しさん :04/05/30 22:41
>>945 ありがとうございます。

947 名前:デフォルトの名無しさん :04/05/30 22:44
>>941
>最適化されて

これ言い出したらOOP崩壊

class sine
{
private:
int afo;
public:
void set_afo(int gaikichi);
};
void inline sine::set_afo(int gaikichi)
{
afo = gaikichi;
}
main()
{
sine arasi;
arasi.set_afo(nurupo);
}


948 名前:デフォルトの名無しさん :04/05/30 22:50
inline ってハァ?

949 名前:デフォルトの名無しさん :04/05/30 23:31
>928
そもそもここが分かってないような気がするので。
とりあえず、VariableNoisyShout とか自体がポリシーでしょ?
>862 からの流れです。
で、>849>925 は主張が違ってるような気がします。
>849 は既に本人が説明されてるんでパス。
で、>925 が言いたかったのは、悪い例ではポリシーが違うことによって shout() の呼び出し方が
変わってしまうため >864 みたいに単純に hit() が作れなくなり、結果としてインタフェースまで
影響が波及しかねず(hit()自体を差し替える必要がありそう)だめぽってことでしょう。
良い例の場合は、>863-864 と組み合わせが可能ですし、何回 Shout するかも制御可能です。
まとめると「ポリシーは問題を切り分けてちゃんと作れ」になってしまいそうな気がしますが(w
なお >928 のコードでは結局何回 Shout するかを制御できないですね(実装を使うユーザが)。

950 名前:デフォルトの名無しさん :04/05/30 23:57
皆様どうも長々と付き合ってもらって感謝です。
>>849 氏の説明は、class DerivedA1 : public BaseA {}、class DerivedA2 : public BaseA {}
では、DerivedA1、DerivedA2 を BaseA* と共にしない場合でもvirtualが入ってくるが、
>>862-866の例では、BaseA*的に扱うか否かを使用者が決める(ポリシー)だと受け取りました。

>>928 は完全に私の勘違いで申し訳ありません。


951 名前:デフォルトの名無しさん :04/05/31 00:14
>>947
は、ナニが言いたいの?意味不明なんだけど

952 名前:デフォルトの名無しさん :04/05/31 01:36
>>781のリンク先の仮想継承のところにある
vbptrが指している仮想基本クラステーブルについてなんですが

テーブルの最初のエントリーがクラスGの場合 GdGvptrG なのですが
ここには何が入ってるんですか? GdGvptrC さえあればよさそうに見えるのですが
各仮想基本クラスへのオフセット値以外に何か必要なのでしょうか

953 名前:849 :04/05/31 08:54
>>949
>>925の解説ありがとう。
実は俺、昨日読んだ時点では文脈がわかってなかったんだが、
俺のソースから始まったことだからとりあえず返信したのでした。
ちなみに>>949のような話なら俺はまず下記いずれかで解決を
試みると思います。どちらを取るかはアプリ次第ですね。
行数足らないのでデストラクタとprotected宣言は補完してください。
//実装側に変更を要求するが、柔軟。
template<typename S>struct IgnoreCountShoutAdapter{
void shout(int count){S::shout();}//引数ありshoutを引数なしshoutへ
};
//型爆発が起こる可能性あり。
template<int C>struct StaticCountShout{
void shout(){
int noisiness = C;
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
};


954 名前:849 :04/05/31 09:10
>>950
その通り。同じ意識を共有できたと思う。
説明が足りなくてすまなかった。

>>919
ポリシーは実装を作るためのパーツ感覚なので
一般的にインターフェースより粒度は細かいだろうと思う。
件のサンプルではそういう意図ではなかったんだけどね。
多分この辺を感じ取ってくれてフォロー入れてくれたんだよな。
感謝。

955 名前:デフォルトの名無しさん :04/05/31 15:25
VBで unload me はC#ではどうやるの?
コントロールのボタンを押した時、Form_Closeingをして
アプリケーションを終了したいのだけど。




956 名前:デフォルトの名無しさん :04/05/31 15:26
亜巣万。まちがった。ごばく。


957 名前:C++初心者 :04/05/31 22:23
C++の実行時のメモリの取られ方についてどなたか教えてください

とある本で実行時の動作について
1.全ての割り込みを受け付けないようにする
2.ROM から RAM に初期化したデータを全てコピー
3.初期化されていないデータ領域を 0 で初期化
4.スタックを確保して初期化
5.プロセッサのスタックポインタを初期化
6.ヒープ領域を作成して初期化
7.全ての広域変数のためのコンストラクタとイニシャライザを実行 (C++)
8.割り込みを可能にする
9.main を呼ぶ
とあったんですが、
"全ての広域変数のためのコンストラクタとイニシャライザを実行"
とはどういう意味でしょうか?
広域変数の意味がわかりません。クラスのヘッダ内で宣言している変数のことでしょうか?
そのためにコンストラクタとイニシャライザを実行ということは、
そのクラスが使われる使われないにかかわらず、
実行時にヘッダに宣言してある変数がRAM上(何領域?)に取られるということですか?

958 名前:デフォルトの名無しさん :04/05/31 22:33
グローバル変数のことじゃね?

959 名前:デフォルトの名無しさん :04/05/31 22:45
C++ に 「イニシャライザ」 なんて用語あったっけ?

960 名前:デフォルトの名無しさん :04/05/31 22:47
一般的に初期化ってことじゃないの?

961 名前:C++初心者 :04/05/31 22:47
C++でのグローバル変数っていうのは、、、クラス外で宣言されている値ということでしょうか?
そうするとコンストラクタが実行されることの意味がわかりません

イニシャライザって
class A {
A() : a(0) {
とかのa(0)のことかと思ってました

962 名前:デフォルトの名無しさん :04/05/31 22:53
class abc {
int m;
abc() : m(0) { hoge(); }
};

abc a;
main(...) { ... };

なんてのがあったとき、main が呼ばれる前に a のコンストラクタが動くよ、ってこと>>961


963 名前:C++初心者 :04/05/31 23:14
あ、そういうことですか、わかりました

それ以外のクラスに関しては、実行時に呼ばれた際に初めてコンストラクタが走ってメモリが獲得されるという理解でいいんですよね?
その際の呼び出し方によって、どこにメモリが取られるのかが決まると

ありがとうございました

964 名前:デフォルトの名無しさん :04/05/31 23:20
>>954 御丁寧に有難うございました。
ポリシーって、A< Policy > a; の様に使ってAの内部動作を決める事しか
目を向けていませんでした。件のコードはとても新鮮でした。
struct Base {
virtual void func1();
virtual void func2();
];
struct DerivedA : public Base {
void func1() { ... }
void func2() {} // place holder
};
struct DerivedB : public Base {
void func1() {} // place holder
void func2() { ... }
};
の様に無理に共通の基底クラスを作らなくても済みますね。
template< typename Policy > struct A;
struct Policy1;
struct Policy2;
struct Policy12 : public Policy1, public Policy2;
A< Policy12 > a
とやると複数のポリシーを適用できるかなぁと夢想中・・・

965 名前:デフォルトの名無しさん :04/06/01 21:17
char i;で定義したiでユーザーの入力を受け取ってint型に変換したいんですけど、どうすればいいんでしょうか?

966 名前:デフォルトの名無しさん :04/06/01 21:25
>>965
まずは入門書買え。そして読め。話はそれからだ。

967 名前:デフォルトの名無しさん :04/06/01 22:13
>>965
発想の転換でintで定義して入力を受けるときだけcharに変換する

968 名前:デフォルトの名無しさん :04/06/01 22:26
int×char

969 名前:デフォルトの名無しさん :04/06/01 22:26
何がやりたいのか分からんが、char* だったら atoi か。

970 名前:デフォルトの名無しさん :04/06/01 22:55
>>969
エライね(w
初心者の言わんとすることを咀嚼した上で回答している。
自分だったら、ついつい>>967のような返答してしまうだろうなぁ。

971 名前:デフォルトの名無しさん :04/06/02 02:59
オレだったら、

 あーっ、うざい。初心者スレか宿題スレにとっとと逝け

って回答しちゃうな。みんな親切だな。

972 名前:デフォルトの名無しさん :04/06/02 03:07
・・・

973 名前:デフォルトの名無しさん :04/06/02 04:38
>> 965
(int)(i - '0')

974 名前:デフォルトの名無しさん :04/06/02 06:05
>>973
i - '0' ってやった時点で既に整数への格上げを受けているよ。まず i が
整数への格上げを受け、次に '0' も整数への格上げを受けるので、
結局int - intの計算をして、結果もint。キャストは不要。

975 名前:デフォルトの名無しさん :04/06/02 12:48
structとclassの使い分けってどうしてます?
なんとなく? あるいは自分なりの基準を持ってますか?

976 名前:デフォルトの名無しさん :04/06/02 13:31
俺の場合、
・メンバが全てpublic
・operator以外の関数がない
・仮想関数テーブルがない
場合はstructだな。まぁ多少例外もあるが。

友人はoperatorなども含め、関数が入りそうな時点でclassに
してるんで、結構「俺基準」がありそうな気がする。

977 名前:デフォルトの名無しさん :04/06/02 14:47
C から C++ に流れた人は >>976 の言う関数が入ったらクラス化っての多いんじゃないかな。
かく言う俺もそれ。

978 名前:デフォルトの名無しさん :04/06/02 15:17
俺は関数オブジェクトを用意するためにはstructだなあ。

979 名前:デフォルトの名無しさん :04/06/02 15:45
Cと絡むならstructそれ以外はclass

980 名前:デフォルトの名無しさん :04/06/02 15:53
俺はマンドクセーから全部classだな。

981 名前:デフォルトの名無しさん :04/06/02 15:58
C#とかならともかくC++で一生懸命使い分けても空しいよな

982 名前:デフォルトの名無しさん :04/06/02 16:26
>>981
別に一生懸命使い分けているわけでもないのだが。

983 名前:デフォルトの名無しさん :04/06/02 18:28
次スレ立てまーす

984 名前:デフォルトの名無しさん :04/06/02 18:30
しばらくこのホストでは立てられません」がでちゃったよーん

985 名前:デフォルトの名無しさん :04/06/02 19:39
>>975
自分で作る場合は文句なしにclass
他の人のを借りた場合のみstructが存在する

986 名前:985 :04/06/02 19:42
>>984
建てようか?

987 名前:985 :04/06/02 19:47
漏れも弾かれたorz

988 名前:デフォルトの名無しさん :04/06/02 19:49
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1046851381/

989 名前:デフォルトの名無しさん :04/06/02 20:01
>>988 ワラタ

990 名前:デフォルトの名無しさん :04/06/02 20:03
スレッド一覧から探しちゃったよ

991 名前:デフォルトの名無しさん :04/06/02 20:31
>>975
メンバ関数とかoperatorみたいに++なことを書くときclass
ただしインターフェースはstruct

てなことやってるけど、本音ではclassいらん
俺的にはpublic->protected->privateの順で書くべきだと思っているし
template関係のぐちゃが痛くて見てらんねー


992 名前:デフォルトの名無しさん :04/06/02 20:47
ええ?俺はデータをひとまとめにするのに使うぜ?なんだってインターフェースにstructなんか。
public書くの面倒くさいとかだったら悪だね。

993 名前:デフォルトの名無しさん :04/06/02 20:55
いや、別にどっちでもいいだろ

994 名前:デフォルトの名無しさん :04/06/02 21:00
なんの存在意義もないな

995 名前:デフォルトの名無しさん :04/06/02 21:11
クリリンのことかーっ!!!!!

996 名前:デフォルトの名無しさん :04/06/02 21:28
クラスは使うと遅くなるの?

997 名前:デフォルトの名無しさん :04/06/02 21:29
うん。理屈上は遅くなる。

998 名前:デフォルトの名無しさん :04/06/02 21:32
メンバ変数一つ使うのにもインスタンス作ってやらんといけないわけだから
その分、クラスを使わないでやる場合に比べると遅い。


999 名前:デフォルトの名無しさん :04/06/02 21:33
C++

1000 名前:デフォルトの名無しさん :04/06/02 21:34
1 0 0 0


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