精华内容
下载资源
问答
  • C++中静态成员函数访问成员变量问题   转载▼ http://shellman.i.sohu.com/blog/view/98359969.htm C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是...

    C++中静态成员函数访问成员变量问题

     
    http://shellman.i.sohu.com/blog/view/98359969.htm

    C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。

    左例中分别声明了成员函数void add(),成员变量int a,和静态成员函数 static void staticfunc(),静态成员变量 static int sa.

    在staticfunc()的定义中,由于没有this指针,所以无法访问普通成员变量和成员函数.

     

     

     

    网络上有很多关于解决静态成员函数访问普通成员变量的方法,总结如下:

    方法一:声明类的所有数据成员都是静态的。运用这种方式的话,静态的成员函数就能够直接地访问它们,例如:

    此时,即可在staticfunc()中正常访问变量a了,如果还需访问add()函数,则将add()也冠以static即可.

    该方法缺点是,很多情况下,你并不愿意将所有的变量都改成静态成员.或者有些变量不能是静态的.此时该方法失效.

     

     

     

    方法二:传入对象参照信息:

    静态成员函数staticfunc()会使用参照Obj来访问非静态成员a.

     

    将一个参照或者指针作为静态成员函数的自变量传递,就是在模仿自动传递非静态成员函数里this自变量这一行为。

     

     

    该方法很明确,给静态函数传入this指针.

    一般来说静态成员函数的参数没有严格的要求时,采用这种方法不失为妙招.如果静态成员函数的传入参数有严格的限制,就是说不能传入实体引用时,就不能使用这种方法了.

    方法三:申明空指针

    这种方法在类只有一个实体时可行,因为传入的this指针是一个全局量,始终指向最后定义的那个实体,当定义了第n+1个实体候,第n个实体的this指针就被忘掉了.在这种方法的启发下,我采用了下面的方法,比较麻烦些,但确实可行.之所以可行,前提是静态成员函数是一个回调函数,它返回了一个实体标识,但有别于this指针.

    方法四:定义全部量(可以是数组,也可是链表)保存每个this指针

    定义结构体:


    然后在每次生成实体时:

    其中Insert()功能为将this指针和实体标识video_handle加入链表.相当于将每个实体标识与其对应的this指针保存起来了.所以在回调函数中使用时只需根据回调函数返回的实体表示video_handle来查找对应的this即可.

    问题终于解决,麻烦的就是要增加对链表的操作.

    展开全文
  • MATLAB OOP记点东西2-成员函数访问成员变量(使用静态成员函数),MATLAB的类里面怎么使用成员函数去访问成员变量是比较麻烦的,故笔者最终选择采用静态函数的方法,手动传递obj或者说是handle来完成这样的需求

    还是在用MALTAB完成一些OOP编程,遇到的问题N多。。。果然是比较郁闷的,其实笔者的要求并不多,主要是希望通过类来封装每一个节点属性,要不然相同变量太多了,不好用。搞了半天问题在于,在MATLAB的一个类里面,成员变量如何去访问成员函数,额。。。其他语言都没见过这样的问题。。。MATLAB搞得非常奇怪。

    先放上一个解决方案,笔者形容是凑合着用的,通过静态函数绕了一下,想起来也是怪怪的,如下


    类名是test,包含一个属性NUM,基本MALTAB的HELP里面相关OOP的文档大致我都翻了一下,的确没有发现有出现在methods里面自定义函数名的,大部分都是set和get。

    这里叙述纯粹按照笔者猜想,首先我们实例化一个类

    TEST=test(5); 这个部分直接就会调用构造函数,入参可以没有,这里为了初始化所以设定了一个val,出参必须要有,原因和之前的一样,类的内部的一个引用,或者说实例化,最后把这个引用传给TEST。

    再下来实际上我们要解决如何在成员函数里面访问成员变量,首先是MATLAB文档里面多次提到的set和get,这两个是肯定可以使用的,但是set必须是两个入参,可以有出参,但是笔者存在报错就是了,get必须有出参,而且入参只有一个。且每一个函数的第一个入参都必须是Obj,即对象。如调用set.NUM函数的时候

    并不是写成test.set.NUM()或者test.NUM(),而实际上调用的方法是test.NUM=xx;这样,实际上好像这里是一个重写,虽然我定义的test类没有继承,但是应该有继承有一个默认的最高类,默认中间test.NUM=XX执行就是一个单纯的成员变量赋值的作用,而我上面所定义的实际上是对这个赋值重写,可以自定义test.NUM=xx这个动作。如

            function obj=set.NUM(obj,val)
                obj.NUM=val;
                fprintf('%d',val);
            end

    这样就会在test.NUM=XX赋值的同时,print一行值。get方法和set方法类似,以上好像是matlab帮助里面常写的,但是这里笔者想实现的是比较常见的,随便定义一个成员函数名,然后执行一个动作,而set和get的.之后跟的必定是属性名,而且参数受限,所以把属性名定义成方法名的凑的思路也走不通。

    本来按照道理而言,如下写法

            function obj=set_NUM(obj,val)
                obj.NUM=val;
            end

    直接是可以的,虽然我们最后还是这样写,但是要写成静态化。非静态化的调用直接test.set_NUM(xx)一个参数就行,不需要传递obj,然后程序把对象传递进去,改变一个参数的值,再传出,笔者写的《MATLAB OOP记点东西1》那部分也就到这就以为测试通过了。但是如果你再次执行这个动作的时候会发现,再传参数给set_NUM的执行过程中,obj的值是上一次对象的值,而不是用set_NUM函数改动后的,但是用test.NUM=xx这样的改动之后的结果是可以的,所以问题还是归于传入的obj到底是哪里来的,当然这个问题也没有搞明白。不过最后为了完成目的,笔者发现,如果把之上的函数放入静态函数块里面就行了。

    MATLAB的静态成员函数和其他的有点不同,貌似记得其他的好像是不用实例化对象就可以直接调用的,而MATLAB的静态成员函数还是要实例化的,在定义的时候如下

        methods (Static)
            function obj=set_NUM(obj,val)
                obj.NUM=val;
            end
        end

    变化不是很大,就加了一个static,但是在调用的时候不一样,如笔者实例化的对象为test,即调用是

    test=test.set_NUM(test,10);实际上就是手动去完成一个Obj的传递工作,虽然比较凑乎,但是笔者的基本需求达到了就是了。在MATLAB帮助实例An Example of Syntax这个里面也类似采用了这样的一种框架,故貌似。。普通method只可以在构造或者set,get函数里面使用成员变量,而其他的方法都不行。

    展开全文
  • 无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可以直接访问静态成员,但是访问类的非静态函数成员变量就...

    在多线程程序中,无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可以直接访问静态成员,但是访问类的非静态函数或成员变量就必须做一个适配器,代码如下:

    class CStaticThread
    {
    public:
            static int ThreadFunc(LPVOID pParam);/
    protected:
        int ThreadFuncKernal();
    }

    void CStaticThread::Func()
       {
            AfxBeginThread(TreadFunc, this);
       }

       int CStaticThread::ThreadFunc(LPVOID pParam)
       {
           CStaticThread*pObj = (CStaticThread*)pParam;
           return pObj->ThreadFuncKernal();

       }

       // Thread function kernal
       int CStaticThread::ThreadFuncKernal()
       {
           while(1)
           {
               // my thread
               // to control class non-static member
           }
           return 0;
       }


    上面这个例子 是我们实际应用中这么操作的,下面讲讲static成员函数和非static成员的区别。

     

    static成员函数和成员变量的主要作用是针对类的,对所有的对象共享。声明为static的类成员或者成员函数便能在类的范围内共同享我们把这样的成员称做静态成员和静态成员函数。

    静态成员的初始化应该在主函数调用之前,并且不能在类的声明中出现静态成员的使用应该是类名称加域区分符加成员名称的,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态类成员的特性就是属于类而不专属于某一个对象。静态成员函数与普通成员函数的差别就在于缺少this指针。

     

    静态成员函数的作用:

    主要有两个作用:
         1、管理静态数据成员;
         2、提供类范围的功能,即不需要对象来实现的功能。

     

    由于一个类的静态成员函数只有一个拷贝,因此它访问对象的数据何函数使受到了限制。静态成员函数可以直接访问该类的静态数据成员。而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。上面举得线程的例子就是通过参数传递得到对象名,然后通过对象来访问,这样在线程中,不但可以公有成员,也可以访问私有成员和成员函数;

     


    使用静态函数注意点:

    1)静态成员可以被继承,基类和派生类共享该静态成员;

    2)构造函数不能申明成静态的;

    因为构造函数是对每个对象进行初始化的,而静态函数是在类中的对象共享的,所以矛盾

    3)虚函数不能是静态函数;

    为什么虚函数必须是非静态成员函数
    如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义本身就是相矛盾的。

     

     



     



     

    展开全文
  • 静态成员函数不能访问静态的数据成员,它只能访问静态数据成员,也只能调用其它的静态成员函数。原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的。但一个静态成员函数没有this指针,所以它无法访问...

    静态的成员函数,同静态数据成员类似,它也是属于类,而不是属于某一个对象的。
    静态成员函数不能访问非静态的数据成员,它只能访问静态数据成员,也只能调用其它的静态成员函数。原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的。但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数。

    由于静态成员函数是属于类的,所以,静态成员函数的调用方法为:
      类名::静态成员函数名();

      以下关于静态成员变量

    1.初始化static成员变量不能安排在类的构造函数中,因为构造函数可能一再被调用,而变量的初值却只应该设定一次。也不要把初始化安排在头文件中,因为它可能会被包含在许多地方。而应该放在main函数之中,或全域函数中,或者任何函数之外。

    //=====================================

       对于多个的C/C++头文件的包含,一般情况下放在工程的目录下编译器就可以正确地找到。 但是对于在不同文件夹下的头文件的包含,当然可以写完整的路径,但是这样有可能会出现将工程拷到别人的机子上运行不了的问题。如果在这个程里同写上相对的路径,那么不仅在自己的机子上能运行,别人拷了过去也能正确运行。

     

     

       例如我的一个工程头文件如下:

          c:/F/Work/test/testnow/testPage.h

     

     

    上面的头文件要包含的文件如下:

    c:/F/Work/test/testnow/FileHelpers/FileInformationList.h

    c:/F/Work/test/testnowTray/testTray/Share.h

     

     

    那么可以在testPage.h上这样写:

    [cpp] view plaincopy

    #include "./FileHelpers/FileInformationList.h"  

    #include "../testnowTray/testTray/Share.h"  

     

    上面

    #include "./FileHelpers/FileInformationList.h"

    的一点表示当前目录(这些的标记对于接触过DOS的人来说一定不会陌生吧?)

    #include "../testnowTray/testTray/Share.h"

    的两点表示上一级目录。

     

    其他的照这样类推。  这样是不是方便了一点???

    展开全文
  • 静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员
  • 静态成员变量属于类,不属于对象,所以访问时需要加类名,而不是对象名;普通成员变量时属于类中对象的变量,他不能被所有对象共享; 如没有创建一个对象,但是你却可以通过对类名和限定符访问静态变量并对其进行...
  • 静态成员变量静态成员函数: ...静态成员函数可以访问静态成员变量,不可以访问普通成员比变量 静态成员变量函数都有权限,设置成私有便不可以在类外通过变量或者类名访问 把...
  • 类中的静态成员函数访问静态成员变量 1.思路: 静态成员函数属于类(通过类访问,调用函数时没有提供this指针), 非静态成员函数属于实例(通过对象访问)(默认都提供了this指针), 非静态成员也属于实例(通过...
  • C++静态成员函数访问静态成员变量
  • 类的静态函数只能访问类的静态成员变量 类的静态函数只能访问类的静态成员变量 类的静态函数只能访问类的静态成员变量 类的静态函数只能访问类的静态成员变量 转载于:...
  • 静态成员变量静态成员函数 文章目录静态成员变量静态...静态成员函数只能直接访问静态成员变量静态成员函数 定义静态成员函数,直接使用static关键字修饰即可 可以通过类名直接访问类的公有静态成员函数 ...
  • 静态成员函数只能访问静态成员变量(他不能访问静态成员变量的原因可以从两个角度去理解:1.因为他是在编译阶段就分配内存,这时候还没有非静态成员变量的内存,他没办法访问。2.非静态成员变量名字都相同,编译器...
  • 静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。但我们在一个...
  • 通过类名,对象,成员函数都可以访问静态成员变量。 类的静态成员变量需要在类外分配内存空间。 静态成员函数只能调用静态成员变量。 成员函数可以调用静态成员变量静态成员函数。 类内局部静态变量所有对象共享一...
  • 静态成员变量静态成员函数 class ClassA { int a; int b; static int c; //静态成员变量 static void xxx_fun() //静态成员函数 { ... } } 普通成员变量每个对象都有各自的一份,静态成员变量所有对象...
  • class A{ private $url; public function __construct(){ $this->url = $_SERVER['PATCH_INFO']; } public static function get(){ var_dump(self::$url);//出错,说静态变量未初...
  • 静态成员函数不能访问普通成员变量(函数),需通过对象间接访问成员变量函数) 1、静态成员变量 参考:https://blog.csdn.net/qq_37375427/article/details/78747636 ...
  • 定义的时候和普通成员函数一样,不需要加static,但是静态成员函数只能访问静态成员变量静态成源函数。 class demo{ public: demo(); ~demo(); static void setName(QString name); private: static QString m_...
  • 静态成员函数访问静态成员变量 在正常情况下一个static修饰的静态成员函数是无法对非静态成员变量进行访问与操作的 : #include <iostream> using namespace std; class Date { ...
  • C++中静态成员函数访问静态成员变量 先看一个class class a{public:staticFunctionA(){menber=1;}private:intmenber;} 编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是...
  • 1、在类所有实例中静态成员变量静态成员函数都只有一份拷贝 ...一、静态成员变量访问 class B { public: static int a; }; int B::a=0;//必须要先初始化 int main(){ cout<&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,861
精华内容 1,144
关键字:

静态函数访问成员变量