我正在学习使用c ++构建程序,并且陷入了基本的困境。我使用SDL2来获取和处理屏幕等的输入。我已经定义了一个对象" Program"和一个对象" EventHandler"。 " EventHandler"处理所有事件(将事件发送到较低级别的对象),但是" EventHandler"还应该能够创建一个新窗口,从而访问" Program"。
这意味着我猜那" EventHandler"应与#34; Program"处于同一水平他们都应该能够相互沟通。这可以用c ++完成吗?也许还有其他更合乎逻辑的方法。
下面的代码显然不起作用,因为定义了类的顺序,以及我的自制"& this"发送"程序"的地址这是错误的,但它很好地概述了我想要做的事情。
//handles all events, is in contact with and same level as Program
class EventHandler {
private:
Program *program = NULL;
SDL_Event e;
//inputarrays
const Uint8 *currentKeyStates;
int mouseX = 0;
int mouseY = 0;
bool mousemotion = false;
int mouseButtons[4] = {0, 0, 0, 0};
public:
EventHandler(Program *p) {
program = p;
}
void handleEvents() {
while(SDL_PollEvent(&e) != 0) {
}
}
};
class Program {
private:
EventHandler *eh = NULL;
std::vector<Window> windows;
public:
bool running;
Program() {
//Here the most basic form of the program is written
//For this program we will use SDL2
//Initialize SDL
SDL_Init(SDL_INIT_EVERYTHING);
//This program uses 1 window
Window window(200, 200, 1200, 1000, "");
windows.push_back(window);
//Adds an event handler
eh = new EventHandler(&this);
//now simply run the program
run();
}
void run() {
running = true;
//while (running) {
//}
SDL_Delay(2000);
delete eh;
//Quit SDL subsystems
SDL_Quit();
}
};
int main( int argc, char* args[]) {
Program program;
return 0;
}
答案 0 :(得分:3)
是的,这是可能的,而且你很接近!
this
已经是一个指针。 [not] 已经是“Program
”的地址。
当你写&test
时,你得到一个指向指针的指针,这不是你想要的。
所以你只需写:
new EventHandler(this);
现在我并不是说这种紧密耦合是一个好主意,但我承认我过去做过类似的事情,它可以达到可接受的程度。
如果您从Program
中取出您想要分享的任何资源并在两个类之间分享它们,那么您的设计会更清晰,更清晰。
答案 1 :(得分:0)
您需要的是Program
class Program;
class EventHandler
{
private:
Program *program;
....
};
class Program
{
....
};
这种声明允许您在完全定义类型之前声明指向Program
个对象的指针。