zoukankan      html  css  js  c++  java
  • 静态成员变量的初始化,vector类型变量初始化

    http://blog.sina.com.cn/s/blog_67001b350100jmu5.html

    某些情况下,在写C++类的时候,希望能通过一个静态初始化函数来对类的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员里添加一些固定的内容等。这在Java里通过static块很容易实现。但在C++里该怎么办呢?

      如果要初始化一个普通的静态成员,只需要在实现文件(源文件)中定义该成员并赋予初始值即可,比如:

    class Test1 {
    public:
        
    static string emptyString;
    };

    string Test1::emptyString = "";
    // also can be
    // string Test1::emptyString;
    // string Test1::emptyString("");

      静态函数是不能像这样直接调用的。但是,不妨利用一下C++初始化普通成员的特点来调用静态初始化函数。当然,这需要定义一个额外的静态成员变量来辅助一下。如:

    class Test2 {
    public:
        
    static vector<string> stringList;
    private:
        
    static bool __init;
        
    static bool init() {
            stringList.push_back(
    "string1");
            stringList.push_back(
    "string2");
            stringList.push_back(
    "string3");

            
    return true;
        }
    };

    vector
    <string> Test2::stringList;
    bool Test2::__init = Test2::init();

      上面这个示例中初始化成静态成员__init的时候就“顺便”调用了静态初始化函数init(),达到预期目的。

    项目例子:

    #include "StdAfx.h"
    #include "CTrackView.h"
    #include "DataBaseInfo.h"

    CVSS_Rect CTrackView::m_WorldRt(0,0,0,0);
    CRect CTrackView::m_ScreenRt(0,0,0,0);
    HDC CTrackView::m_HDC = NULL;
    v_VnoPoint CTrackView::v_VnoPt;
    CTrackView::CTrackView(void)
    {
    }

    CTrackView::~CTrackView(void)
    {
    }

    .......

    静态数据成员(map容器)一定要记得初始化,否则出现链接错误

    http://blog.csdn.net/meiyuli/article/details/7313155

    会的人都知道,不会的人,都会很郁闷。

    // at testStatic.h

    class testStatic{

    private:

        static map<Type1,Type2> m_staticMap;            // 声明

    }

    //at testStatci.cpp

    map<Type1,Type2> testStatic::m_staticMap;        // 初始化

    很多人应该都会用到这种情况,比如:你需要在你的工程中动态的通过读取配置文件,在内存中记录某些数据。这时候你就需要一个类:

    template<type T>

    class DataMgr{

    public:

         BOOL Load(CString filePath);

         static BOOL GetData(const T &dataID,T &dataVal);

    private:

         static map<T,T> m_dataMgr;

    }

    用该类便可以解决您的问题了,首先在系统启动时,调用一次Load函数,导入您的配置文件,由于类中提供的获取数据接口为静态方式,所以在后面的程序中,您不需要创建类对象便可以对类成员函数进行操作(DataMgr::GetData(...))

    重点在这里,在使用静态类成员变量时,一定要初始化。在这里对map对象的初始化工作:

    // DataMgr.cpp

    map<T,T> DataMgr::m_dataMgr;     // 初始化

    DataMgr::DataMgr();

    DataMgr::~DataMgr();

    好了!这个问题解决了,大家都可以不再困惑了。

  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/3055985.html
Copyright © 2011-2022 走看看