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”的声明
为什么?

参考技术A

你需要获取一个CEditView的实际指针,再调用GetEditCtrl。

现在这样的调用获取不到有效的指针。


解决办法:

    你可以将按钮2的响应函数放到View类(删除现在的响应函数,重新在View类建立即可),这样就可以直接调用GetEditCtrl了。

    如果一定要从主框架类CMainFrame获取视图类,你需要通过框架方式获取,这个单、多文档不同。如果单文档,一般这样使用:

CEditView* pView = (CEditView*)GetActiveView();
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 报错非静态成员函数的非法调用的主要内容,如果未能解决你的问题,请参考以下文章

mfc 时钟 OnTimer 非静态成员函数的非法调用

转:MFC中创建多线程

mfc 类静态成员

MFC中多线程中静态函数调用成员函数的问题

MFC C++ 使用静态成员和编译问题

C++ 非静态成员函数的非法调用