Структура внутри структуры: ошибка «Недопустимая ссылка на нестатический член» - PullRequest
1 голос
/ 24 мая 2019

Мне нужно создать структуру внутри структуры.Как правильно закодировать конструктор?Нужно ли создавать два конструктора отдельно для A и B или я могу использовать только один «внешний» конструктор для A, как в примере ниже?Мои попытки привели к ошибке C2597.

struct A
{
    struct B
    {
        unsigned n;
        int* d;
    };

    A(unsigned c)
    {
        B::n = c; // C2597
        B::d = new int[c]; // C2597
    }
};

Ответы [ 3 ]

5 голосов
/ 24 мая 2019

Вам нужно либо сделать члены B статическими (но в этом случае у вас будет одно значение для всей программы или dll в случае Windows):

struct A
{
    struct B
    {
        static unsigned n;
        static int* d;
    };

    A(unsigned c)
    {
        B::n = c;
        B::d = new int[c];
    }
};

или создайте экземпляр B:

struct A
{
    struct B
    {
        unsigned n;
        int* d;
    };

    A(unsigned c)
    {
        B b;
        b.n = c;
        b.d = new int[c];
    }
};

Если вы имели в виду A, чтобы содержать B - это то, что вам нужно сделать:

struct A
{
    struct B
    {
        unsigned n;
        int* d;
    } b;

    A(unsigned c)
    {
        b.n = c;
        b.d = new int[c];
    }
};
3 голосов
/ 24 мая 2019

Вам нужен экземпляр из B, чтобы получить доступ к членам n и d.

struct B
{
    unsigned n;
    int* d;
} b; // Create an instance of `B`

A(unsigned c)
{
    b.n = c;
    b.d = new int[c]; // ToDo - you need to release this memory, perhaps in ~B()
}

Либо так, либо сделайте их static.

2 голосов
/ 24 мая 2019

Вы не объявили члена, в вашем коде B вложенный класс класса A.

Вы должны объявить члена этого класса.

struct A
{
    struct B
    {
        unsigned n;
        int* d;
    }; // this is a class-type declaration

    B data; // this is member of class A having type of class B

    A(unsigned c) 
    {
        data.n = c; 
        data.d = new int[c]; 
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...