MFC中静态成员函数调用其他类的非静态变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中静态成员函数调用其他类的非静态变量相关的知识,希望对你有一定的参考价值。

在 childClass(所在文件为child) 中要调用
mainClass(所在文件为Mymain)
里的成员。这该如何实现???

静态方法只能调用静态成员,如果您的子类继承自主类,那么您要通过静态方法调用主类中的成员,那么您只能在静态成员中保存当前类的实例对象,例如像单例模式的样式。如下所示:
class mainclass
public:
int fn()
return 1;

mainclass()

;
class childclass :public mainclass
private:
static childclass *mInstance;
childclass()

public:
static childclass *getInstance()
if (mInstance == null)
mInstance = new childclass();

return mInstance;


static fn2()
childclass.getInstance().fn();

参考技术A 关注 参考技术B 定义 mainClass 对象.
(对象.方法)追问

能具体一点吗 我是菜鸟的、、、、

追答

包含头文件, 定义类对象.
调用方法.
没代码

追问

代码我也没法贴。。太多了 就是从一个子类Page里静态成员函数调用主类
CDlg
的非静态成员变量

mfc 类静态成员

知识点
  
类静态数据成员
类静态成员函数

 
一、类静态数据成员
     静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的。这一课里,我们主要讨论用类的静态成员来实现对象间的数据的共享。
静态数据成员的使用方法和注意事项如下:  
1、静态数据成员在定义或说明时前面加关键字static。 
2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:   
 <数据类型><类名>::<静态数据成员名>=<值>    
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。  
4、引用静态数据成员时,采用如下格式:  
  <类名>::<静态成员名>

二、类静态成员函数
    静态成员函数内不能使用非静态类成员数据。
    类成员函数可以独立使用。
    可以使用类名+作用域解析符调用静态成员函数。如Tdate::staticFun();
    最好把成员函数的实现放在.cpp里边,以防止重复定义。

头文件

class Tdate
{
private:
     int test;
     int fun();
public:
    int year;//
    int month;//
    int day;//
    void setData(int y,int m,int d);
    void printdate()const;
    Tdate() ;//默认构造函数
    Tdate(char*s);
    Tdate(int y,int m,int d);
    int GetTest() const;
    void Tdate::setCount(int value);
    static void staticFun();
    
    //定义一个静态成员变量,用于存放类的实例化次数(对象个数)
    static int  count;
    void SetTest(int v)
    {
        test=v;
    }
    Tdate* GetThis()
    {
        return this;//返回对象地址
    }
    friend int tfun(Tdate d1);
};

inline int Tdate:: GetTest() const
{
     
    return test;
}

类实现文件

#include "stdafx.h"
#include "date.h"

int  Tdate::count=0; //类静态成员初始化
void Tdate::setData(int y,int m,int d)
{
    year=y;
    month=m;
    day=d;

}
void Tdate::printdate() const
{
     
    printf("%d:%d:%d\n",Tdate::year,Tdate::month,Tdate::day);
}
//默认构造函数
Tdate::Tdate() 
{
    //初始化代码
     
    count++;//计数
    printf("进入默认构造函数\n");
    //Tdate::year=1990;
    this->year=1990;
    this->month=0;
    this->day=0;
    printf("this=%x \n",this);

}
Tdate::Tdate(char*s)
{
     
    count++;//计数
  printf("%s",s);
  year=1990;
  month=0;
  day=0;
}
//构造函数
Tdate::Tdate(int year,int month,int day)
{
    //初始化代码
    count++;//计数
    printf("进入构造函数\n");
    this->year=year;//y=y
    this->month=month;
    this->day=day;
    printdate();

}

int Tdate::fun()
{
    return 1;
}

void Tdate::setCount(int value)
{
    Tdate::count=value;
}

void Tdate::staticFun()

{
    printf("%d",count);
}

类调用文件

// helloc++.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <malloc.h>
#include "date.h"

int tfun(Tdate d1)
{
     
    d1.fun();
    int r=d1.test;
    return 1;

}

int _tmain(int argc, _TCHAR* argv[])
{ 
     int  b[3]={1,2,3};
    // Tdate a(1999,1,19);
      Tdate d1,d2;
     printf("%d",Tdate::count);
     Tdate::staticFun();
     d2.printdate();
    /* d2.setCount(7777);
     d1.setCount(888);
    
     printf("d2.count=%d \n", Tdate.count);
     printf("%x,%x ,%x",&d1.count,&d2.count ,&Tdate::count);*/
     
    getchar();
    return 0;
}

 

以上是关于MFC中静态成员函数调用其他类的非静态变量的主要内容,如果未能解决你的问题,请参考以下文章

在MFC中,一个类如何调用其他类的变量和函数??

关于类中静态成员函数和静态成员变量的知识点

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

MFC GetEditCtrl 报错非静态成员函数的非法调用

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

class中static总结-静态成员函数和静态成员变量