c ++交叉访问类方法

时间:2011-09-30 07:47:13

标签: c++ gtkmm

我对cpp(在python中工作)不是很有经验。 我有以下问题:

1)我有一个主类A(窗口)和方法m_A1和m_A2

2)我有一个带有回调m_B1

的小班B(对话框)

3)在m_A1

内实例化并销毁B类

4)从回调m_B1我需要调用m_A2

我试图给B引用A的实例(带'this')但是这个在python中工作的解决方案没有。

我试图在A里面声明B类,让B中的A方法可以访问,但是我无法理解如何编写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 :(得分:0)

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());
}

答案 1 :(得分:0)

在DebugDialog属性中添加Centrino引用,并在DebugDialog构造函数中提供它。声明Centrino :: io_process_incoming_command()方法public并从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());
}