首页 > 其他 > 详细

对象调用非静态函数的问题

时间:2018-06-24 10:45:41      阅读:162      评论:0      收藏:0      [点我收藏+]

论坛里提问的总结

问题

以下是昨天遇到的一个程序的模拟版,现在的疑惑就是main.cpp中GetSBH()返回的是静态变量吗?换句话说,函数的返回值还有static属性吗?https://bbs.csdn.net/topics/392402302

//SBH.h
#pragma once
class SBH
{
public:
    void S2B(int i);
 
    SBH();
};
 
 
//ME.h
#pragma once
#include "SBH.h"
 
class ME
{
public:
 
    static SBH * m_pSBH;
    static SBH *GetSBH();
 
    ME();
};
 
 
 
//ME.cpp
#include "ME.h"
#include "SBH.h"
 
SBH * ME::m_pSBH;
 
ME::ME()
{
    m_pSBH = nullptr;
}
 
 
SBH *ME::GetSBH()
{
    return m_pSBH;
}
 
 
 
//main.cpp
#include "ME.h"
#include "SBH.h"
 
void SBH::S2B(int i)
{
    std::cout << "I am not Wrong!" << std::endl;
}
 
int main()
{
    ME::GetSBH()->S2B(1);    //此处GetSBH()返回的是静态变量吗?
    return 0;
}

大神的解答

static是来修饰成员函数的,说明其是一个静态成员函数,static不用来修饰返回值.而这里的ME::GetSBH()是一个临时对象,其值是m_pSBH通过值传递方式传递过来的.
如果你要返回的是静态成员变量本身,要按引用返回.

///////////////////////////////////引用传递////////////////////////////////
//SBH.h
#pragma once
class SBH
{
public:
    void S2B(int i);

    SBH( ) {}    //如果写成SBH();  会报错:LNK2019  无法解析的外部符号 "public: __cdecl SBH::SBH(void)" (??0SBH@@QEAA@XZ),该符号在函数 "void __cdecl `dynamic initializer for ‘public: static class SBH ME::m_pSBH‘‘(void)" (??__E?m_pSBH@ME@@2VSBH@@A@@YAXXZ) 中被引用.
        
        //这是为什么呢?感觉构造函数这块没有完全弄懂.

//ME.h
#pragma once
#include "SBH.h"

class ME
{
public:

    static SBH m_pSBH;
    static SBH &GetSBH();

    ME();
};



//ME.cpp
#include "ME.h"
#include "SBH.h"

SBH  ME::m_pSBH;

ME::ME()
{
    
}


SBH &ME::GetSBH()
{
    return m_pSBH;
}



//main.cpp
#include "ME.h"
#include "SBH.h"

void SBH::S2B(int i)
{
    std::cout << "I am not Wrong!" << std::endl;
}

int main()
{
    ME::GetSBH().S2B(1);
    return 0;
}

对象调用非静态函数的问题

原文:https://www.cnblogs.com/Stephen-Qin/p/9219787.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!