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

4 回答 4

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++ 书籍。基本上,正如我之前所说,这是传递对象而不是对象副本的机制。

于 2013-10-17T14:47:45.413 回答
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成为类方法。

于 2013-10-17T14:51:07.260 回答
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);
}

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

于 2013-10-17T14:58:36.690 回答
0

由于您将对象按值传递给方法set_planet_properties(planet Q)and 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);

这使得同一个对象在两个方法中都被传递,因此对该对象的修改在这些方法之外也是可见的。

于 2013-10-17T14:57:41.450 回答