为什么 Show() 无法访问?

问题描述 投票:0回答:1

在 wxwidget 创建框架中,您在堆上创建它的一个实例。因此,在访问它的成员函数时,您将使用

->
运算符。我已经创建了一个 wxMDIParentFrame,并且当单击父框架的菜单之一时,我尝试创建子框架的实例。但是在我创建子类的实例后,尝试为我的子框架调用 show 函数时出现错误

这是代码

MyFrame.h

#pragma once
#include <wx/wx.h>
 
class MyFrame:public wxMDIParentFrame
{
public :
    MyFrame(const wxString& title);
    ~MyFrame();

private:
    wxStatusBar* stb = nullptr;
    wxMenuBar* menubar = nullptr;
    wxToolBar* toolbar = nullptr;

    

    void OnExitMenu(wxCommandEvent& evt);
    void OnNewMenu(wxCommandEvent& evt);
    void OnSelectColor(wxCommandEvent& evt);
    wxDECLARE_EVENT_TABLE();
};


MyFrame.cpp

#include "MyFrame.h"
#include <wx/wx.h>
#include "IDs.h"
#include "childFrame.h"


wxBEGIN_EVENT_TABLE(MyFrame,wxFrame)
    EVT_MENU(exitID,MyFrame::OnExitMenu)
    EVT_MENU(newID,MyFrame::OnNewMenu)
wxEND_EVENT_TABLE()
MyFrame::MyFrame(const wxString& title) :wxMDIParentFrame(nullptr, wxID_ANY, title, wxPoint(30, 30), wxSize(800, 800))
{

    menubar = new wxMenuBar();
    this->SetMenuBar(menubar);
    

    wxMenu* menuFile = new wxMenu();
    menubar->Append(menuFile, "FILE");
    menuFile->Append(newID, "New");
    menuFile->Append(openID, "Open");
    menuFile->Append(saveID, "Save");
    menuFile->Append(exitID, "Exit");
    

    toolbar =this->CreateToolBar(wxTB_HORIZONTAL, wxID_ANY);
    

    wxColor colours[16];
    colours[0] = wxColor(0, 0, 0);
    colours[1] = wxColor(0, 0, 128);
    colours[2] = wxColor(0,128,0);
    colours[3] = wxColor(0, 128, 128);
    colours[4] = wxColor(128, 0, 0);
    colours[5] = wxColor(128, 0, 128);
    colours[6] = wxColor(128, 128, 0);
    colours[7] = wxColor(192, 192, 0);
    colours[8] = wxColor(128, 128, 128);
    colours[9] =  wxColor(0, 0, 225);
    colours[10] =wxColor(0, 255, 0);
    colours[11] =wxColor(0, 255,255);
    colours[12] =wxColor(255, 0, 0);
    colours[13] =wxColor(255, 0,255);
    colours[14] =wxColor(255, 255, 0);
    colours[15] =wxColor(255, 255,255);
    
    for(int i = 0; i < 16; i++)
    {
        wxButton* btn = new wxButton(toolbar, 10100 + i, "", wxDefaultPosition, wxSize(40,24), 0);
        btn->SetBackgroundColour(colours[i]);
        btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnSelectColor), nullptr, this);
        toolbar->AddControl(btn);
    }
    wxButton* btna = new wxButton(toolbar, 10100 + 16, "Alpha", wxDefaultPosition, wxDefaultSize, 0);
    btna->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnSelectColor), nullptr, this);

    toolbar->AddControl(btna);

    toolbar->Realize();
}



void MyFrame::OnExitMenu(wxCommandEvent& evt)
{
    Close();
    evt.Skip();
}
void MyFrame::OnNewMenu(wxCommandEvent& evt)
{
    childFrame* cFrame = new childFrame(this, "Name");
    cFrame->Show();
    evt.Skip();
    
}
void MyFrame::OnSelectColor(wxCommandEvent& evt)
{


}



childFrame.h

#pragma once
#include <wx/wx.h>

class childFrame:wxMDIChildFrame
{

public:
    childFrame(wxMDIParentFrame* parent, wxString childTitle);
    
};


childFrame.cpp

#include "childFrame.h"
#include<wx/wx.h>


childFrame::childFrame(wxMDIParentFrame* parent, wxString ctitle)
    :wxMDIChildFrame(parent,wxID_ANY,ctitle)
{
    
}

这是错误消息

1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(72,10): error C2247: 'wxMDIChildFrame::Show' not accessible because 'childFrame' uses 'private' to inherit from 'wxMDIChildFrame'
1>C:\WxWidgets\include\wx\msw\mdi.h(209,18): message : see declaration of 'wxMDIChildFrame::Show'
1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\childFrame.h(4,7): message : see declaration of 'childFrame'
1>C:\WxWidgets\include\wx\msw\mdi.h(175,24): message : see declaration of 'wxMDIChildFrame'
1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(72,10): error C2248: 'wxMDIChildFrame::Show': cannot access private member declared in class 'childFrame'
1>C:\WxWidgets\include\wx\msw\mdi.h(209,18): message : see declaration of 'wxMDIChildFrame::Show'
1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\childFrame.h(4,7): message : see declaration of 'childFrame'
1>childFrame.cpp
1>Generating Code...
c++ user-interface wxwidgets
1个回答
0
投票

我想你想改变这一点:

class childFrame:wxMDIChildFrame

对此:

class childFrame : public wxMDIChildFrame

...因为如果您没有显式指定

public
继承,那么默认情况下您会获得私有继承,这意味着调用代码将不允许在 的对象上调用
wxMDIChildFrame
类的 API 中的方法输入
childFrame

© www.soinside.com 2019 - 2024. All rights reserved.