mfc-ml

1999年08月

31

[mfc 18815] Re: メンバ変数の宣言について

> でしたので、MSDNの記述内容は正しい(規格)のようです。

おそらく新しめなコンパイラだと従っていることでしょう。
しかしながら、「カンマ演算子だぁ」と構文解析するコンパイラがいると
悲しい結果になります(^^;

ひととおり身の回りにあるC++本を見てみましたが、お茶を濁していました。
初期化子の動作を箇条書きに挙げている本もありましたが、こちらには
複数の初期化子に関する記述は見られませんでした。

> しょうから、気にしなくてもいいと言えばそうですけど、メンバーの宣言順
> に注意する必要がある場合がある事は確かなようです。ハイ。

==========================================
class CTestclass  
{
public:
CTestclass();
int a;     // ここ注目
int b;     // ここ注目
};
CTestclass::CTestclass() : a(5),b(a+1)
{
TRACE ("%d,%d\n",a,b);
}
------------------------------------------
class CTestclass  
{
public:
CTestclass();
int b;     // ここ注目
int a;     // ここ注目
};
CTestclass::CTestclass() : a(5),b(a+1)
{
TRACE ("%d,%d\n",a,b);
}
==========================================
この2つの結果が違うというのは、一見するとコンパイラのバグに
しか見えないのよね・・・あな恐ろしや。

VFC-LINK  P...@nifty.ne.jp
31

[mfc 18814] Re: メンバ変数の宣言につい て

まさしです。

In [mfc 18811] Re: メンバ変数の宣言について 
Masashi Nagai <n...@ss.iij4u.or.jp> Wrote:

> 気になるな~(笑)。そのうち調べよう。
> # 最近増えた C++ の機能の整理用に C++ の本買ったのに行方不明だ(;_;)。

上記 C++ の本は発見できませんでしたが(たぶん家にあるのだろう)
かわりに、Borland C++ 4.0 のマニュアルを発見しました。

そこに書かれていた内容は、

「基本クラスは宣言順に初期化されます。その後でメンバーがやはり
  (初期化リストとは関係なく)宣言順に初期化されます」

でしたので、MSDNの記述内容は正しい(規格)のようです。

まぁ、こうしたコードを書くことは滅多にないだろうし、VFC-LINK さんの
言われるように、普通の感覚の人なら、初期化リストの記述順も合わせるで
しょうから、気にしなくてもいいと言えばそうですけど、メンバーの宣言順
に注意する必要がある場合がある事は確かなようです。ハイ。

# 変なところで、変な事が勉強になった(笑)
# 多重継承とか、仮想基底クラスとかもめったにお目にかからないから
# 忘れている事も多いのだろうなぁ(^^;)

ではでは。
31

[mfc 18813] Re: CRichEditCtrl でのDrag&Drop について

以前、僕も似たような質問をしたことがあります。
> フォームビューに、リッチエディットを2枚張り付け(Rich1,
> Rich2とする)両者の間で Drag & Drop 操作をしたいのですが、
> この時、特にコードで Drag&Drop の処理を書かなくても
> Drag&Drop の働きをしてくれます。(これも疑問ですが??)
これは、リッチエディットは、OLEサーバとして働くからです。
> この時に、ドラッグの開始やドロップ時に処理をしたいのですが
> どのハンドラが呼び出されるのか解りません。
> CWnd::OnDrop()は、ブレークで止まりませんでした。
QueryAcceptData()が、呼び出されます。
過去ログから、引用
> CLIPFORMAT cfFileName = ::RegisterClipboardFormat(CFSTR_FILENAME);
> if (dataobj.IsDataAvailable(cfFileName))
> {
>     HGLOBAL hMem = dataobj.GetGlobalData(cfFileName);
>     LPCTSTR lpszPath = (LPCTSTR)::GlobalLock(hMem);
>     AfxGetApp()->OpenDocumentFile(lpszPath); // ファイルを開く例
>     ::GlobalUnlock(hMem);
>     ::GlobalFree(hMem);
>     return S_FALSE;
> }
このようにすれば、取り出せますが、
HRESULT CView::QueryAcceptData
    ( LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat,
         DWORD dwReco, BOOL bReally, HGLOBAL hMetaFile ){
return E_FAIL;
}

とすれば、OnDrop()も来るようになります。


+-----------------------------+
   YOTARO 
  (y...@mail.goo.ne.jp)
  http://yo-taro.com/
+-----------------------------+
31

[mfc 18811] Re: メンバ変数の宣言につい て

まさしです。

In [mfc 18808] Re: メンバ変数の宣言について 
At [Tue, 31 Aug 1999 15:27:24 +0900]
VFC-LINK <P...@nifty.ne.jp> Wrote:

> メンバ初期化リストは左から評価されます。
> だから、順番を間違えては変なことになります。

> と、普通のC++userなら思うでしょうね(^^;
> VC5だと、C++言語リファレンスの「メンバ オブジェクト, 初期化」の
> ヘルプトピックの下の方に・・・。

> 「警 告
>  コンストラクタでメンバ初期化子をどのような順序で指定しても、
>  メンバが初期化される順序は変わりません。メンバは、クラスで
>  宣言された順に初期化されます。」

> ま、他のプラットフォームに移植することを考えたら、記述順番も考慮
> すべきなのでしょうね。たぶん。

心配だったので、MSDN で調べて、「そうなのか~」と思ったんだけど、
そうじゃない可能性もあるって事!?

ちなみに、多重継承した場合の初期化順は、初期化リストの順ではなく、
ベースクラスリストの記述順ということなので、つじつまが合っていると思った
のだけど...。
# これも MSDN だったような気はするけど...

気になるな~(笑)。そのうち調べよう。
# 最近増えた C++ の機能の整理用に C++ の本買ったのに行方不明だ(;_;)。

ではでは。
31

[mfc 18812] Re: メンバ変数の宣言につい て

まさしです。

In [mfc 18793] Re: メンバ変数の宣言について
kisax <k...@eastmail.com> Wrote:

> そうなんですか?メンバ変数はデフォルトコンストラクタおんりーなんじゃ。。

他の人の投稿とか見ればわかると思うけどそれはちゃいます。

> C++の仕様を調べるのがめんどくさくて調べてないですけど、ちなみに上記のソー
> スはコンパイル通らなかったですよ?

実際に下記のコードでテストしてから投稿しているんですけど(^^;)
# VC++6 です。

class CMyClass  
{
public:
    CMyClass();
    virtual ~CMyClass();

    CInternetSession m_testInet;
    CFtpConnection* m_ptestConnection;
    CFtpFileFind m_testFind;
};

CMyClass::CMyClass()
: m_ptestConnection(m_testInet.GetFtpConnection("string")),
  m_testFind(m_ptestConnection)
{
}

ではでは。
記事検索
Amazon.co.jp
  • ライブドアブログ