C++相談室 part66at TECH
C++相談室 part66 - 暇つぶし2ch639:デフォルトの名無しさん
09/04/17 07:06:21
ヒープ領域 newでシステムから借りてきたメモリ領域。

プール=確保したもの、プール金とかのプールと意味は同じ。予めシステムから借りておく。
お金が必要なたびにいちいちATMに逝くのではなく、必要になる前に家に現金を置いておくイメージ。

チャンク=こまぎれ。
数バイト毎とかでチマチマ確保すると効率が悪いので、大きな単位で確保する。

必要な額だけをATMからおろすのではなく、必要な額を10万円単位で切り上げておろす、みたいなイメージ。
1万円必要になったら10万円おろし、
11万必要になったら20万円おろす。

640:デフォルトの名無しさん
09/04/17 08:00:39
その手の比喩は、7-8割理解できている人間に「トドメの刺す」のには有効だけど、
初期に読まされると余計混乱すると思うよ。

641:デフォルトの名無しさん
09/04/17 08:03:11
×トドメの ○トドメを

>>638
「Effective C++」に確か、実例つきで説明があったはずだから、
それを読んでみるといいんじゃないかな。

642:デフォルトの名無しさん
09/04/17 10:10:02
~_tはtypedefの証というけど、
これは規約上予約されている?
例えば自分で
numeric_t
とかしちゃだめ?

643:デフォルトの名無しさん
09/04/17 10:33:18
全然。いくら使っても大丈夫。_tamuraとか__tamuraとかも衝突しない限り使って大丈夫。

644:デフォルトの名無しさん
09/04/17 10:52:01
>>643
ありがとう。
MY__M__A__C__R__O
とか予約されてるじゃん。これと同じ感じで予約されてたらやだなと思ったのだ。

645:デフォルトの名無しさん
09/04/17 12:03:25
> MY__M__A__C__R__O
なんだ俺の知らない世界の話か
Cのプリプロに名前を教え込むのは極力避けたい

646:デフォルトの名無しさん
09/04/17 12:50:47
>>643
_tamura はグローバルでは予約されてるから使えない。
__tamura はどこでも予約されてるから使えない。

647:デフォルトの名無しさん
09/04/17 12:53:10
// main.cxx
namespace {
typedef int _INT;
}

int main() {}

std::でもグローバルでもないならおk?

648:デフォルトの名無しさん
09/04/17 12:58:46
>>647
_INT みたいにアンダースコア~英大文字で始まる名前は
ダブルアンダースコアを含む名前と同じくどこでも予約。ダメ。

649:デフォルトの名無しさん
09/04/17 13:04:41
>>645
_が二連続した名前は予約済みなんだよ。


650:デフォルトの名無しさん
09/04/17 13:04:42
s/_INT/_iNT/

# おk?

651:デフォルトの名無しさん
09/04/17 13:07:51

URLリンク(msdn.microsoft.com)(VS.71).aspx
ここの
 予約名の形式
ってところに書いてあるね。

652:デフォルトの名無しさん
09/04/17 13:12:26
どこの独自コンパイラだよ^^
_hoge も __fuga もうちのコンパイラは全然大丈夫だよ。

653:デフォルトの名無しさん
09/04/17 13:14:29
>>647,650
アンダースコア~英小文字で始まる名前はグローバルで予約されてる。
処理系がグローバルに _iNT って名前を置いてたら曖昧になっちゃうから、
すぐに未定義動作とは言えなくてもやっぱりダメだろう。

早い話、そもそもアンダースコア始まりの名前なんか使わなきゃいい。

654:デフォルトの名無しさん
09/04/17 13:17:02
>>652
予約されてるかどうかが問題なんだよ。
今大丈夫でも、コンパイラを変えたりコンパイラのバージョンやコンパイルオプションを
変えたりしただけでエラーになるコードじゃ困るだろう。

655:デフォルトの名無しさん
09/04/17 13:20:52
>>653
すべての識別子において、
ファイルスコープを持つ ならば グローバルスコープを持つ
ということ??

656:655
09/04/17 13:24:20
自己解決しました

657:デフォルトの名無しさん
09/04/17 13:36:11
>>639
なるほど!
>>641
あー、よく聞く本です。ちょっと探してこようかな…


658:デフォルトの名無しさん
09/04/17 22:21:47
演算子について教えてください。

