【问题标题】:Passing instance of own class to another将自己的类的实例传递给另一个
【发布时间】:2018-10-10 01:44:02
【问题描述】:

假设我有这些课程(问号标记我需要在这里传递的问题):

class A
{
  ...
  public:
  void pass()
  {
     B ins;
     ins.doSth(?????);
  }
};

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

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

你能传递一个你自己的类的实例,还是这只是我这边失败的类结构的一个例子?

【问题讨论】:

  • 考虑使用forward-declaration。 + 在构造函数之后实现类外的方法以避免使用incomplete type 编译时错误。

标签: c++ class instance


【解决方案1】:

成员函数中的当前对象是*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();
}

【讨论】:

    【解决方案2】:

    您的类“包含”彼此的实例,因此您将面临未声明类型的错误。要解决此问题,您需要使用前向声明。

    你会面临另一个问题:

    如果您的方法 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。
    • 我明白了。我只是怀疑自己的记忆。
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2015-05-13
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多