Ошибка C2248: защищенный конструктор по умолчанию C ++ в классе, принадлежащем другому классу - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь обойти эту ошибку, полученную из компилятора Microsoft Visual Studio 10. Ошибка: Some class : error C2248: cannot access protected member declared in class ''. Вот код, который воспроизводит эту ошибку. Я не могу понять, как создать объект, которому принадлежит другой объект, имеющий защищенный конструктор по умолчанию. У меня есть другой конструктор, который принимает входной параметр, но не может вызвать его, независимо от того, какие логические рассуждения я применяю. Очевидно, я упускаю что-то глупое или действительно важное, поэтому я надеваю это здесь, чтобы посмотреть, сможет ли кто-нибудь уловить мою ошибку. Спасибо всем !!!

#ifndef FOO_H
#define FOO_H

class Foo {
    public :
        int myFooInt;

        ~Foo();

        Foo(int fooInt);

    protected :   //Uncomment to generate C2248 Error
        Foo();
};

#endif

.

#include "foo.h"

Foo::Foo() {

}
Foo::Foo(int fooInt) : myFooInt(fooInt) {

}

Foo::~Foo() {
}

.

#ifndef GOO_H
#define GOO_H

#include "foo.h"

class Goo {
    public :

        ~Goo();

        Goo();

        Goo(Foo foo);

        Foo myFoo;

};

#endif 

.

#include "Goo.h"

Goo::Goo() {

}

Goo::Goo(Foo foo) : myFoo (foo) {
}

Goo::~Goo() {
}

.

#include "foo.h"
#include "goo.h"

void main() {
    Foo foo(5);
    Goo goo(foo);
}

Ответы [ 3 ]

3 голосов
/ 26 октября 2011

У меня есть другой конструктор, который принимает входной параметр, но не может вызвать его, независимо от того, какие логические рассуждения я применяю.

Ах, теперь мы переходим к важной части (и извините, что другие ответы не дают вам признания за понимание ключевого слова protected, но вы делаете кажется, немного запутался, как вы представляете свой вопрос).У вас есть этот конструктор, но у вас также есть конструктор по умолчанию.Неважно, сколько рабочих конструкторов вы пишете;нерабочий вызов будет по-прежнему вызывать ошибки во время компиляции.

Ваш конструктор по умолчанию для класса контейнера не имеет списка инициализации и поэтому будет пытаться использовать конструкторы по умолчанию для членов данных.Поскольку у вас нет доступа к конструктору по умолчанию для члена, компиляция конструктора контейнера по умолчанию завершается неудачей.

Возможное решение: явная инициализация члена с помощью другого конструктора в списке инициализации конструктора контейнера по умолчанию.Это означает, что вам придется каким-то образом составить стоимость.(Это не всегда возможно. Когда это происходит, компилятор говорит вам, что наличие конструктора по умолчанию не имеет смысла для класса контейнера. :))

0 голосов
/ 26 октября 2011

Вы не можете получить доступ к защищенному члену с помощью класса, который:

a) не является тем же классом

b) не является классом, производным от класса с защищенным членом.

0 голосов
/ 26 октября 2011

protected члены должны быть доступны только для одного и того же экземпляра производного класса, а не для объектов, содержащих такой член. То, что вы хотите сделать, не может быть сделано, Goo не разрешено создавать созданный по умолчанию экземпляр Foo для вашего запроса конструктора по умолчанию protected.

...