(見やすさとか保守性とかは考えないとしてC++の規格上)
a と b が int 型の時、
以下の表現は問題無いでしょうか?

『 b ? a=b : a++; 』

? : よりも = の方が優先順位は低いのですが、
? と : は2個セットの演算子なので、

(b ? a) = (b : a++);

このように別々になることができず
b ? (a=b) : a++;
の解釈しか出来ないはずで、
VCでも正常にコンパイル出来、ちゃんと動作します。


659:デフォルトの名無しさん
09/04/17 22:30:15
>>658
うん、大丈夫。
文法上、「論理和式 ? 式 : 代入式」となっているので問題ない。
そう、ついでに言えば、?と:の間に?:を入れ子にもできてしまうということも導かれる。

660:デフォルトの名無しさん
09/04/17 23:25:55
>>659
ありがとうございます


661:デフォルトの名無しさん
09/04/17 23:54:12
暗黙の型変換について教えてください。

以下のようなものはdoubleからintへの暗黙の型変換は行われないのでしょうか?
私の環境ではコンパイルエラーになってしまいます。

int a[1.0];
int b = 1%1.0;
int c = 1&1.0;
enum{d=1.0};

暗黙の型変換が行われない例は他にありますでしょうか?


662:デフォルトの名無しさん
09/04/18 00:25:24
doubleの値はintでは表現できないので暗黙に変換できない。
基本的に情報落ちが発生する方へは暗黙で変換できない。

663:デフォルトの名無しさん
09/04/18 00:28:31
処理系によるぞ

VC9だと、

int i = 1 * 0.8;

は warning 扱いになる。(int)で黙る。


664:デフォルトの名無しさん
09/04/18 00:30:25
型変換にはいろいろあるんだぞー
算術式での格上げとか暗黙の型変換とか

665:おもち
09/04/18 00:39:16
プログラム初心者なのですが、いい参考書などないでしょうか?

666:デフォルトの名無しさん
09/04/18 00:41:43
>>665
死ね

667:デフォルトの名無しさん
09/04/18 00:44:18
>>666
久しぶりに激しくワラタwwwwwwwwwwww
・・・俺も寂しいな

>>665
感覚を養うために難しい本じゃなくまず
センスオブプログラミングみたいな素養本を読め
言語本は辞典代わりで十分

668:デフォルトの名無しさん
09/04/18 00:47:52
初心者がC++・・・うーむ。
大概の入門書はCを知っていることを前提に書かれているからなぁ。
ところで、大昔javaが出たての頃に読んだ入門書は
C++を知っていること前提みたいな内容だった。
どこでもかしこでもC++との比較が載っていて、
そんなのが全体の1/4くらいを占めていた。

何も知らないで使えるのはBASICとかRubyとかそのへんかな。

669:デフォルトの名無しさん
09/04/18 00:56:59
コンピュータのことを知らなくてもできるのはhaskellかな…
別の知識がいるけど、基本は因数分解と展開(四則演算より単純な算術)なんで
人によっては普通の言語よりわかりやすいのかもしれない
ついでにC++は普通の言語と関数型言語の難しいところだけを集めたような言語だと思ってる

670:デフォルトの名無しさん
09/04/18 01:11:16
ぶっとんでるな

671:デフォルトの名無しさん
09/04/18 02:00:40
>>662 >>663 >>664
関数の引数やコンストラクタはdoubleからintに暗黙的型変換が行われますよね?

int f(int a){ return 0 };
f(1.0);

int a = 1.0;

とかは大丈夫なはず。

これが大丈夫で、>>661 がダメだというのは、
規格書のどの辺に書かれているのですか?
もしわかれば教えていただけないでしょうか。


672:デフォルトの名無しさん
09/04/18 02:06:18
自分で探せやカス

673:デフォルトの名無しさん
09/04/18 02:15:35
>>661
> int b = 1%1.0;
がdoubleに余剰演算かけようとしてエラーになってるんじゃないの?
式の中での暗黙の型変換なんだから1の方がdoubleに変換されて
> int b = 1.0%1.0;
になると思うんだが。

>>671
それは代入時の暗黙の型変換なんだから左辺側に変換される。

674:デフォルトの名無しさん
09/04/18 08:12:20
>>673
たとえば関数なら、

int a(int x,int y);
int a(double x,double y);
int b(int x,int y);
が定義されてたら、

