«Body2D» не является доступной базой «Ёжика» - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть Hedgehog класс, который наследует Body2D класс. Я хочу, чтобы Hedgehog использовал функцию рисования Body2D по умолчанию (это render(SDL_Surface* )), потому что в этом случае она не имеет поведения c, специфичного для класса, но у меня есть ошибка:

||=== Build: Debug in SDLApples (compiler: GNU GCC Compiler) ===|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp||In function ‘int main(int, char**)’:|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|84|error: ‘void Body2D::render(SDL_Surface*)’ is inaccessible within this context|
engine/include/Body2D.h|37|note: declared here|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|84|error: ‘Body2D’ is not an accessible base of ‘Hedgehog’|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|85|error: ‘void Body2D::render(SDL_Surface*)’ is inaccessible within this context|
engine/include/Body2D.h|37|note: declared here|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|85|error: ‘Body2D’ is not an accessible base of ‘Apple’|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

Мой Hedgehog класс - это просто простое тело, которое перемещается с одной стороны экрана на другую и обратно. Вот это исходный код . Body2D класс - это абстрактное тело в 2D мире, которое можно рисовать, обновлять и взаимодействовать с другими телами в одном и том же World. Вот заголовочный файл Body2D и source . И вот main, который их вызывает:

#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif

#include <SDL/SDL.h>

#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
#include "Hedgehog.cpp"
#include "Apple.cpp"
#include "World.h"
#include <vector>

#define APPLE_COUNT 5

int main ( int argc, char** argv )
{
    // initialize SDL video
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "Unable to init SDL: %s\n", SDL_GetError() );
        return 1;
    }
    atexit(SDL_Quit);

    // create a new window
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        printf("Unable to set 640x480 video: %s\n", SDL_GetError());
        return 1;
    }

    //------------------------------------------------------------------
    //OBJECTS HERE
    World scene;
    Hedgehog hg(440, 280, scene);

    std::vector<Apple> apples;
    for(int i = 0; i < APPLE_COUNT; i++)
    {
        apples.push_back(Apple(i*100, -50, scene));
    }
    //------------------------------------------------------------------

    // program main loop
    bool done = false;
    while (!done)
    {
        //======message processing loop======
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            // check for messages
            switch (event.type)
            {
                // exit if the window is closed
            case SDL_QUIT:
                done = true;
                break;

                // check for keypresses
            case SDL_KEYDOWN:
                {
                    if (event.key.keysym.sym == SDLK_ESCAPE) done = true;
                    if (event.key.keysym.sym == SDLK_RETURN) ; //Apples fall here
                    break;
                }
            } // end switch
        } //======end of message processing=====


        // UPDATE
        hg.update();
        for(Apple apple: apples) apple.update();

        // RENDER
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
        hg.render(screen);
        for(Apple apple: apples) apple.render(screen);

        SDL_Flip(screen);
    } // end main loop

    printf("Exited cleanly\n");
    return 0;
}

Итак, вопрос: могу ли я использовать функцию базового класса, не переопределяя ее? Или поведение по умолчанию разрешено только для объектов самого базового класса?

ps Я изучал Java в течение нескольких лет, но теперь я должен использовать C ++, поэтому, может быть, я делаю какую-то распространенную ошибку Java -программиста в понимании языкового видения наследования?

1 Ответ

1 голос
/ 04 апреля 2020

В C ++ вы должны использовать модификатор доступа при наследовании от базового класса, в противном случае private наследование по умолчанию предполагается для классов, см. этот ответ . Поэтому ваш код должен быть исправлен путем наследования с использованием модификатора public:

class Hedgehog : public Body2D

Нет аналогичного принципа в ключевом слове Java, extends не может изменять модификаторы доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...