MFC GetEditCtrl 报错非静态成员函数的非法调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC GetEditCtrl 报错非静态成员函数的非法调用相关的知识,希望对你有一定的参考价值。
VS2012 代码:
void CMainFrame::OnButton2()
// TODO: 在此添加命令处理程序代码
CEdit& theEdit = CEditView::GetEditCtrl();
提示:
error C2352: “CEditView::GetEditCtrl”: 非静态成员函数的非法调用
1> e:\vs\vc\atlmfc\include\afxext.h(853) : 参见“CEditView::GetEditCtrl”的声明
为什么?
你需要获取一个CEditView的实际指针,再调用GetEditCtrl。
现在这样的调用获取不到有效的指针。
解决办法:
你可以将按钮2的响应函数放到View类(删除现在的响应函数,重新在View类建立即可),这样就可以直接调用GetEditCtrl了。
如果一定要从主框架类CMainFrame获取视图类,你需要通过框架方式获取,这个单、多文档不同。如果单文档,一般这样使用:
CEdit& theEdit = pView->GetEditCtrl();追问
谢,但是多文档怎么实现?我这个工程是多文档……多谢指教!
追答CEditView* pView = (CEditView*)(MDIGetActive()->GetActiveView());CEdit& theEdit = pView->GetEditCtrl();
大致就是这样,不过说实话,这是获取当前活动视图,多视图的话其实还是使用第一种方法更好些。
本回答被提问者采纳 参考技术B 如果你想直接引用该方法的话就得在方法声明时加上static否则就声明GetEditCtrl类的一个实例,例GetEditCtrl rw;
非静态成员,必须首先实例化一个类对象。才能使用,如果没有构造函数,这样就行了
静态成员
静态成员变量的初始化一定要在类外,原因:
因为静态成员变量本身在main函数未开始时已经存在。不要让成员变量的初始化依赖于对象。不用对象,难到就不能用这一变量了吗?
如果将初始化放在类内。那么当不声明对象时,无法使用这一静态变量。编译器报错为‘undeclared identifier’。
#include<iostream>
using namespace std;
class B{
public:
static void Add(){i++;}
//静态成员函数只可以使用静态成员变量,因为静态成员函数没有this指针,所有对象共享使用这一
//成员函数所以无法使用非静态成员变量。因为每个非静态成员变量在各个对象中都不同。
static int i;//静态成员变量在类内声明:
void out(){cout<<"static i="<<i<<endl;}
};
int B::i=0;//静态成员变量一定要在类外初始化。
class D:private B{
public:
void f(){
i=5;
Add();
B::i++;//这里静态变量也可以直接用i++;
B::Add();
}
};
int main(){
B x;
D y;
x.Add();
x.out();
y.f();
cout<<"static i="<<B::i<<endl;//1.静态成员变量的调用可直接用 “类名::变量名”
cout<<"static i="<<x.i<<endl;//2.也可用用对象名直接调用。
//cout<<"D中i的值:"<<y.i<<endl;//这是错误的,因为在y中i的访问权限是私有的所有无法用对
//象访问。
return 0;
}
static 的作用:
一、static 在代码块内声明局部变量,作用域为代码块内。
其static的作用是声明为静态可持续变量,在程序中一直存在。
二、static 在代码块外声明局部变量时,作用域为声明处直到文件结尾。
其static的作用是声明为内部链接性,即不可以被程序的外部文件调用。起到隐藏作用
注意未加static的全局变量和函数可以被外部程序访问!
int j;//static duration,external linkage 可以被程序的外部文件使用。
static int k;//static duration ,internal linkage,作用在以下所有程序,且只可以本文件使
//用。
void test(){
static int i;//static duration nolinage;只作用于代码块内。静态局部变量
i=5;
cout<<"static i="<<i<<endl;
}
int main(){
//cout<<i<<endl;错误的
test();
cout<<j<<endl;//static和全局变量都是默认为0!
}
PS:全局变量和static修饰的变量都存储在静态存储区。
以上是关于MFC GetEditCtrl 报错非静态成员函数的非法调用的主要内容,如果未能解决你的问题,请参考以下文章