a(1,1.0) は汎整数昇格の方が優先される為、
a(1.0,1.0) となりますが、
b(1,1.0) は b(1.0,1.0) の定義がないので
b(1,1) と変換されると思います。

%演算子の場合も同じように、1.0%1.0の定義が無いため
同じように1%1と型変換されたりしないのでしょうか?

あと、
int a[1.0];
enum{d=1.0};
これはNGですか?


675:デフォルトの名無しさん
09/04/18 10:33:21
>674
> 5.6/2
>The operands of * and / shall have arithmetic or enumeration type;
>the operands of % shall have integral or enumeration type. The usual
>arithmetic conversions are performed on the operands and determine
>the type of the result.

usual arithmetic conversion は 5/9 で規定されていて幅が広がる方向の
変換しか規定されていない。

>664 や >673 の言っている通り、どういう時にどういう変換がかかるかは一つじゃない。

676:デフォルトの名無しさん
09/04/18 10:46:32
> あと、
> int a[1.0];
> enum{d=1.0};
> これはNGですか?

integral constant expression ではないので NG。
論拠は7.2/1、8.3.4/1、5.19/1。

677:デフォルトの名無しさん
09/04/18 10:50:16
7.2/1、8.3.4/1、5.19/1って何を見ればいいの?
ネット上で閲覧できるもの?

678:デフォルトの名無しさん
09/04/18 11:02:45
ANSI規格。

679:デフォルトの名無しさん
09/04/18 11:05:07
で、それはネット上で閲覧できるもの? URLは?

680:デフォルトの名無しさん
09/04/18 11:21:06
ドラフトならタダで見れるだろ

681:デフォルトの名無しさん
09/04/18 11:29:25
で、URLは?

682:デフォルトの名無しさん
09/04/18 11:41:50
自分でググれよ

683:デフォルトの名無しさん
09/04/18 11:45:03
出た、「ググれよ」ww

684:デフォルトの名無しさん
09/04/18 12:11:49
そりゃ出るだろう。出る箇所だもの。

685:デフォルトの名無しさん
09/04/18 12:24:34
URLリンク(www.open-std.org)

この程度もぐぐれないのならネットやるなよ

686:デフォルトの名無しさん
09/04/18 12:33:52
>>675 >>676
ありがとうございました。
書かれている場所まで記述していただいて
非常に参考になりました。


687:デフォルトの名無しさん
09/04/18 13:04:10
C++のANSI規格が見られるURLを教えてください。

688:デフォルトの名無しさん
09/04/18 13:14:09
>>687
ありません
購入しましょう

689:デフォルトの名無しさん
09/04/18 13:20:08
一次ソースはISOな。
日本語訳がJISのサイトで閲覧できる。

690:デフォルトの名無しさん
09/04/18 13:21:07
で、URLは?

691:デフォルトの名無しさん
09/04/18 13:24:06
自分でググれよ


692:デフォルトの名無しさん
09/04/18 13:26:45
出た、「ググれよ」ww

693:デフォルトの名無しさん
09/04/18 13:31:23
そりゃ出るだろう。出る箇所だもの。

694:デフォルトの名無しさん
09/04/18 13:33:58
URLリンク(www.open-std.org)

この程度もぐぐれないのならネットやるなよ

695:デフォルトの名無しさん
09/04/18 13:34:11
URLリンク(www.open-std.org)

この程度もぐぐれないのならネットやるなよ

696:デフォルトの名無しさん
09/04/18 13:35:31
精神レベルの低い、幼稚なお子ちゃまがよぉ、軽々しく死ねとか言うなよ?
お前を育てた奴は人間社会では、かなりレベルの低いバカだったんだな。
育てられたお前がかわいそうとか思わない。大人になって苦労するのはてめぇ。
いつか死ぬから、バカな存在として一生を無駄に過ごしなさい。

697:デフォルトの名無しさん
09/04/18 13:37:02
誤爆

698:デフォルトの名無しさん
09/04/18 13:39:06
軽々しくググれとか言うなよ

699:デフォルトの名無しさん
09/04/18 13:40:32
こんなものは最初からテンプレに入れとけって話だよ。
お前らの怠慢を質問者になすりつけるな。

700:デフォルトの名無しさん
09/04/18 13:40:38
どうかググってくださいお願いします。


