回 帖 发 新 帖 刷新版面

主题:[讨论]thinking && report

做代码的时候,遇到一个老生常谈的问题,class中一个static member function 如何访问一个non static member var?显然,需要一个指针,从而间接引用某个对象。所以,第一次,我构造了一个obj, 作为parameter把&obj传进了static member function内。然后无意想到,如果,不构造某个对象如何呢? 然后,好似MFC中有很多这样的做法。后来,简化了MFC的某个做法,写了一小段测试,发现,情况并非想象的那么好。代码贴上,希望得到大家的看法。
////////////////////////////////////////////////
// .h file
#ifndef main_h__
#define main_h__

#include <iostream>
#include <cassert>
using namespace std;

class X
{
public:
    X()
        : m_nVar(128) 
    {
        // px = this;
        assert(px == this);
        px = 0;
    }
    static void init()
    {
        px = new X;
    }

    ~X() {};
//     static void s_fun(const X* px)
//     {
//         cout << c_nVar << "   " << px->m_nVar << endl;
//     }
    static void s_fun()
    {
        cout << c_nVar << "    " << px->m_nVar << endl;
    }

    void foo()
    {
        cout << m_nVar << "   " << c_nVar <<  endl;
    }
    static X* px;
protected:
    
private:
    int m_nVar;
    static int c_nVar;
};


#endif // main_h__


//////////////////////////////////
// .cpp file

#include <iostream>
#include <cstdlib>
#include "main.h"

int X::c_nVar;
X* X::px;
// X* X::px = 0;

int main()
{
    // X::s_fun(&vx);
    X::init();
    X::s_fun();

    X vx;
    vx.foo();

    // delete X::px;

    system("pause");
    return 0;
}

注解掉的是其他的方式。 至少,有一个问题,我还没找到,如果用这个办法访问non static的话,如何delete呢?[em15]

回复列表 (共4个回复)

沙发

OKOK.
1st.错了一个地方。
  X()
        : m_nVar(128) 
    {
        // px = this;
        assert(px == this);
        px = 0;
    }
constructor 不该这么做。什么都不做即可。
2nd. px = null;放在析构函数即可。
~X() 
{
  assert(px == this);
  px = 0;
};

如果是win32的话,可以在PostNcDestroy放入delete this;
需要一个消息通知释放掉this指向的数据结构,析构中,px置为0即可。

板凳

析构函数不访问静态变量,增加一个destory来访问静态变量就可以了。
构造静态对象时用init,释放用destory。
构造非静态时用new,释放用delete。

3 楼

[quote]析构函数不访问静态变量,增加一个destory来访问静态变量就可以了。
构造静态对象时用init,释放用destory。
构造非静态时用new,释放用delete。[/quote]句句珠玑

4 楼

学习一下学习一下ppt模板大全http://www.2ppt.cn

我来回复

您尚未登录,请登录后再回复。点此登录或注册