C не позволяет мне создавать частный конструктор (или как я могу имитировать это использование)

#c #inheritance #sdl-2

#c #наследование #sdl-2

Вопрос:

Мне нужно создать частный конструктор, чтобы все, что наследует класс, не вызывало конструктор снова. Например:

 
class Main
{
    private:
        Main()
        {
            std::cout << "Main Constructor calledn";
            SDL_Init(SDL_INIT_VIDEO);
            window = SDL_CreateWindow("Program", 0, 30, 1280, 720, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE );
            renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );

            running = true;
        }


        ~Main()
        {
            std::cout << "Main Destructor calledn";
            SDL_DestroyRenderer(renderer);
            SDL_DestroyWindow(window);

            SDL_Quit();
        }

    public:
        SDL_Window* window;
        SDL_Renderer* renderer;
        SDL_Event event;
        bool running;

};
 

все, что наследует класс Main (по крайней мере, я думаю), не вызовет конструктор? Если это не так, как я могу получить такое же использование, чтобы мой Main конструктор вызывался только ОДИН РАЗ. (ошибка error: 'Main::Main()' is private

Комментарии:

1. Rectangle Расширяется Main или вы просто хотите использовать Main члены s?

2. у вас есть Main m; и Rectangle rectangle; который выполняет в общей сложности 2 вызова constructor of Main . Пожалуйста, уточните, включите выходные и ожидаемые выходные данные в вопрос

3. Простите, я довольно новичок в этом, но есть ли разница между расширением и использованием элементов сети? Что бы расширение main позволило мне делать стихи с использованием элементов сети. ?

4. @largest_prime_is_463035818 Да, я бы предпочел, чтобы у меня был только один вызов конструктора Main, как я могу этого добиться (а также использовать класс Rectangle)

5. ваш вопрос не совсем ясен. Пожалуйста, добавьте выходные и ожидаемые выходные данные и объясните, почему вы наследуете Rectangle от Main

Ответ №1:

Ваш другой класс не должен наследовать от Main . у них может быть ссылка на него (либо как член, либо как параметр вызова функции).

Main конструктор может быть общедоступным:

 class Main
{
public:
    Main()
    {
        assert(running == false);
        std::cout << "Main Constructor calledn";
        SDL_Init(SDL_INIT_VIDEO);
        window = SDL_CreateWindow("Program", 0, 30, 1280, 720, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE );
        renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );

        running = true;
    }

    Main(const Mainamp;) = delete;
    Main(Mainamp;amp;) = delete;
    Mainamp; operator=(const Mainamp;) = delete;
    Mainamp; operator=(Mainamp;amp;) = delete;

    ~Main()
    {
        std::cout << "Main Destructor calledn";
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);

        SDL_Quit();
        running = false;
    }

public:
    SDL_Window* window = nullptr;
    SDL_Renderer* renderer = nullptr;
    SDL_Event event;
    static bool running;
};
static bool Main::running = false;

struct Rectangle
{
    Point bottomLeft;
    Point topRight;
};

void Draw(Mainamp;, const Rectangleamp;);
 

Комментарии:

1. При этом, как я могу иметь другие классы, которые используют переменные-члены из Main без передачи ссылки? Например, если у меня несколько файлов, мне не нужно продолжать #include "main.h" использовать всю основную информацию?

2. При вашем наследовании вы должны «#включить main.h». С указателем / ссылкой может быть достаточно прямого объявления, и только файлы, использующие member, должны выполнять #include .

3. Ах, хорошо, другое дело, я не совсем уверен, что понимаю, что все эти строки, где у вас есть Mainamp;... = delete;

4. О, и также, с синглетами, как я только что обнаружил, вы можете сделать так, чтобы при объявлении Main вы могли получить только ссылку на него, вы не могли создать его экземпляр (будет создан только 1). Как я могу сделать то же самое здесь с main, чтобы случайно не создать его экземпляр?

5. это =delete запретить вызов этого метода. Singleton в основном это анти-шаблон.