701:デフォルトの名無しさん
09/04/18 13:44:37
人にググれという前に、自分でググって見つけたURLを貼りなさい。

702:デフォルトの名無しさん
09/04/18 13:51:04
で、何のURLを貼って欲しいの?


703:デフォルトの名無しさん
09/04/18 13:58:13
C++のANSI規格が見られるURL

704:デフォルトの名無しさん
09/04/18 14:01:12
とあるライブラリを使おうと思ったら、コールバック関数がCの関数ポインタでした。
データも渡したいんですが、関数オブジェクトが使えないので困っています。
データをグローバル変数にするしか方法はないのでしょうか?

705:デフォルトの名無しさん
09/04/18 14:03:14
とりあえず、使いたいライブラリの機能と、コールバック関数と、渡したいデータを教えてください。

706:デフォルトの名無しさん
09/04/18 14:14:28
>>703
URLリンク(www.jisc.go.jp)
へ行ってX3014で検索してこい。章番号は変わらないはずだから。
ISOもANSIもJISも売り物なので、ちゃんとした物は金を払わなければ見られない。
ダウンロード販売のURLも貼ろうか?


707:デフォルトの名無しさん
09/04/18 14:14:42
そういうコールバックは、データを保持できるvoid *をペアで登録することができて
そいつが引数としてコールバックに渡される仕様になってるはずだが
そうでないならあきらめな

708:デフォルトの名無しさん
09/04/18 14:18:02
>>706
ちゃんとした物とちゃんとしてない物は何が違うの?

709:デフォルトの名無しさん
09/04/18 14:23:52
>>708
ちゃんとしていない物=非合法なコピー品。
提供した者の手が後ろに回る可能性がある。

あと、JISの規格書なんかは閲覧は出来てもダウンロードしてオフラインで見ることは出来ない。


710:デフォルトの名無しさん
09/04/18 14:26:02
>>709
ちゃんとしていない物=非合法なコピー品が何故公式ページからリンクされてるの?

711:デフォルトの名無しさん
09/04/18 14:30:52
まずはどこからどこへリンクされているのかURLを示せよ。
ISOのストアで販売しているものをISOが別のページでタダで配るわけないだろ。


712:デフォルトの名無しさん
09/04/18 14:35:48
>>711
誰に言ってるの?

713:711
09/04/18 14:37:45
>>712
>>710へ言っている。

714:デフォルトの名無しさん
09/04/18 14:38:40
>>707
ありました。
thxでした。

715:デフォルトの名無しさん
09/04/18 14:42:56
>>713
URLリンク(www.jisc.go.jp)
から
javascript:openPDF('X3014,01');
でPDFが開く。

716:デフォルトの名無しさん
09/04/18 15:02:24
>>715
あ、公式っていうのはISOではなくJISのこと?
それはタダで見られる数少ない合法的なものだよ。
(ちなみにそのURLは検索結果のものだから他の人には見えないよ)
>>709の文章の書き方が悪いって言う話?
ちゃんとしていないものの例=非合法なコピー品
と書くべきだったかな?


717:デフォルトの名無しさん
09/04/18 15:04:58
>>706
初めからそう書けよ

718:デフォルトの名無しさん
09/04/18 15:05:44
おまえら釣られまくりだな。

719:デフォルトの名無しさん
09/04/18 15:08:12
>>716
>>708が言ってるのは、
>タダで見られる数少ない合法的なもの

>金を払わなければ見られないもの
の違いを教えて、ってことだと思うよ。

720:デフォルトの名無しさん
09/04/18 15:11:32
>※最新バージョン9の使用は今しばらくお待ちください。

おい。

721:デフォルトの名無しさん
09/04/18 15:12:14
久々に見に来たら何唾壺の有様は。
まったり進行していた時代はどこへ行った!

大人は黙ってまとめてあぼんだな。


722:デフォルトの名無しさん
09/04/18 15:13:20
セキュリティが厳しくなる前に保存しておいて正解だったな

723:デフォルトの名無しさん
09/04/18 16:45:31
static const volatile int x=42;
とかあったとするじゃん。
この前のC++における型名や修飾子の順番ってどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。


724:デフォルトの名無しさん
09/04/18 16:54:59
この前っていつのことだよ。覚えてねーよ。

725:デフォルトの名無しさん
09/04/18 17:08:54
>>724
日本語おかしかったか。

