代码之家  ›  专栏  ›  技术社区  ›  Sam Liao

静态成员的多个定义?

c++
  •  9
  • Sam Liao  · 技术社区  · 15 年前

    无法链接以下两个文件,当我删除“static”关键字时,就可以了。用g++测试。 使用readelf检查对象文件,静态成员似乎导出为全局对象符号。。。我认为它应该是一个本地对象。。。?

    class StaticClass
    {
    public:
    
        void    setMemberA(int m)   { a = m;    }   
        int     getMemberA() const  { return a; }
    
    private:
        static  int     a;  
    
    };
    int StaticClass::a = 0;
    void first()
    {
        StaticClass statc1;
        static1.setMemberA(2);
    }
    

    静态2.cpp

    class StaticClass
    {
    public:
    
        void    setMemberA(int m)   { a = m;    }   
        int     getMemberA() const  { return a; }
    
    private:
        static  int     a;  
    
    };
    int StaticClass::a = 0;
    void second()
    {
        StaticClass statc1;
        static1.setMemberA(2);
    }
    

    错误信息

    /tmp/ccIdHsDm.o:(.bss+0x0):多个

    4 回复  |  直到 15 年前
        1
  •  19
  •   Ropez    15 年前

    似乎您正试图在每个源文件中使用相同名称的本地类。在C++中,可以将本地类封装在匿名命名空间中:

    namespace {
    class StaticClass
    {
    public:
    
        void    setMemberA(int m)   { a = m;    }   
        int     getMemberA() const  { return a; }
    
    private:
        static  int     a;  
    
    };
    int StaticClass::a = 0;
    } // close namespace
    
    void first()
    {
        StaticClass statc1;
        static1.setMemberA(2);
    }
    
        2
  •  9
  •   Johannes Schaub - litb    15 年前

    int StaticClass::a = 0;
    

    如果有多个这样的定义,就好像调用了多个函数一样 first . 他们会发生冲突,链接器会抱怨。

        3
  •  3
  •   UncleZeiv    15 年前

    声明

    int StaticClass::a = 0;
    

    至于你的评论,你可能混淆了这个词的两种不同用法 static 关键词。在C static中,它的意思是“使用内部链接”,这意味着变量或函数的名称在定义它的翻译单元之外看不到。

    在课堂上, 静止的 用于定义类成员,即不引用类的特定实例的变量或方法。在这种情况下,静态变量的存储必须分配到某个地方(因为它不是任何实例的一部分),当然只能分配到一个地方。

        4
  •  0
  •   fbrereto    15 年前

    StaticClass a ,一个将由所有类实例共享的静态变量-有两行这样做,每个文件中一行。删除一个将修复链接器错误。