C ++在另一个类的非静态函数中使用静态类成员

时间:2014-05-24 03:56:24

标签: c++ class oop architecture static

所以这是我的课程:

class A 
{
   public:

   static MyObject *getObject(std::string string)
   {  
       if(string == "string1")
           return object1; 
       else if(string == "string2");
           return object2;
       else 
           return object3;
   }


   static MyObject *object1;
   static MyObject *object2;
   static MyObject *object3;
}

#include "A.h"

class B
{

    public:

    void initMethod();

    void myMethod();

}

 //B.cpp file
 #include "B.h"

 void B::init()
 {
     A::object1 = new MyObject();
     A::object2 = new MyObject();
     A::object3 = new MyObject();
  }

  void B::myMethod
  {
    MyObject *currentObject = A::getObject("string1");

     //Do stuff with MyObject
  }

正如您所看到的,我首先尝试初始化B内部的A成员,然后在不同的函数中访问这些成员。但是,每次我尝试访问B中的A类数据时,我都会得到一个“未定义的符号,用于架构x86_64”编译器错误,我似乎无法弄清楚原因。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的代码有几处错误:

  1. 您使用的是Class B,应为class B
  2. initMethodmyMethod在他们之后缺少()
  3. static中的A成员必须在源(.cpp)文件中定义,否则会出现链接器错误。
  4. 所以对于前。在您的main.cpp文件中,您必须定义它们

    MyObject* A::object1 = new MyObject(/*param*/);
    //others
    

    修改 根据OP的评论,我认为您应该了解对象生存期变量范围。您可以查看以下链接123。您还可以搜索更多内容。特别是,static变量一旦创建就具有整个程序生命周期的生命周期。因此,在输入方法后,方法中声明的static变量具有生命周期,创建变量,然后直到程序终止。类级别,全局static变量具有在main之前(或在程序执行开始之前)开始的生命周期,并且在程序终止之前保持活动状态。在您的情况下,由于您在类级别创建static变量,编译器将尝试在程序启动之前将它们保留在内存中,为此,它们必须在可访问区域中可见/定义。这就是为什么你必须在你的成员方法之外定义它们的原因。

      

    一旦我这样做,我可以在我的init()中初始化它们?如果我想在另一个类中使用相同的对象,比如C类,该怎么办?我是否必须再次在C.cpp中重新定义它们?

    1. 是的,您可以在不初始化的情况下定义它们(它们将使用默认值创建),然后您可以使用init()方法分配正确的值。

        

      MyObject * currentObject; //在全球范围内   //然后在init中分配

           

      A :: object1 = new MyObject();

    2. 不,你只需定义一次。在任何其他类/方法中,您将能够使用A::object1等引用相同的变量。

答案 1 :(得分:-1)

静态成员需要在全局范围内定义(它们是静态全局变量),如下所示:

class A {
public:
  static int i; // declaration, not definition.
};

int A::i; // definition (initialization here is not mandatory, but be careful...)

int main(...) {
  A::i = 0; // complex initialization can be performed here...
  ...
}

静态成员的初始化有时可能非常棘手,尤其是当两者之间存在依赖关系时。