static const volatile int x=42;
とかあったとするじゃん。
このように変数名の前につけるような
型名や修飾子の順番ってC++においてどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。

726:デフォルトの名無しさん
09/04/18 17:25:35
const volatileって意味あるの?

727:デフォルトの名無しさん
09/04/18 17:28:18
>>726
ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
ハードウェアが書き込み,プロセッサが読み書きする領域: volatile
プロセッサが書き込み,ハードウェアが読み出す領域: volatile

っていうのを見つけた。
[C,C++] const と volatile - bnez の日記
URLリンク(slashdot.jp)



728:デフォルトの名無しさん
09/04/18 17:41:23
>>725
別に決まりはないけど、まあみんな常識で考えて
記憶クラス指定子→cv修飾→型名の順番にしているね。
コンパイラを通すだけならint const volatile staticなんて並べても通る。

729:デフォルトの名無しさん
09/04/18 17:42:24
好みが現れるのはポインタ・参照の*と&の前後の空白の開け方、constとの順序だな。
int *p; int* q;とか。

const int* p2; int const* q2;
上のq2は、constなポインタへのconstで一貫性があるように見える。
const int* const p3; int const* const q3;

730:デフォルトの名無しさん
09/04/18 17:54:08
>>725
ストレージクラス(static) 型(int) cv修飾(const volatile) 識別子(x)

基本的にcvはその直前(左)にある型を修飾するけど、例外的にその左に型がない場合は直後の型を修飾する

規格では7.1あたりに書いてあるよ

731:デフォルトの名無しさん
09/04/18 18:10:15
一応誤解されないように言っとくと一番左の型の修飾子はその左に置くのが一般的だと思う
static const volatile int x でok

732:725
09/04/18 18:13:17
>>728-730
ほっほ~。
了解しました。
ありがとう。


733:デフォルトの名無しさん
09/04/18 18:40:53
質問です

struct fruit{
  int apple;
  int banana;
  void clear(){
    ZeroMemory(this, sizeof(*this));
  }
  int orange;
};

この構造体をローカル変数に定義した場合、メモリ見るとそれぞれの
3つの値がスタックに順に並びました。
clear を呼ぶと、確かに apple, banana, orange が
クリアされます。
ZeroMemory で this を渡していますが、clear() は含まれていないようです。

この構造体の場合、fruit.clear() は main() と同じように、
code セグメントに配置されるんでしょうか。
class も同じ考え方になるのでしょうか。

734:デフォルトの名無しさん
09/04/18 18:42:50
>>733
当然、そうしないといけないという決まりはないが、
自然に実装すればだいたいそんな感じになる。classでも同じ。

735:デフォルトの名無しさん
09/04/18 19:49:59
>>731
コンパイラーによっては前付きは古いって怒られることあるよ。
ここらへんに増築の限界感を感じる・・・

736:デフォルトの名無しさん
09/04/18 21:56:22
1) const int *p;
2) int const *p;
3) int *const p;

1と2がpointer to const intで、3はconst pointer to intであってますよね?

737:デフォルトの名無しさん
09/04/18 21:57:06
>>736
あってる。

738:デフォルトの名無しさん
09/04/18 21:57:16
あってます。

739:デフォルトの名無しさん
09/04/18 21:59:07
declarator としての const は常に * const の形で現れる。
っていうか、構文解析法は頭に叩き込みましょう^^

740:デフォルトの名無しさん
09/04/18 22:00:58
派生クラスのメンバ関数foo()が例えprivateでも、
基底クラスで同じメンバ関数foo()がvirtualと指定されていれば
基底クラスのポインタを介した場合のみ呼び出せるのか。

実際やってみるとうまくいくんだが、別におかしくはないよね?
class Base
{
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
};

class Derived : public Base
{
void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
Base* pbd(new Derived);
pbd->foo();
delete pbd;
}


741:デフォルトの名無しさん
09/04/18 22:07:06
>基底クラスのポインタを介した場合のみ呼び出せるのか。

派生クラス(Derived)のポインタを介した場合でも呼び出せるでしょ?


742:デフォルトの名無しさん
09/04/18 22:08:11
おかしくないよ。
もし呼び出せなくなったりするのなら
ポリシークラスとか存在価値なくなっちゃうし。

743:デフォルトの名無しさん
09/04/18 22:08:22
>>741
コンパイルエラーになったよ。

