【问题标题】:How to use instance of one class in a method of another class?如何在另一个类的方法中使用一个类的实例?
【发布时间】:2013-09-19 11:51:41
【问题描述】:

我定义了两个类class Aclass B。它们是完全独立的。

现在我创建c 作为class B 的实例和d 作为class A 的实例。现在我想定义functionOfA 的主体,它将对c 执行操作:

class A {
public:
    functionOfA();
}

class B {
    ...
}

A::functionOFA()
{
    c.functionOfB();
}

main()
{
    A d;
    B c;
    d.functionOfA();
}

但是编译器给了我以下错误:c is not declared in this scope

【问题讨论】:

  • 下次我建议使用比A B C 更有意义的名称~> 我知道这只是一个例子,它不是真正的代码,但仍然......任何其他类型的例子会做,动物等。
  • 当然。我会记住的。

标签: c++ class object scope


【解决方案1】:

A::functionOfA()定义需要知道c实例是什么,你可以传入B实例:

class B;

class A
{
public:
    functionOfA(const B& b) const;
};

A::functionOFA(const B& b) const
{
    b.functionOfB();
}

A a;
B b;
a.functionOfA(b); // pass in B instance

【讨论】:

    【解决方案2】:

    在此代码中(您的main):

    {
        A a;
        B b;
        a.functionOfA();
    }
    

    b 是一个只能在这个范围内使用的局部变量。 b 表示具有自动存储持续时间的对象,直到执行超出范围(在这种情况下:超出您的main)。

    当你调用functionOfA方法时,虽然b对象仍然“活着”,但functionOfA没有办法访问这个对象~>这个方法需要引用这个对象(或者它的副本)来使用它:

    class A {
    public:
        void functionOfA(B& b) {
            /* b is now accessible here, this method can also change the object b */
        }
    

    以这种方式调用:

    A a;
    B b;
    a.functionOfA(b);
    

    我建议你也看看这些问题:
    How to pass objects to functions in C++?
    Is it better in C++ to pass by value or pass by constant reference?
    Are there benefits of passing by pointer over passing by reference in C++?

    一些好书在这里也可能很有帮助:
    The Definitive C++ Book Guide and List

    【讨论】:

      【解决方案3】:
      A::functionOFA()
      {
          c.functionOfB();  //You cannot do this unless c is global
      }
      

      但是在你的情况下它在main

      用途:

       B c;
      void A::functionOfA()
      {
          c.functionOfB();
      }
      

      将 B 的对象作为参数传递 functionOfA(const B& c)

      【讨论】:

        【解决方案4】:

        我不明白如果 1 个调用方法是另一个调用方法,它们是如何完全独立的。但是您可以将c 作为参数传递。

        class B
        {public:
            functionOfB();
        }
        
        class A
        {public:
            functionOfA(B /*or B& or const B&, learn about references*/ c);
            .....;
        }
        
        
        
        A::functionOFA(B c)
        {
            c.functionOfB();
        }
        
        B::functionOfB()
        {
          .....
        }
        
        main()
        {
            A d;
            B c;
            d.functionOfA(c);
        }
        

        【讨论】:

        • 在d.functionOfA()中,c的类型应该写什么?
        • 你应该写c,固定
        【解决方案5】:

        你得到这个错误的原因是 c 不能被 A 类的任何对象访问。要改变它,你可以做两件事之一:你可以给 A 一个 B 类型的数据成员并使用它,或者传递在 B 类型的对象中到 A 的函数。

        class A {
        public:
            B objB;
            functionOfA();
        }
        
        class B {
            ...
        }
        
        A::functionOFA()
        {
            objB.functionOfB();
        }
        
        main()
        {
            A d;
            B c;
            d.objB = c;
            d.functionOfA();
        }
        

        OR(保持它们独立)

        class A {
        public:
            functionOfA(B& objB);
        }
        
        class B {
            ...
        }
        
        A::functionOFA(B& objB)
        {
            objB.functionOfB();
        }
        
        main()
        {
            A d;
            B c;
            d.functionOfA(c);
        }
        

        查看依赖注入。我认为您可以使用该技术在第一个场景中使 A 与 B 的类型无关。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多