Общедоступная переменная-член c недоступна

#c

Вопрос:

Появляется сообщение об ошибке «член… недоступно» в Visual Studio, когда я пытаюсь получить доступ к значению переменной-члена.
Но переменная-член объявлена общедоступной. Это производный класс, но он не является переменной-членом базового класса.
Компилятор выдает сообщение об ошибке «невозможно получить доступ к защищенному члену».
Строки, вызывающие ошибку:

     CKaltestDlg dlg;
        fprintf(debugout, "Reminders get input focus %s n", dlg.m_ReminderInputFocus ? "true" : "false");
 

Файл заголовка. Рассматриваемая переменная-член находится ближе к концу, под заголовком public: .

 // KaltestDlg.h : header file
//


#pragma once

// CKaltestDlg dialog
class CKaltestDlg : public CDialogEx
{
// Construction
public:
    CKaltestDlg(CWnd* pParent = nullptr);   // standard constructor

// Dialog Data
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_KALTEST_DIALOG };
#endif

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
public:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnBnClickedRemindersinputfocus();
    CButton m_EnableDisableInputFocus;
    BOOL m_ReminderInputFocus;
    CButton m_EnableDisableRemindersOntop;
    BOOL m_RemindersOnTop;
    afx_msg void OnBnClickedRemindersalwaysontop();
    CButton m_EnableDisableFlash;
    BOOL m_FlashTaskbarButton;
    afx_msg void OnBnClickedReminderflash();
};
 

Комментарии:

1. Не уверен, но, возможно, этот макрос DECLARE_MESSAGE_MAP() путает то, что является общедоступным, а что защищенным… добавьте public: после нее и повторите попытку.

Ответ №1:

Из документации DECLARE_MESSAGE_MAP() макроса

Примечание

Если вы объявляете какой-либо член после DECLARE_MESSAGE_MAP , вы должны указать для них новый тип доступа ( public , private , или protected ).

Таким образом, расширение макроса может привести к изменению видимости. Либо переместите макрос в конец класса, либо добавьте public: сразу после него. Я бы рекомендовал оставить комментарий об этом в вашем коде, чтобы напомнить вам об этом факте, если вы измените класс в будущем.