C++ C++;当全局变量不合适时保持计数

C++ C++;当全局变量不合适时保持计数,c++,global-variables,forward-declaration,C++,Global Variables,Forward Declaration,我需要协调并向来自特定祖辈对象的对象实例发出唯一的顺序数字标识符(1、2、3…等等) < >我使用微软编译器创建一个C++ DLL,其中所有变量都封装在对象内部;在这种情况下,全局变量不是一个选项,事实上,在这个项目中,全局变量正在被设计出来 我尝试了以下方法来解决该问题,并发现通过前向声明无法访问另一个对象的成员函数(注意:代码说明了我试图实现的目标,由于不正确使用前向声明来访问成员函数,它将无法编译): 祖父母班: //GrandParent class GrandParent { publ

我需要协调并向来自特定祖辈对象的对象实例发出唯一的顺序数字标识符(1、2、3…等等)

< >我使用微软编译器创建一个C++ DLL,其中所有变量都封装在对象内部;在这种情况下,全局变量不是一个选项,事实上,在这个项目中,全局变量正在被设计出来

我尝试了以下方法来解决该问题,并发现通过前向声明无法访问另一个对象的成员函数(注意:代码说明了我试图实现的目标,由于不正确使用前向声明来访问成员函数,它将无法编译):

祖父母班:

//GrandParent
class GrandParent
{
public GrandParent(){}

int addParent()
{
Parent *par = new Parent(this);
return 0;
}

int incrementGrandChildIDNumber()
{
return grandChildIDNumber +=1;//increment
}

private:
int grandChildIdNumber;//keep count.  This NEEDS to be encapsulated. Cannot be a
 //global variable as there will be multiple instances of GrandParent each counting
 //and labeling it's own grand children.
};
//Parent
class GrandParent;//forward declaration
class Parent
{
public Parent(GrandParent *ptrToGrandParent): ptr2GP(ptrToGrandParent){}

addGrandChild()
{
id = ptr2GP->incrementGrandChildIDNumber();//but forward declaration does not
    //give access to GrandParent member functions, right??
GrandChild grndChld = new GrandChild(id);
return 0;
}

private:
int id;
GrandParent *ptr2GP;
};
父类:

//GrandParent
class GrandParent
{
public GrandParent(){}

int addParent()
{
Parent *par = new Parent(this);
return 0;
}

int incrementGrandChildIDNumber()
{
return grandChildIDNumber +=1;//increment
}

private:
int grandChildIdNumber;//keep count.  This NEEDS to be encapsulated. Cannot be a
 //global variable as there will be multiple instances of GrandParent each counting
 //and labeling it's own grand children.
};
//Parent
class GrandParent;//forward declaration
class Parent
{
public Parent(GrandParent *ptrToGrandParent): ptr2GP(ptrToGrandParent){}

addGrandChild()
{
id = ptr2GP->incrementGrandChildIDNumber();//but forward declaration does not
    //give access to GrandParent member functions, right??
GrandChild grndChld = new GrandChild(id);
return 0;
}

private:
int id;
GrandParent *ptr2GP;
};
孙辈阶级:

//GrandChild
 class GrandChild
{
 public:
    GrandChild(const int &id):idNumber(id){}

 private:
int idNumber;
};
我已经简化了这个问题,实际上每个类都要长得多,并且定义在自己的头文件中


我的问题是:如果转发声明不起作用,并且全局变量不适用于此项目,那么还有哪些其他选项可用于协调向孙对象发布ID号?

有一个singleton类,该类具有生成唯一标识符的功能。(这可以是基于计数器的顺序,也可以基于您喜欢的任何其他方案。)


或者,这可以只是基类中的一个函数,它基于静态计数器返回唯一的id。您甚至可以将其放入基类构造函数中。

在不同的文件中分离类定义和声明,并使用静态变量:

// GrandParent.hh
#ifndef _GrandParent_
#define _GrandParent_

class Parent;

class GrandParent
{
  public:
    GrandParent();

    Parent * addParent();

    int incrementGrandChildIDNumber();

  private:
    static int grandChildIdNumber;
};

#endif


// GrandParent.cpp
#include "GrandParent.hh"
#include "Parent.hh"

int GrandParent::grandChildIdNumber = 0;

GrandParent::GrandParent()
{
}

Parent * GrandParent::addParent()
{
  Parent * par = new Parent(this);
  return par;
}

int GrandParent::incrementGrandChildIDNumber()
{
  return grandChildIdNumber++;
}

// Parent.hh
#ifndef _Parent_hh_
#define _Parent_hh_

class GrandParent;//forward declaration
class GrandChild;

class Parent
{
  public:
    Parent(GrandParent *ptrToGrandParent);

    GrandChild * addGrandChild();

  private:
    int id;
    GrandParent * ptr2GP;
};
#endif

// Parent.cpp
#include "Parent.hh"

#include "GrandParent.hh"
#include "GrandChild.hh"

Parent::Parent(GrandParent * ptrToGrandParent) : 
  ptr2GP(ptrToGrandParent)
{
}

GrandChild * Parent::addGrandChild()
{
  id = ptr2GP->incrementGrandChildIDNumber();
  GrandChild * grndChld = new GrandChild(id);
  return grndChld;
}


// GrandChild.hh
#ifndef _GrandChild_hh_
#define _GrandChild_hh_

class GrandChild
{
  public:
    GrandChild(int id);

  private:
    int idNumber;
};

#endif

// GrandChild.cpp
#include "GrandChild.hh"

GrandChild::GrandChild(int id) : 
  idNumber(id)
{
}
并从主菜单中使用它们:

#include "GrandParent.hh"
#include "Parent.hh"
#include "GrandChild.hh"

int main(int argc, char ** argv)
{
  GrandParent grandPa;

  Parent * parent1 = grandPa.addParent();
  Parent * parent2 = grandPa.addParent();

  GrandChild * gChild1_1 = parent1->addGrandChild();
  GrandChild * gChild1_2 = parent1->addGrandChild();

  GrandChild * gChild2_1 = parent2->addGrandChild();
  GrandChild * gChild2_2 = parent2->addGrandChild();
}

在实际应用中,会有多个祖辈实例,因此它们都会引用相同的静态变量?我说得对吗?我需要每个祖父母都有一个唯一的数字,不包括其他祖父母的孙子孙女。所以,将
GrandParent::granderidnumber
更改为非静态变量,但不要忘记在GrandParent构造函数上初始化。一个单实例如何允许多个GrandParent实例中的一个保持其子实例的唯一计数,以及如何允许父对象在创建新实例时获得计数的增量孙子?啊哈,你说得对,对不起,我误解了你的问题;我以为您想要一个所有实例都共享的计数器。在这种情况下,代码很好,只需通过分离类实现和声明来编译代码即可。基本上是Tio Pepe的答案。