我正在尝试在Visual Studio(2017)C++中利用wxWidgets。我创建了两个类。即cApp.h和cMain.h。然后,我尝试在cApp中创建Cmain的新实例。但是,它出现以下错误:
Error C2248 'cMain::cMain': cannot access private member declared in class 'cMain'
当我将鼠标悬停在Visual Studio中的解决方案资源管理器中的.h文件时,它表明它是私有(private)的。我删除了它们并手动创建了它们。但是,结果相同。如何将其更改为公开?非常感谢你 :)
应用程序
#pragma once
#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"
wxIMPLEMENT_APP(cApp);
bool cApp::OnInit()
{
m_frame1 = new cMain(); // This is the part that gives error
m_frame1->Show();
return true;
}
cMain.h
#include "wx/wx.h"
class cMain : public wxFrame
{
cMain();
~cMain();
};
cMain.cpp
#include "cMain.h"
cMain::cMain() : wxFrame(nullptr, wxID_ANY, "First App")
{
}
cMain::~cMain()
{
}
最佳答案
编译器是正确的,cMain是private
。在C++中,类的成员默认情况下是私有(private)的,主要是因为有保护模型。摘自“C++的设计与演化”(Bjarne Stroustrup):
因此,基本上,应该将类的公共(public)部分明确地设置为public
,或使用关键字friend
。
来自“C++编程语言”(Bjarne Stroustrup):
考虑到C++的基准是C(结构的成员是公共(public)的),这比C++中的结构成员也是public
正常。
因此,为了解决该错误,您可以明确地将其公开
class cMain
{
public:
cMain(){};
~cMain(){};
};
或使用结构代替类。
struct cMain
{
cMain(){};
~cMain(){};
};
或将
cMain
指定为friend
的cApp
。关于继承,这篇文章非常有帮助:Difference between private, public, and protected inheritance