0

コンパイルされないC++の次のコードがあります。

class Container;
class Container
{
    std::string m_Name;
    Container m_Container;
};

これは、同じタイプのメンバーがあり、コンパイラーがここでオブジェクトのサイズを推測できないためです。

C#を使用してこれを機能させる理由は何ですか?

namespace Sample
{
    public class Container
    {
        public string m_Name;
        public Container m_Container;
    }
}

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Container con = new Container();

        }
    }
}

これはC#で正常にコンパイルされます。ここでオブジェクトのサイズはどのように計算されますか?

4

1 に答える 1

9

C#で機能するという事実は、すべてのオブジェクトがポインターとして処理されることです。つまり、C#コードは次のC++コードと同等になります。

class Container;
class Container
{
    std::string* m_Name;
    Container* m_Container;
};

ポインタのサイズは既知であるため、すべてがコンパイルされます。オブジェクトのサイズを知る必要はまったくありません。ただし、 C ++でポインター、特に生のポインターを投げたくはありません。

元の実装では、オブジェクトのサイズは不明であるだけでなく、それぞれContainerに別のオブジェクトがContainer含まれているため無限であることに注意してくださいContainer...

于 2012-06-02T02:23:50.920 に答える