0

C++ では、問題は単純です。

私は2つのクラスを持っています.1つは実装の一部としてもう1つを含んでいます.

struct A
{
    void do_something()
    {
    };
};

struct B
{
    A obj_A;
    void hello_world()
    {
    };
};

ここで問題は、sizeof(B) とタイプ B のオブジェクトを実行するときに A が B の一部である場合、構造 B が 1 バイト大きくなることです。A には 100% 非仮想メンバーのみが含まれます (仮想テーブルは必要ありません)。 typeid チェックの必要はありません。B から不要なバイトを完全に削除する方法 (コンパイラ ディレクティブなど) はありますが、B を介して A のメンバー関数にアクセスする方法はありますか?

余分なバイトは、A の名前「A」に char* を追加したコンパイラであるとしか考えられませんが、他のアイデアが役立つ場合があります。

4

2 に答える 2

4

sizeof(A)を0にすることはできません。これは、オブジェクトの各部分が「アドレス可能」である必要があるためです(つまり、演算子&を使用する場合は異なるアドレスを持つ必要があります)。

struct A
{
};

struct B
{
    A m_a1;
    A m_a2;
};

void test()
{
    B b;
    A* pa1 = &b.m_a1;
    A* pa2 = &b.m_a2;

    // "pa1" need to be different from "pa2" 
}
于 2009-05-11T23:33:31.697 に答える