我怎样才能转发声明一个类并稍后在 c++ 中使用其成员功能

How can I forward declare a class and use its member funcions later in c++?

本文关键字:c++ 功能 成员 一个 转发 声明      更新时间:2023-10-16

是否可以转发声明一个类,然后使用其成员功能?我正在尝试这样做:

class Second;
class First{
private:
  int x=0;
public:
  void move(Second* s,int i){
   s->setLine(i);
   s->called(true);
  }
  int getX(){return x;}
}
class Second{
private:
 int line=2;
 bool cal=false;
public:
 void setLine(int l){line = l;}
 void called(bool b){cal=b}
 bool interact(First* f){
  if ((f->getX())>3)
     return true;
  else
     return false;
 }
}

我的实际问题有点复杂,功能做更多的事情,但我试图做的是让这两个类相互使用功能并让它们以这种方式交互。有谁知道是否有办法做到这一点?

是否可以转发声明一个类,然后使用其成员函数?

不,不是。在定义类之前,无法访问向前声明的类、变量、函数、枚举、嵌套类型等的任何成员。

在定义前向声明类之后,需要移动调用前向声明类的成员函数的函数的实现。

class Second;
class First{
   private:
      int x=0;
   public:
      void move(Second* s,int i); // Don't define it here.
      int getX(){return x;}
};
class Second{
   ...
};
// Define the function now.
void First::move(Second* s,int i){
   s->setLine(i);
   s->called(true);
}

你可以把First::move的定义放在类之外,在Second的定义之后。只有声明需要出现在First的定义中。

实际上,您可以将First::move的定义放在.cpp文件中,而不是放在任何标头中。

下面将为您解决问题,但最好将声明和实现分开。

class Second;
class First{
private:
  int x=0;
public:
  void move(Second* s,int i); //<- move implementation after Second's declaration
  int getX(){return x;}
}
class Second{
private:
 int line=2;
 bool cal=false;
public:
 void setLine(int l){line = l;}
 void called(bool b){cal=b}
 bool interact(First* f){
  if ((f->getX())>3)
     return true;
  else
     return false;
 }
};
void First::move(Second* s,int i){
s->setLine(i);
s->called(true);
}