c++中静态函数不可以调用非静态函数,那单例模式是怎么回事?

myth_avalon 2016-10-18 06:15:36
如题,c++中静态函数不可以调用非静态函数,但再单例模式中,静态函数中调用了非静态的构造函数,为什么可以呢?

分不多了,望各位大神帮忙解惑!
...全文
558 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2016-10-19
  • 打赏
  • 举报
回复
引用 6 楼 myth_avalon 的回复:
[quote=引用 4 楼 lovesmiles 的回复:] 并不是不可以,而是不能直接调用, 即不能用this指针调用。 单例又没有this指针,调用的都是别人家的函数,怎么用都没有所谓了。
是不是指的在静态函数中调用其他非静态函数时都需要this指针,只不过其他非静态函数将this指针省略掉了,但是在静态函数中没有this指针,所以不能直接调用非静态函数。 但是,构造函数是不需要this指针调用的,构造函数应该是返回一个this指针的,因此可以在静态函数中直接调用是么? 而且应该只有构造函数才可以这样调用,析构函数也是需要this指针的,所以也不能在非静态函数中直接调用。[/quote] 构造函数不知道静态成员可以调用,在非成员函数都可以调用。
myth_avalon 2016-10-19
  • 打赏
  • 举报
回复
class SprinklerSysWidget:public QWidget
{
    Q_OBJECT
public:
    static SprinklerSysWidget* getSSWIns(QWidget* parent=0)
    {
        static SprinklerSysWidget* ssw=new SprinklerSysWidget(parent);
        return ssw;
    }
    static void initState();
    static bool queryTankInfoByMAXID(const std::string &MaxID);
    void scaleSize(float f);
    void ShowWidget();

private:
    SprinklerSysWidget(QWidget* parent)
    {
           scaleSize(1);
    }
}
cpp文件

void SprinklerSysWidget::initState()
{
      getSSWIns()->ShowWidget();
}
你说的基本上我都明白了,但是我不明白单例里面没有this指针这句话。 比如,在构造函数里面调用了scalesize()函数,这里用到了this指针的啊? 当然,在静态函数initState()中是需要getSSWIns()来得到实例指针的。
勤奋的小游侠 2016-10-19
  • 打赏
  • 举报
回复
引用 6 楼 myth_avalon 的回复:
[quote=引用 4 楼 lovesmiles 的回复:] 并不是不可以,而是不能直接调用, 即不能用this指针调用。 单例又没有this指针,调用的都是别人家的函数,怎么用都没有所谓了。
是不是指的在静态函数中调用其他非静态函数时都需要this指针,只不过其他非静态函数将this指针省略掉了,但是在静态函数中没有this指针,所以不能直接调用非静态函数。 但是,构造函数是不需要this指针调用的,构造函数应该是返回一个this指针的,因此可以在静态函数中直接调用是么? 而且应该只有构造函数才可以这样调用,析构函数也是需要this指针的,所以也不能在非静态函数中直接调用。[/quote] 基本是你理解的这个意思 了。 但是构造函数返回一个this指针,这个理解有点偏差。 你其实是将new这个操作符当成了构造函数了吧? new 这个东西,先分配内存,然后再调用构造函数初始化这块内存。 所以在调用构函数的时候,一块内存指针其实已经由系统构造好了的。并不是构造函数返回这个指针的。 单例里面没有 this指针,new出来的全部都是别人家的指针,和一楼的代码是一样的,所以怎么用都没有问题。 或者你贴个在单例里面调用构造函数的代码出来看看,你是怎么调用的?
myth_avalon 2016-10-19
  • 打赏
  • 举报
回复
引用 4 楼 lovesmiles 的回复:
并不是不可以,而是不能直接调用, 即不能用this指针调用。 单例又没有this指针,调用的都是别人家的函数,怎么用都没有所谓了。
是不是指的在静态函数中调用其他非静态函数时都需要this指针,只不过其他非静态函数将this指针省略掉了,但是在静态函数中没有this指针,所以不能直接调用非静态函数。 但是,构造函数是不需要this指针调用的,构造函数应该是返回一个this指针的,因此可以在静态函数中直接调用是么? 而且应该只有构造函数才可以这样调用,析构函数也是需要this指针的,所以也不能在非静态函数中直接调用。
myth_avalon 2016-10-19
  • 打赏
  • 举报
回复
一楼说的这种情况,我知道可以这么调用。就是在调用非静态函数时,需要指明该函数的对象指针。
勤奋的小游侠 2016-10-19
  • 打赏
  • 举报
回复
并不是不可以,而是不能直接调用, 即不能用this指针调用。 单例又没有this指针,调用的都是别人家的函数,怎么用都没有所谓了。
paschen 版主 2016-10-18
  • 打赏
  • 举报
回复
静态成员函数不能直接调用非静态成员函数,但可以通过其他对象调用该对象的非静态成员函数
  • 打赏
  • 举报
回复
构造函数是创建对象的,对象存在的话是不能再调用构造函数的。
fefe82 2016-10-18
  • 打赏
  • 举报
回复
class A { public: void a(){} void b(){} static void c() { A k; k.a(); k.b(); } } 调哪个都没问题啊

65,206

社区成员

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

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