C++类静态成员函数调用错误
Posted
技术标签:
【中文标题】C++类静态成员函数调用错误【英文标题】:C++ class static member function calling error 【发布时间】:2017-05-15 14:15:29 【问题描述】:我用 Visual Studio 编写了一个项目。在项目中,我构建了一个名为 CSimApplianceDlg 的类,它有两个成员:
static UINT RecvDataFrame(LPVOID pParam)
和 CSerialPort m_Port
class CSimApplianceDlg : public CDialog
// Construction
public:
CSimApplianceDlg(CWnd* pParent = NULL); // standard constructor
// Implementation
protected:
HICON m_hIcon;
// Added for Serial Port operation
static UINT RecvDataFrame(LPVOID pParam); // Process received data
......
private:
......
unsigned char m_SendData[MAX_LEN]; // Data to be sent
int len; // the length of data to be sent
public:
CSerialPort m_Port; // CSerialPort Object
......
CSerialPort
有一个公共成员函数WriteToPort
通过串口发送数据。
public:
void WriteToPort(char* string);
void WriteToPort(char* string,int n);
void WriteToPort(LPCTSTR string);
void WriteToPort(LPCTSTR string,int n);
我打电话
m_Port.WriteToPort(m_SendData,len);
在 UINT CSimApplianceDlg::RecvDataFrame(LPVOID pParam) 中。但是,在构建项目时,就在调用的那一行,我得到了
1>e:\mysourcecode\smarthome\simappliance\simappliance\simappliancedlg.cpp(557) : 错误 C2228: '.WriteToPort' 的左边必须有类/结构/联合 1>e:\mysourcecode\smarthome\simappliance\simappliance\simappliancedlg.cpp(557) : 错误 C2597: 非法引用非静态成员 'CSimApplianceDlg::m_SendData' 1>e:\mysourcecode\smarthome\simappliance\simappliance\simappliancedlg.cpp(557) : 错误 C2597: 非法引用非静态成员 'CSimApplianceDlg::len'
我该如何处理这些错误?并且调用了WriteToPort
,因为我
对LPCTSTR
不熟悉。
【问题讨论】:
您忘记显示发生这些错误的代码。 您可能未能创建CSerialPort
类的实例。正如迈克尔所说,除非我们能看到实际的代码,否则我们无法确定。请使用minimal reproducible example 更新您的问题。
在调用“m_Port.WriteToPort(m_SendData,len);”时出现错误
【参考方案1】:
函数 static UINT RecvDataFrame(LPVOID pParam) 是静态的。这意味着您可以在不实例化对象 CSimApplianceDlg 的情况下调用它。换句话说,您可以从任何地方调用 CSimApplianceDlg::RecvDataFrame() ,这通常是回调函数的情况。 这意味着在该函数中,您无法访问成员变量 (m_Port)。 如前所述,我们没有足够的信息来提供帮助,但很可能传递的 pParam 有一个指向该对象的指针……或者,如果它是您应用程序中的唯一窗口,您可以尝试 AfxGetMainWnd()。 LPCTSTR 被简单地定义为 const TCHAR *,其中 TCHAR 是 char 或 wchar_t 如果您使用的是 ANSI 或 Unicode。祝你好运!
【讨论】:
以上是关于C++类静态成员函数调用错误的主要内容,如果未能解决你的问题,请参考以下文章