Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将自己类的实例传递给另一个_C++_Class_Instance - Fatal编程技术网

C++ 将自己类的实例传递给另一个

C++ 将自己类的实例传递给另一个,c++,class,instance,C++,Class,Instance,假设我有这些课程(问号标记我需要通过的问题): 您可以传递自己类的实例吗?或者这只是我这边失败的类结构的一个示例吗?成员函数中的当前对象是*this。您可以将其传递给另一个函数 你必须考虑这些类是如何相互依赖的,并且在声明完成之前,一个类不能使用其他类。 不过,这是可行的: class A { //... public: void pass(); }; class B { //... public: void doSth(const A &sth) {

假设我有这些课程(问号标记我需要通过的问题):


您可以传递自己类的实例吗?或者这只是我这边失败的类结构的一个示例吗?

成员函数中的当前对象是
*this
。您可以将其传递给另一个函数

你必须考虑这些类是如何相互依赖的,并且在声明完成之前,一个类不能使用其他类。 不过,这是可行的:

class A
{
  //...
  public:
  void pass();
};

class B
{
  //...
  public:
  void doSth(const A &sth)
  {
    //...
  }
};


// Here both classes are completely declared

void A::pass()
{
   B ins;
   ins.doSth(*this);
}


int main()
{
  A te;
  te.pass();
}
您的类“包含”彼此的实例,因此您将面临未声明类型的错误。要解决此问题,您需要使用转发声明

你将面临另一个问题:

如果您的方法
doSth()
pass()
是内部定义的,那么您将面临一个问题:“使用不完整的类型”。解决方法是在类之外实现这些方法,以便每个对象在使用之前都已完全构造

该程序可能如下所示:

class A;
class B;

class A{
  public:
    void pass();
};

class B{
  public:
      void doSth(const A &sth){
  }
};

void A::pass(){
    B ins;
    ins.doSth(*this);
}

int main(){
  A te;
  te.pass();

  return 0;
}

考虑使用<代码>前向声明< /代码> +。在构造函数之后在类之外实现方法,以避免使用
不完整类型
编译时错误。是否尝试了原始代码?我的意思是,由于“B”实例是在函数定义块内声明的(在第二次编译过程中处理),而不是在函数签名中或作为“a”的数据成员声明的,所以它实际上应该编译。@Red.Wave:我明白你的意思。但我只是在OP面临一些问题时才指向他/她,比如声明无法编译的成员数据。我明白了。我只是怀疑我的记忆力。
class A;
class B;

class A{
  public:
    void pass();
};

class B{
  public:
      void doSth(const A &sth){
  }
};

void A::pass(){
    B ins;
    ins.doSth(*this);
}

int main(){
  A te;
  te.pass();

  return 0;
}