类中定义静态函数的作用

cpsoft 2003-12-10 12:25:42
我在类中定义了静态函数,
但是这个函数却不能调用类中的其他非静态函数.
那么这个静态函数定义在类中和类外有什么区别呢?
感觉还是定义在类外好啊!

如果有高手可以调用类中的其他非静态函数的方法,麻烦告知,谢谢!
...全文
1896 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpsoft 2004-03-04
  • 打赏
  • 举报
回复
WinProc的参数是确定的!
loveyou19840806 2003-12-11
  • 打赏
  • 举报
回复
静态成员中没有THIS指针,要是你想调有其它成员,可带上一个参数
hyqryq 2003-12-10
  • 打赏
  • 举报
回复
当然不行了。

静态函数是和类相关的, 而非静态函数是和类的具体某一对象相关的。
简单而言, 静态函数没有隐藏的传递this指针。

CALLBACK函数必须定义为静态函数。

这是C++的一个基本概念, 请多看相关书籍。
layman2008 2003-12-10
  • 打赏
  • 举报
回复
In C++, when modifying a data member in a class declaration, the static keyword specifies that one copy of the member is shared by all the instances of the class. When modifying a member function in a class declaration, the static keyword specifies that the function accesses only static members.

Example

// Example of the static keyword
static int i; // Variable accessible only from this file

static void func(); // Function accessible only from this file

int max_so_far( int curr )
{
static int biggest; // Variable whose value is retained
// between each function call
if( curr > biggest )
biggest = curr;

return biggest;
}

// C++ only

class SavingsAccount
{
public:
static void setInterest( float newValue ) // Member function
{ currentRate = newValue; } // that accesses
// only static
// members
private:
char name[30];
float total;
static float currentRate; // One copy of this member is
// shared among all instances
// of SavingsAccount
};

// Static data members must be initialized at file scope, even
// if private.
float SavingsAccount::currentRate = 0.00154;
hanyixin 2003-12-10
  • 打赏
  • 举报
回复

静态函数里当然不能调用非静态的函数了。
定义在类里,起码可以不污染全局名字空间。

cpsoft 2003-12-10
  • 打赏
  • 举报
回复
我所定义的静态函数是个CALLBACK函数
FengQingYang2008 2003-12-10
  • 打赏
  • 举报
回复
我也编过一个windows 的窗口类,我是这样解决的:
在类中放一个私有的静态的数组对象(可以动态改变大小的),用来保存当前程序的所有窗口对象的指针(通过在构造函数和析构函数进行)
在你说的 WndProc 里对这个数组进行查找对应的窗口(根据窗口句柄是否和 WndProc 的HWND 的值相比较),然后调用查找到的对象调用其相应的函数(最好是虚函数)。
glacierrr 2003-12-10
  • 打赏
  • 举报
回复
codelover(蜡笔小钦)
你所说的,我已经知道了,问题是我要解决:
我的类中包含WndProc,其中的WM_PAINT消息要调用类中的OnDraw()怎么办?

先获得自己的指针,然后就可以在WndProc里面给自己发送一个WM_PAINT消息,
barryfat 2003-12-10
  • 打赏
  • 举报
回复
静态函数在类体定义,这就意味着你定义了该类的对象,各个对象都有自己数据和函数的副本,唯有静态函数只有唯一一个副本,大家公用!
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
我用模板做一个全局函数,让我的静态函数从外部得到一个实例化后的对象指针就可以了吧!

哦!这样虽然感觉有点怪怪的,大概应该可以解决吧!

我打算在每个类里实现函数:CMenuMng* GetThis(void){return this;};

我对模板不熟悉,大家指教,全局函数要怎么写??
wangyangcheng 2003-12-10
  • 打赏
  • 举报
回复
TO:cpsoft
我想應該"只要想办法让静态函数拥有this指针就有可能可以调用".
hyqryq 2003-12-10
  • 打赏
  • 举报
回复
这是个VC的问题呀, 得到试图类的指针, 调用OnDraw()函数就可以了。
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
类内的静态函数不能调用类内非静态函数是不是因为他不能向其传递this指针.
那么只要想办法让静态函数拥有this指针就有可能可以调用,是吗?
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
谢谢
codelover(蜡笔小钦)
你所说的,我已经知道了,问题是我要解决:
我的类中包含WndProc,其中的WM_PAINT消息要调用类中的OnDraw()怎么办?

所以麻烦再给想想办法!
codelover 2003-12-10
  • 打赏
  • 举报
回复
静态函数在类外面和类里面最大的不同是他们的名字域是不同的。
如果你想访问类里面的静态数据成员或函数那就必须使用类内的静态函数。
而且从OOP的观点来看,如果函数属于这个类,那就应该把他声明在类内。

callback必须为静态函数,因为类的非静态成员会在编译的时候自动加入一个
参数this, 这就和系统要求的函数不一样了,因此不能通过。

建议看Thinking in C++
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
我的类中包含WndProc,其中的WM_PAINT消息要调用类中的OnDraw()怎么办?

我当然知道CALLBACK必须为静态函数,(你知道为什么吗?)

我也知道直接调用不行!

还有麻烦告诉我看哪本书的哪几页!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