我如何转发声明 class 并稍后在 C++ 中使用其成员函数?

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

是否可以转发声明一个class然后使用它的成员函数?我正在尝试这样做:

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;
 }
}

我的实际问题有点复杂,函数做的事情更多,但我想做的是让这两个 classes 使用彼此的函数并让它们以这种方式交互。有谁知道有没有办法做到这一点?

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

的定义中

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

Is it possible to forward declare a class and then use its member functions?

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

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

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);
}

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

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);
}