在声明之前调用对象函数

时间:2013-05-30 19:49:29

标签: c++ function object

嗨我想在其他功能中调用对象功能,但我不能。为什么?

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

Compilator说

  

'object1':未声明的标识符

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

3 个答案:

答案 0 :(得分:3)

在此代码中:

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

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

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

一种选择是让object1成为全球性的,我相信你会被建议这样做。但请不要。全局变量会向您的程序引入状态,以及一系列其他令人讨厌的问题,如果不将程序拆分而难以修复。不要养成使用全局变量来修复各种范围问题的习惯。你会后悔的。

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

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

int main()
{
    class1 *object1;

    object1 = new class1(x);

    Callfunction(*object1);
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您的问题与声明顺序无关(在无关紧要之前或之后)。您的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);
}

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