2016-07-28 3 views
1

Я просмотрел похожие вопросы из stackoverflow, но пока не нашел ответа.Ошибка C++ C2248: невозможно получить доступ к закрытому члену, объявленному в классе SUPER

Вот мой подкласс декларации:

class Enemy : public Entity 
{ 
public: 
    Enemy(); 
    ~Enemy(); 
}; // This is the line that shows the error... 

Вот мой суперкласс декларация:

class Entity 
{ 
//Member Methods: 
public: 
    Entity(); 
    ~Entity(); 

bool Initialise(Sprite* sprite); 
void Process(float deltaTime); 
void Draw(BackBuffer& backBuffer); 

void SetDead(bool dead); 
bool IsDead() const; 

bool IsCollidingWith(Entity& e); 

float GetPositionX(); 
float GetPositionY(); 

float GetHorizontalVelocity(); 
void SetHorizontalVelocity(float x); 

float GetVerticalVelocity(); 
void SetVerticalVelocity(float y); 

protected: 

private: 
Entity(const Entity& entity); 
Entity& operator=(const Entity& entity); 

//Member Data: 
public: 

protected: 
Sprite* m_pSprite; 

float m_x; 
float m_y; 

float m_velocityX; 
float m_velocityY; 

bool m_dead; 

private: 

}; 

У меня уже есть подкласс под названием PlayerShip используя ту же структуру, но один работает отлично. Так где же может пойти не так?

+0

Покажите нам точную строку кода, которая производит эту ошибку. – TerraPass

+0

Это неверный код, показывающий ошибку. Покажите код, показывающий ошибку. Это очень простая ошибка. – Ajay

+0

Это последняя строка в классе Enemy, после}; @Ajay Спасибо заранее! – Wilheim

ответ

2
private: 
Entity(const Entity& entity); 
Entity& operator=(const Entity& entity); 

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

Минимальный пример для получения аналогичной ошибки:

class Entity 
{ 
//Member Methods: 
public: 
    Entity(); 
    ~Entity(); 

private: 
Entity(const Entity& entity); 
Entity& operator=(const Entity& entity); 

}; 

class Enemy : public Entity 
{ 
public: 
    Enemy(){} 
    ~Enemy(){} 
}; 

int main() 
{ 
    Enemy e1, e2 = e1; 
    return 0; 
} 
+0

Итак, что я могу сделать в классе Enemy, чтобы избежать этой ошибки? @StoryTeller – Wilheim

+0

@Wilheim, определите действительный экземпляр c'tor (и оператор присваивания) явно для 'Enemy' или для' Entity'. – StoryTeller

1

Да. Работа, которую вы сделали, великолепна. Вы знаете, всякий раз, когда вы вызываете конструкторы класса Enemy, он переходит к конструкторам, которые были объявлены ранее в суперклассе по умолчанию, и если u объявил их в более раннем порядке в суперклассе, тогда u может получить ошибку. Я думаю, вы ошиблись в порядке компиляции кода.

+0

'u' - это письмо, а не слово. Если вы хотите быть ценным вкладчиком в сообщество SO, пожалуйста, найдите время для работы над читабельностью вашего сообщения. – StoryTeller

+0

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

+0

Может быть, это рэп ... Вы знаете ... Общественный Враг решит проблему. – Kahler

2

Как правило, вы не можете получить доступ к частным функциям или конструктору суперкласса entity, когда вы используете объект класса, первый вызывающий конструктор суперкласса вызывается, а затем вызывается конструктор подкласса.

Здесь конструктор вашего суперкласса объявлен как private.So, при использовании подклассов enemy первый конструктор суперкласса entity называется, а затем конструктор класса суб enemy называется.

В вашем конструкторе кода суперкласса entity является приватным, который вызывается первым, когда вы используете объект подкласса enemy, к которому невозможно получить доступ, и почему возникает ошибка.

+0

Непонятное предложение.Пожалуйста, перефразируйте. – Ajay