2013-10-17 60 views
0

我试图提示用户键入数据,然后调用函数打印出“类”函数中的数据......这是我的代码如下,它返回奇怪的数字。输出类函数

#include <iostream> 
#include <stdlib.h> 
#include <fstream> 
#include <string> 

using namespace std; 

class planet 
{ 
public: 
    int id_planet; 
    float x,y,z; 
}; 

void report_planet_properties(planet P) 
{ 
    cout<<"Planet's ID: "<<P.id_planet<<endl; 
    cout<<"Planet's coordinates (x,y,z): ("<<P.x<<","<<P.y<<","<<P.z<<")"<<endl; 
} 

void set_planet_properties(planet Q) 
{ 
    cout<<"Enter planet's ID: "; 
    cin>>Q.id_planet; 
    cout<<"Enter planet's coordinates (x,y,z): "; 
    cin>>Q.x>>Q.y>>Q.z; 
} 

int main() 
{ 
    planet G; 
    set_planet_properties(G); 
    report_planet_properties(G); 
} 
+2

传递对象vs通过引用... – initramfs

+0

@CPUTerminator,也可以形成一个答案。 – Chad

+0

@Chad在我甚至可以输入该评论之前,我会回答这个问题lol ...呃...现在有一个答案。 – initramfs

回答

4

这很简单:您传递值而不是引用。这意味着您的功能会收到您传递的对象的副本,而不是对象本身。这与report_planet_properties()不是一个大问题,因为它不会更改收到对象的值(尽管您正在执行不必要的副本),但set_planet_properties()只会更改所接收副本的值,而不会改变原始对象的值。

修复非常简单。只要用这种方式声明你的功能:

void report_planet_properties(const planet& P) // Pass a reference that will not be modified 
void set_planet_properties(planet& Q) // Pass a reference that may be modified 

如果你不知道什么是引用,你需要阅读一本基本的C++书籍。基本上,这是传递对象而不是对象副本的机制,正如我之前所说的。

+0

完全有效....太多了... ^^ –

+0

@AmosChew不客气。 – Gorpik

1

此功能通过数值接受对象的星球:

void set_planet_properties(planet Q) 

所以当你做这样的判断:

set_planet_properties(G); 

创建函数调用对象的本地副本时,您修改该副本的领域,当函数终止时,副本不见了。所以简单的解决方案是通过指针或参考传递对象:

void set_planet_properties(planet &Q) // reference 
void set_planet_properties(planet *Q) // pointer 

这种情况下的参考是优选的。

但更好的解决办法是使report_planet_propertiesset_planet_properties成为类方法。

0

由于您将对象按值传递给方法set_planet_properties(planet Q)report_planet_properties(planet P),因此每种方法都有自己的Planet对象副本,该副本仅对该方法是本地的。因此,在该方法之外对该副本进行的更改是不可见

可以将指针传递到对象这些方法像这样

void report_planet_properties(planet *P); 
void set_planet_properties(planet *Q); 

并在main方法,通过该对象的地址。

set_planet_properties(&G); 
report_planet_properties(&G); 

这使得同一对象在这两种方法并因此修改该对象将被传递的那些方法也以外可见

0

其他答案相当完整。这是一个可供选择的解决方案:

class planet{ 
public: 
    int id_planet; 
    float x,y,z; 

    planet() : id_planet(0),x(0),y(0),z(0) {} 
}; 

planet set_planet_properties(planet Q) 
{ 
    cout<<"Enter planet's ID: "; 
    cin>>Q.id_planet; 
    cout<<"Enter planet's coordinates (x,y,z): "; 
    cin>>Q.x>>Q.y>>Q.z; 

    return Q; 
} 

void main() 
{ 
    planet G; 
    G = set_planet_properties(G); 
    report_planet_properties(G); 
} 

您也可以通过函数返回该对象。