の参照にC++はstatic_castは、これはC++ 11Cスタイルキャストやポインタ
私はMicrosoftの CMapStringToOb::GetNextAssoc、の3番目のパラメータに興味以下ました定義はありません私はテストのための簡単なコードを持っている:2つの良いケースと1つのケースは、コンパイラのエラーです。
class CMyObject : public CObject //in order to use CMapStringToOb
{
public:
CMyObject(CString name_)
:name(name_)
{
}
void SayHello()
{
TRACE(_T("hello") + name);
}
CString name;
};
void main()
{
CMapStringToOb myMap;
myMap.SetAt(_T("a"), new CMyObject(_T("aaa")));
myMap.SetAt(_T("b"), new CMyObject(_T("bbb")));
myMap.SetAt(_T("c"), new CMyObject(_T("ccc")));
//good case 1
POSITION pos = myMap.GetStartPosition();
while (pos)
{
CString s;
CMyObject* pMine = NULL;
myMap.GetNextAssoc(pos, s, (CObject*&)pMine);
if(pMine)
{
pMine->SayHello();
}
}
//good case 2
pos = myMap.GetStartPosition();
while (pos)
{
CString s;
CObject* pObject = NULL;
myMap.GetNextAssoc(pos, s, pObject);
if(pObject)
{
CMyObject* pMine = static_cast<CMyObject*>(pObject);
pMine->SayHello();
}
}
//bad case:
//can not compile
// error C2440: 'static_cast' : cannot convert from 'CMyObject *' to 'CObject *&'
// static_cast and safe_cast to reference can only be used for valid initializations or for lvalue casts between related classes
pos = myMap.GetStartPosition();
while (pos)
{
CString s;
CMyObject* pMine = NULL;
myMap.GetNextAssoc(pos, s, static_cast<CObject*&>(pMine)); //compile error
if(pMine)
{
pMine->SayHello();
}
}
}
私がしようとしていたのは、Cスタイルのキャストをこの場合のC++スタイルのキャストに置き換える適切な方法を見つけることでした。
がthisから読み出し、それを挙げる:
Cキャストは、(型)オブジェクトまたはタイプ(オブジェクト)を使用してキャストしています。 をキャストC-スタイルは成功し、次の最初のように定義されます。
const_cast static_cast (though ignoring access restrictions) static_cast (see above), then const_cast reinterpret_cast reinterpret_cast, then const_cast
Q1:(例えば右辺値のために)何かを欠落している上記のリストは、ましたか?
Q2:Cスタイルのキャストをこの場合のC++スタイルのキャストに変換する適切な方法は何ですか? (良いケース2は動作しますが、より簡潔なものがあります)
Q3:rValueのCスタイルキャストはどのように行われますか? (換言すれば、なぜ良いケース1が働くのか説明してください)
リファレンスとポインタの型に 'reinterpret_cast'を使う必要があります。 – paddy
@paddy: "参照とポインタ"は "*&"を意味しますか?言い換えれば、次の2つのステートメントは正しいか? S1: "参照タイプにreinterpret_castを使用する必要があります。" S2: "ポインタ型にreinterpret_castを使う必要があります。" – milesma
はい。あなたが持っているのは、ポインタ型への参照です。私は 'reinterpret_cast'を使う必要があることを指摘しました。 – paddy