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

この関数は、オブジェクト Planet を値で受け取ります。

void set_planet_properties(planet Q)

したがって、この呼び出しを行うと:

set_planet_properties(G);

オブジェクトのローカルコピーと呼ばれる関数が作成されると、そのコピーのフィールドが変更され、関数が終了するとそのコピーはなくなります。したがって、簡単な解決策は、オブジェクトをポインターまたは参照で渡すことです。

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

この場合の参照が優先されます。

しかし、より良い解決策は、makereport_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に渡すため、各メソッドには、そのメソッドのみにローカルな objectreport_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 に答える