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


    论坛里提问的总结

    问题

    以下是昨天遇到的一个程序的模拟版,现在的疑惑就是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://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    高级软件工程--第八次作业
    高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
    Bate测试报告
    版本发布说明
    Beta版本展示博客
    Beta阶段总结分析报告
    Bate敏捷冲刺每日报告--day5
    Bate敏捷冲刺每日报告--day4
    Bate敏捷冲刺每日报告--day3
    Kettle中通过触发器方式实现数据 增量更新
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/9219787.html
Copyright © 2020-2023  润新知