-3

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

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”:未声明的标识符

这似乎合乎逻辑,但我怎么能在一个函数中调用那个对象函数呢?

4

3 回答 3

3

在这段代码中:

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

object1超出范围。也就是说,编译器不知道任何object1CallFunction().

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

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

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

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

int main()
{
    class1 *object1;

    object1 = new class1(x);

    Callfunction(*object1);
}
于 2013-05-30T19:56:05.893 回答
1

您的问题与申报顺序无关(之前或之后无关紧要)。您object1是 的局部变量main。这意味着它在 之外是不可见的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);
}

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

于 2013-05-30T19:56:05.520 回答
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

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

于 2013-05-30T19:52:35.483 回答