2014-01-22 47 views
0

我在使用其他函数的返回值时遇到问题。这里还有一些细节:C++ - 在另一个函数中使用的返回值

Class1.cpp:

Double Class1::SetValue (double value2) 
{ 
    // method code 
    Return value_set; 
} 

Class2.cpp:

Void Class2::CountValue(double a) 
{ 
    Class1 *object1; 
    Double value_received= object1->SetValue(object1->value2) 
    // do something with value_received 
} 

的问题是,我需要在CountValue在Class2中使用value_set从的SetValue。上面的代码给我错误:

Unhandled exception at 0x6462696c in xxx.exe: 0xC0000005: Access violation. 

你能帮助我吗?

+0

'object1'不是99,99%的有效指针。 – luk32

+3

'object1'似乎未初始化。 –

+1

这段代码是你的实际代码还是只是一个例子? – 0x499602D2

回答

3

在您的SetValue调用中,您传递的参数为object1->value2。但是你还没有设置指针object1,它仍然是未初始化的。这是未定义的行为。你很幸运,它可能会崩溃,或者你可能会很难找到它。

+0

我想知道如何在未初始化的指针上调用方法。我认为这是非常正常的崩溃。幸运将不会崩溃= D – luk32

+0

@ luk32,是的崩溃是最有可能的结果,但它不能保证。这就是为什么我说你很幸运 - 它很可能不会按照你想要的方式工作,也不太可能每次运行它都是一样的。 –

+0

当然,但是当您说,在尝试访问和运行基本上随机的代码时碰撞时有任何运气,我感到很有趣。预计。可能不会崩溃/挂起比赢彩票或其他东西的可能性更小。当然这并不能保证,但在这种情况下并不幸运。很明显,它不会做出预期并且很有可能大幅度崩溃的事情。但我想它是个人品味的问题。我们可以称自己是幸运的,每天过后不会死亡。尽管看起来很正常。 – luk32

0

有几个问题。初始化一个带有某个函数返回值的变量应该没有问题。我们一直这样做,即使通常不会像算术运算符或按位运算符那样看到典型的函数调用。

随着你的功能

double Class1::SetValue(double value2) 
{ 
    //generally you are setting some variable that is a part of Class1 
    this->value = value2; 

    //if you are returning something you might want to have some error code 
    //just in case something went wrong, but it looks like you are just 
    //returning the number that you are sending in as a parameter. 

    return value2; 
} 

我不知道什么是你的下一个功能回事,但我们可以对它进行解剖。

void Class2::CountValue(double a) 
{ 
    Class1 *object1;//this is a pointer to an object, not an instance of an object 

    //      object1 is not initialized so you cannot 
    //      use object1->value2 even if it is set in 
    //      your default constructor 

    double value_received = object1->SetValue(object1->value2); 
    // do something with value_received 
} 

为了让你的代码工作,你可能需要将其改成

void Class2::CountValue(double a) 
{ 
    Class1 object1;//not a pointer to Class1 anymore 

    // This will work if object1.value2 is set in the default constructor 

    double value_received = object1.SetValue(object1.value2); 
    // do something with value_received 
} 

,或者如果你想同时设置value_recieved和object1.value2我们可以做

void Class2::CountValue(double a) 
{ 
    Class1 object1;//not a pointer to Class1 anymore 

    double value_received = object1.SetValue(12.2); 
    // do something with value_received 
} 
相关问题