#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 ofMain
. Пожалуйста, уточните, включите выходные и ожидаемые выходные данные в вопрос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
в основном это анти-шаблон.