Статическая инициализация структуры с членами класса - PullRequest
4 голосов
/ 19 мая 2010

У меня есть структура, которая определяется с большим количеством ванильных char* указателей, но также является членом объекта. Когда я пытаюсь статически инициализировать такую ​​структуру, я получаю ошибку компилятора.

typedef struct 
{
    const char* pszA;
    // ... snip ...
    const char* pszZ;

    SomeObject obj;
} example_struct;

// I only want to assign the first few members, the rest should be default
example_struct ex = { "a", "b" };

SomeObject имеет открытый конструктор по умолчанию без аргументов, поэтому я не думал, что это будет проблемой. Но когда я пытаюсь скомпилировать это (используя VS), я получаю следующую ошибку:

error C2248: 'SomeObject::SomeObject' : cannot access private member declared in class 'SomeObject'

Есть идеи почему?

Обновление: Вот определение SomeObject

class SomeObject
{
    void operator=(const SomeObject&);
    SomeObject(const SomeObject&);
public:
    SomeObject()
        {
            // etc
        }

    // members snipped
}

Ответы [ 3 ]

5 голосов
/ 19 мая 2010

Ваша инициализация ex выполняет копирование-инициализация . Он принимает значение справа и использует его для инициализации переменной слева. Для членов типа класса используется соответствующий конструктор. В вашем случае это означает, что вы вызываете конструктор копирования для SomeObject, но вы сделали этот конструктор закрытым, поэтому компилятор правильно сказал, что SomeObject::SomeObject - закрытый член, к которому нельзя получить доступ.

Хотя компилятору разрешено исключить вызов для конструктора копирования и инициализировать ex.obj непосредственно конструктором по умолчанию, это дополнительная оптимизация; ему все еще нужно разрешить для вызова конструктора копирования.

Вы можете либо дать example_struct свой собственный конструктор и использовать его вместо инициализации фигурной скобки, либо вы можете опубликовать конструктор копирования SomeObject.

2 голосов
/ 19 мая 2010

Остальные члены будут инициализированы как «0», а не «по умолчанию», верно? Поэтому он, вероятно, пытается вызвать SomeObject(0), что, как я предполагаю, разрешается в конструкторе приватной копии.

1 голос
/ 19 мая 2010

Похоже, что конструктор для SomeObject является приватным.

...