c ++ перекрестный доступ к методам классов - PullRequest
0 голосов
/ 30 сентября 2011

Я не очень опытен в cpp (раньше работал на python).У меня есть следующая проблема:

1) У меня есть главный класс A (окно) и методы m_A1 и m_A2

2) У меня есть маленький класс B (диалог) собратный вызов m_B1

3) экземпляр класса B создается и уничтожается внутри m_A1

4) из обратного вызова m_B1 Мне нужно вызвать m_A2

Я пытался дать ссылку на Bк экземпляру A (с 'this'), но это решение, которое работало здесь на python, не работает.

Я пытался объявить класс B внутри A, чтобы методы A были доступны внутри B, ноЯ не могу понять, как написать код методов B, например, написать конструктор класса B будет A :: B :: A :: B (), но дает синтаксические ошибки.

Вотнемного кода:

class Centrino
{
public:
    Centrino();
    virtual ~Centrino();

    Gtk::Window  *mp_window;

protected:
    ...
    bool  on_window_key_press(GdkEventKey *event);
    void  io_process_incoming_command(char *in_str_complete);
    ...
};

class DebugDialog : public Gtk::Dialog
{
public:
    DebugDialog(const char *title, Gtk::Window& parent, bool modal);
    virtual ~DebugDialog() {};

protected:
    void  on_button_send_clicked();
    ...
};

void  Centrino::io_process_incoming_command(char *in_str_complete)
{
    ...
}

bool  Centrino::on_window_key_press(GdkEventKey *event_key)
{
    if(event_key->state & GDK_CONTROL_MASK)
    {
        if((event_key->keyval == GDK_KEY_d) || (event_key->keyval == GDK_KEY_D))
        {
            DebugDialog  dialog("Debug Dialog", *mp_window, true);
            int  response = dialog.run();
        }
    }
    ...
}

void  DebugDialog::on_button_send_clicked()
{
    Glib::ustring  entry_content = m_entry.get_text();
    io_process_incoming_command(entry_content.c_str());
}

Centrino - это класс, который я назвал A, DebugDialog - это класс, который я назвал B. Из DebugDialog :: on_button_send_clicked () мне нужно вызвать Centrino :: io_process_incoming_command ().Область действия экземпляра класса DebugDialog находится внутри Centrino :: on_window_key_press ().Кто-нибудь может указать мне пример?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Добавьте ссылку Centrino в атрибутах DebugDialog и предоставьте ее в конструкторе DebugDialog.Объявите метод Centrino :: io_process_incoming_command () открытым и вызовите его из метода DebugDialog :: on_button_send_clicked ():

class Centrino
{
public:
    Centrino();
    virtual ~Centrino();

    Gtk::Window  *mp_window;

    void  io_process_incoming_command(char *in_str_complete);
protected:
    ...
    bool  on_window_key_press(GdkEventKey *event);

    ...
};

bool  Centrino::on_window_key_press(GdkEventKey *event_key)
{
    if(event_key->state & GDK_CONTROL_MASK)
    {
        if((event_key->keyval == GDK_KEY_d) || (event_key->keyval == GDK_KEY_D))
        {
            DebugDialog  dialog("Debug Dialog", *mp_window, true, *this);
            int  response = dialog.run();
        }
    }
    ...
}

class DebugDialog : public Gtk::Dialog
{
public:
    DebugDialog(const char *title, Gtk::Window& parent, bool modal, Centrino &centrino);
    virtual ~DebugDialog() {};

protected:
    void  on_button_send_clicked();
    ...

    Centrino &centrino_;
};

DebugDialog::DebugDialog(const char *title, Gtk::Window& parent, bool modal, Centrino &centrino) :
    ....
    centrino_(centrino)
{
    ...
}

void  DebugDialog::on_button_send_clicked()
{
    Glib::ustring  entry_content = m_entry.get_text();
    centrino_.io_process_incoming_command(entry_content.c_str());
}
0 голосов
/ 30 сентября 2011

Область действия DebugDialog является глобальной, и как написано, DebugDialog имеет нет знания контекста, в котором он был создан. Вам нужно пройти и сохраните эту информацию явно:

class DebugDialog : public Gtk::Dialog
{
    Centrino* myOwner;

public:
    DebugDialog( Centrino* owner, const char *title, Gtk::Window& parent, bool modal );
    virtual ~DebugDialog() {};

protected:
    void  on_button_send_clicked();
    ...
};

DebugDialog::DebugDialog( Centrino* owner... )
    : myOwner( owner )
    , ...

void  Centrino::io_process_incoming_command(char *in_str_complete)
{
    ...
}

bool  Centrino::on_window_key_press(GdkEventKey *event_key)
{
    if(event_key->state & GDK_CONTROL_MASK)
    {
        if((event_key->keyval == GDK_KEY_d) || (event_key->keyval == GDK_KEY_D))
        {
            DebugDialog  dialog(this, "Debug Dialog", *mp_window, true);
            int  response = dialog.run();
        }
    }
    ...
}

void  DebugDialog::on_button_send_clicked()
{
    Glib::ustring  entry_content = m_entry.get_text();
    myOwner->io_process_incoming_command(entry_content.c_str());
}
...