【问题标题】:Calling an object function before declaring it在声明之前调用对象函数
【发布时间】:2013-05-30 19:49:28
【问题描述】:

您好,我想在其他函数中调用对象函数,但我不能。为什么?

class class1
{
private:
    int var;
public:
    class1(int x);
    void functionO();
};

class1::class1(int x)
{
    var = x;
}

void class1::functionO()
{
    cout<<"text";
}

void Callfunction()
{
    object1->function0();
}

int main()
{
    class1 *object1;

    object1 = new class1(x);

    Callfunction();
}

编译器说

'object1' : 未声明的标识符

这似乎合乎逻辑,但我如何在函数中调用该对象函数?

【问题讨论】:

  • 根本不在那个范围内。如果您需要共享变量,请使用参数,或 shudder 全局。
  • 你不需要那个new,你也没有释放那个内存。使用class1 object1(x);
  • 你可能来自java或c#?因为object1 = new class1(x); 只是不必要的复杂性。只需使用class1 object1(x);
  • 附带说明:我建议不要在函数名称的末尾使用“O”,因为它很容易与数字“0”混淆。看起来你已经完成了。

标签: c++ function object


【解决方案1】:

在这段代码中:

void Callfunction()
{
    object1->function0();
}

object1 超出范围。也就是说,编译器不知道 CallFunction() 范围内的任何名为 object1 的内容。

请注意,即使您在main() 之后定义了CallFunction ,这仍然是正确的。所有变量在声明它们的范围内都是本地的。

一种选择是将object1 设为全局,我相信您会被建议这样做。但请不要。全局变量为您的程序引入了状态,随之而来的是许多其他令人讨厌的问题,这些问题很难在不破坏程序的情况下解决。不要养成使用全局变量来解决各种范围问题的习惯。你会后悔的。

相反,为什么不直接将class1 指针传递给CallFunction()?更好的是,传递一个参考。

void CallFunction(class1& obj1)
{
  obj1.function0();
}

int main()
{
    class1 *object1;

    object1 = new class1(x);

    Callfunction(*object1);
}

【讨论】:

    【解决方案2】:

    您的问题与申报顺序无关(之前或之后无关紧要)。您的object1main 的局部变量。这意味着它在main 之外不可见,除非您明确地将它传递给需要它的函数或将指向它的指针存储在全局变量中(但请不要)。因此,为了解决您的问题,您应该将您的对象传递给Callfunction

    void Callfunction(class1& object1)
    {
        object1.function0();
    }
    
    int main()
    {
        class1 object1(x);//<-- This asumes that you have actually defined x 
                          //somewhere, otherwise replace it with an actual value
        Callfunction(object1);
    }
    

    请注意,我冒昧地通过在堆栈上而不是在堆上构造对象来清除不需要的间接寻址(和内存泄漏)。

    【讨论】:

      【解决方案3】:

      将您的对象作为(参考)参数传递给您的函数:

      class class1
      {
      private:
          int var;
      public:
          class1(int x);
          void function0();
      };
      
      class1::class1(int x)
      : var(x) // Note: Use member initializer lists
      {}
      
      void class1::function0()
      {
          std::cout << "text, var = " << var << std::endl;
      }
      

      void Callfunction(class1& object)
      {
          object.function0();
      }
      

      int main()
      {
          class1 object1(10);
          class1 object2(42);
      
          Callfunction(object1);
          Callfunction(object2);
      }
      

      预期输出:

      text, var = 10
      text, var = 42
      

      注意
      声明顺序也很重要,在编译器看到Callfunction() 之后声明class1 时,您可能需要使用前向声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多