744:デフォルトの名無しさん
09/04/18 22:09:53
自分のメンバ関数なのに?

745:デフォルトの名無しさん
09/04/18 22:11:16
privateにしたら呼び出せなくなるのは当たり前だろ

746:740
09/04/18 22:11:19
>>741
error: `virtual void Derived::foo()' is private
って言われますね。
>>744
「自分のメンバ関数から」ならprivateメンバ関数も呼出せるけどね。

747:740
09/04/18 22:19:08
あと、基底クラスのデストラクタがprotected指定されていても、
派生クラスのデストラクタがpublic指定されていれば
boost::shared_ptrを使った場合なら呼出せるのね。

必要条件:
基底クラスのデストラクタがprivateでないこと。
また、派生クラスのデストラクタがpublicであること。
さらに生のポインタじゃダメなようだ。


748:740
09/04/18 22:20:08

class Base
{
protected:
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
};

class Derived : public Base
{
virtual void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
boost::shared_ptr<Base> pbd(new Derived);
pbd->foo();
}

しかもboost::shared_ptrの動的削除子のおかげでデストラクタにvirtualすら付けなくてもいけるのか。


749:デフォルトの名無しさん
09/04/19 00:39:35
>748 >454

750:デフォルトの名無しさん
09/04/19 11:55:04
>>727
>ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
この使い方って本当に大丈夫?
例示できないけどconst有り無しのオーバーロード関数とか・・・


751:デフォルトの名無しさん
09/04/19 12:10:18
>プロセッサが書き込み,ハードウェアが読み出す領域: volatile

これも疑問だよな

プロセッサもハードウェアも読み書きする領域じゃないのか?

752:デフォルトの名無しさん
09/04/19 12:16:38
そのコードが動作するプロセッサの管理外で読み書きされる領域

753:デフォルトの名無しさん
09/04/19 13:47:07
プロセッサによって細かい挙動は違うだろうけど、
volatileって常に最新の実体を参照するようにするだけだよね?

754:デフォルトの名無しさん
09/04/19 13:52:46
最適化を無効にしてるだけだから

755:デフォルトの名無しさん
09/04/19 14:38:46
その変数を扱っているプログラムとは別のなにかによって内容が変更されうる変数。
volatile int i;
int j;
if ( i == 1 ) j = i;
で j == 1 でないときがありえる変数。

constをつけるとそのプログラムからは内容が変更できないのに参照するたびに内容はかわるかもしれない変数になる。

ポインタ経由でアドレスにマッピングされたI/Oポートとやり取りするのに使ったりする。



756:733
09/04/19 14:51:18
>>734
thx! 亀レススマソ

「自然に実装すれば」というのは、アセンブル段階で
構造体やクラスのコードはすべて code セグメントに集約している
場合、ということでしょうか。

もう1つ謎なのは、インスタンス化を可能とするために、
clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
どうにかして渡しているはずですが、その文献が見当たりません。
どのように処理しているんでしょうか。

757:デフォルトの名無しさん
09/04/19 16:36:28
>>756
> 「自然に実装すれば」というのは、アセンブル段階で
> 構造体やクラスのコードはすべて code セグメントに集約している
> 場合、ということでしょうか。

クラス(あるいは構造体)のメンバ変数は、
インスタンス毎に値が違うので、各インスタンスごとに
用意してやる必要があるが、メンバ関数は各クラス毎に
一つだけ用意してやればよい。
よって、>>733の場合だと、スタックにメンバ関数(へのポインタ)が
用意される必要はない(virtual関数は微妙に別)


> もう1つ謎なのは、インスタンス化を可能とするために、
> clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
> どうにかして渡しているはずですが、

>>733の例のclear()の場合、処理系が勝手に

__struct_fruit_clear(fruit* this)

のような関数に置き換える(ことが多い)。ただし、処理系依存。

758:733
09/04/19 17:46:48
>>757
丁寧な説明、本当にありがとうございます。
かなり理解できました。

759:デフォルトの名無しさん
09/04/19 20:32:45
個人開発にて C++ にインターフェースの概念を取り入れようとしております。
.NET や Java では interface が言語仕様として存在しますが、
C++ では言語仕様レベルで Java のような interface は存在しません。
なので、単一継承とは別に、
純粋仮想関数だけで固められたクラスのみ、多重継承を許可して実装しようと思ってます。
そのような実装で問題点などありますでしょうか。
よろしくお願いします。

760:デフォルトの名無しさん
09/04/19 20:35:38
特に問題はないと思うけど、インターフェイスだと分かるようなクラス名にするとか工夫した方がいいかも
結局は規約次第だと思うが

761:デフォルトの名無しさん
09/04/19 20:59:23
>>760
レスありがとうございます。
やっぱり規約や、実装者の意識の問題になりそうですよね。
個人(自分だけ)での開発なので、その辺の問題は薄そうですが・・・
コンパイラで上手くカスタマイズして、
間違った実装したときに警告とか出せればいいんですけどね。

762:デフォルトの名無しさん
09/04/19 21:03:35
>>759
struct IHoge {virtual ~IHoge();};
struct IFoo : IHoge {};
struct IBar : IHoge {};

class Piyo : IFoo, IBar {};
Piyo piyo;
このとき、(IHoge*)(IFoo*)&piyo == (IHoge*)(IBar*)&piyoが
真になるとは限らないということを許容できないなら、仮想継承を使うべきと言っておく。

処理系間や多言語間での互換性を高めるため、仮想継承を使っていないMSのCOMでは、
これが理由でポインタの比較が面倒(仮想継承の代わりに規約で縛りを入れて対処している)。

763:デフォルトの名無しさん
09/04/19 21:45:10
>>762
operatorの再定義のことを言ってる?
よく分からん。

764:デフォルトの名無しさん
09/04/19 22:00:25
>>763
仮想継承しなければ、IFooの部分オブジェクトのIHogeとIBarの部分オブジェクトのIHogeは別物ということ。

インタフェースという元のお題からは外れるが、IHogeに非静的メンバ変数xがあれば、
IFoo側のxとIBar側のxは、仮想継承しないなら別々、仮想継承したら同一の存在だろ。
(かなり乱暴な言い方だけど)
それと同じ話。単にメンバ変数がないからポインタの比較でもしないと問題が発覚しないだけで。

765:デフォルトの名無しさん
09/04/19 22:20:17
教科書に書いてある内容なんだから
「仮想継承」も調べておいた方がいいとかで済ませればいいのに

766:デフォルトの名無しさん
09/04/19 23:49:51
>>762
レスありがとうございます。
仮想継承はよく理解してなかったんで、Wikipedia とかで調べてました。
多重継承する上で理解しておかないといけない概念ですね。
ありがとうございました。

767:デフォルトの名無しさん
09/04/19 23:52:40
おまえらスレがもったいないから
>>765さんが教科書で覚えたことはいちいち説明するなよ。
ググレカス。

768:デフォルトの名無しさん
09/04/19 23:56:49
俺もC|Java|C#|VB厨だから仮想継承を調べてみた
たしかにこれはググればわかる気がする
今後は namespace C++{ 仮想継承 } とか名前空間で囲んでくれると名前的にわかりやすい
RDFでも可

769:デフォルトの名無しさん
09/04/20 13:17:27
namespaceは神
これさえあればC言語風に書けるしなw
クラス?
そんなもんいらね。

770:デフォルトの名無しさん
09/04/20 13:26:09
namespaceはCに取り込まれるべきだと思うね
コメントの//より優先されるべきだった

771:デフォルトの名無しさん
09/04/20 14:31:19
namespaceだとC++と同じだから、namekukanでCに取り込んだら
どうだろうか

772:デフォルトの名無しさん
09/04/20 14:33:16
programminglang::C::namespaceでいいよ。

773:デフォルトの名無しさん
09/04/20 15:40:24
namespace 入れてくれれば enum を気兼ねなく使えるしな

namespaceだとC++と同じだから、miniascapeでCに取り込んだらどうだろうか

774:デフォルトの名無しさん
09/04/20 19:37:14
普通に
namespaceでいいよ。だからさっさと取り込んでくれ。

775:デフォルトの名無しさん
09/04/20 22:17:27
namespiceでいいよ

776:デフォルトの名無しさん
09/04/20 22:20:40
namaespaceでいいよ

777:デフォルトの名無しさん
09/04/20 23:33:28
namaekukanだろjk

778:デフォルトの名無しさん
09/04/20 23:35:43
無名名前空間も頼む。
staticいちいち付けるの面倒なんじゃ。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch