【问题标题】:Why are variables - marked <<<<<< undefined [closed]为什么变量 - 标记为 <<<<<< 未定义 [关闭]
【发布时间】:2021-11-12 10:56:25
【问题描述】:

我是 C++ 和 wxWidgets 的新手,并试图遵循一个基本示例,除了由 标记的 OnButtonClicked 之外,该示例似乎可以运行

在构建阶段变量未定义(如果我注释掉这两行代码将运行)

变量m_list1和m_txt1的定义有问题吗?

    //===================cMain.h ===========
#pragma once    //see 22:450
#include "wx/wx.h"

class cMain : public wxFrame
{
public:
    cMain();
    ~cMain();
public:
    wxButton *m_btn1 = nullptr;  //25:48
    wxTextCtrl *m_txt1 = nullptr;
    wxListBox *m_list1 = nullptr;

    void OnButtonClicked(wxCommandEvent &evt);  //27:30
    wxDECLARE_EVENT_TABLE();  // 27:34
};
    //===================cMain.cpp ===========
#include "cMain.h"

wxBEGIN_EVENT_TABLE(cMain,wxFrame)  // 28:00
    //EVT_BUTTON(10001,OnButtonClicked) //28:33
wxEND_EVENT_TABLE()

cMain::cMain() : wxFrame(nullptr, wxID_ANY, "Peter's First WxWidget Code ",wxPoint(30,30),wxSize(800,600))
{
    m_btn1 = new wxButton(this, 10001, "Click Me", wxPoint(10, 10), wxSize(150, 50));   //28:36
    m_txt1=new wxTextCtrl(this, wxID_ANY, "", wxPoint(10, 70), wxSize(300, 30));
    m_list1=new wxListBox(this, wxID_ANY,  wxPoint(10, 110), wxSize(300,300));
}


cMain::~cMain()
{
}

void OnButtonClicked(wxCommandEvent &evt)
{
    //m_list1->AppendString(m_txt1->GetValue());        //<<<<<<<<<<<<<<<
    m_list1->AppendString("ONE");                       //<<<<<<<<<<<<<<<
    evt.Skip();     //29.24
}

    //===================cApp.h ===========
#pragma once                            //24:09

#include "wx/wx.h"
#include "cMain.h"

class cApp : public wxApp
{
public:
    cApp();
    ~cApp();

private:
    cMain* m_frame1 = nullptr;

public:
    virtual bool OnInit();
};
    //===================cApp.cpp ===========

#include "cApp.h"          // 24:19
wxIMPLEMENT_APP(cApp);
cApp::cApp()
{
}

cApp::~cApp()
{
}
bool cApp::OnInit()
{
    m_frame1 = new cMain();
    m_frame1->Show();
    return true;
}

任何帮助表示赞赏

【问题讨论】:

  • 请复制粘贴错误信息编译器/链接器报告!请注意,标题中的这个&lt;&lt;&lt;&lt;&lt; 只是一个噪音,所以请考虑更好的标题。
  • 我的 C++真的生锈了,但看起来 OnButtonClicked 不是该类的成员,因此它无法独立访问该类 public特性。您需要一个实例(或通过将 cMain:: 放在名称前面来使 OnButtonClicked 成为该类的成员)。
  • 错别字,应该是:void cMain::OnButtonClicked(wxCommandEvent &amp;evt)
  • 在类定义之外,成员函数名需要以类名和::(作用域)运算符作为前缀。例如,在类定义之外定义void OnButtonClicked(wxCommandEvent &amp;evt)时,需要为void cMain::OnButtonClicked(wxCommandEvent &amp;evt)。 [并且,不要猜测,而是尝试阅读会告诉您这些事情的基本文本]。
  • @PeterWilliams,最重要的是其他人所说的 - EVT_BUTTON(10001,OnButtonClicked) 真的应该是 EVT_BUTTON(10001,cMain::OnButtonClicked)

标签: c++ visual-studio wxwidgets


【解决方案1】:

void OnButtonClicked(wxCommandEvent &amp;evt) 应该是 void cMain::OnButtonClicked(wxCommandEvent &amp;evt)

【讨论】:

    【解决方案2】:

    你的意思是m_list1 不是一个有效的变量名吗?

    void OnButtonClicked(wxCommandEvent &amp;evt) 是一个独立的函数。它不属于任何类。

    我看到的唯一m_list1cMain 的成员。所以,它不在函数的范围内。如果您正在编写该类的成员函数,它将是一个成员变量,但您正在编写一个全局(免费)函数。

    您没有指向您在源代码中定义的任何类的任何实例的任何指针,因此您无法从这里到达那里。

    也许您希望OnButtonClick 成为cMain 的成员。我不知道这个框架,但我看到你没有将函数指针注册到回调;如果框架只知道调用该名称的成员,那么您的错误就是没有使该函数成为该类的成员。

    【讨论】:

    • 非常感谢 cmets。我从 Youtube 视频中复制了代码,没想到这个解决方案会有很大缺陷。我会做一些改变,对于使用小于号来突出一个关注领域感到抱歉。再次感谢所有 cmets
    猜你喜欢
    • 2016-12-03
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多