#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:
сразу после него. Я бы рекомендовал оставить комментарий об этом в вашем коде, чтобы напомнить вам об этом факте, если вы измените класс в будущем.