是否可以在对象中创建一个对象,该对象具有在c ++中创建它的对象作为构造函数

时间:2015-12-30 13:05:04

标签: c++ class object

我正在学习使用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;
}

2 个答案:

答案 0 :(得分:3)

是的,这是可能的,而且你很接近!

this已经是一个指针。 [not] 已经是“Program”的地址。
当你写&test时,你得到一个指向指针的指针,这不是你想要的。

所以你只需写:

new EventHandler(this);

现在我并不是说这种紧密耦合是一个好主意,但我承认我过去做过类似的事情,它可以达到可接受的程度。

如果您从Program中取出您想要分享的任何资源并在两个类之间分享它们,那么您的设计会更清晰,更清晰。

答案 1 :(得分:0)

您需要的是Program

forward declaration
class Program;

class EventHandler 
{
private:
    Program *program;
....
};

class Program
{
....
};

这种声明允许您在完全定义类型之前声明指向Program个对象的指针。