主题:[讨论]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]
////////////////////////////////////////////////
// .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]