我正在尝试在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指定为friendcApp

关于继承,这篇文章非常有帮助:Difference between private, public, and protected inheritance

10-08 02:10