我对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()中。 任何人都能指出我的一个例子吗?提前谢谢。
答案 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 ¢rino);
virtual ~DebugDialog() {};
protected:
void on_button_send_clicked();
...
Centrino ¢rino_;
};
DebugDialog::DebugDialog(const char *title, Gtk::Window& parent, bool modal, Centrino ¢rino) :
....
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());
}