-1

重複の可能性:
C ++の関数にオブジェクトを渡す方法は?

メインクラス

#include "List.h"
#include "Car.h"
#include "Worker.h"
#include "Queue.h"
#include <iostream>
#include <string>

using namespace std;
void initWorkerList(List<Worker>);
void initCarList(List<Car>, Queue, Queue);

int main() {
    List<Worker> WorkerList;
    List<Car> CarList;
    Queue q1, q2;
    initWorkerList(WorkerList);
    initCarList(CarList, q1, q2); // Error here
        //..... e.g cout << "Successful!"; but it does not displays it...
}

void initWorkerList(List<Worker> WorkerList) {
    Worker w1 = Worker("Ben Ang", "Ben123", "pass123", 'M');
    WorkerList.add(w1);
    Worker w2 = Worker("Grace Eng", "Gr4ce", "loveGrace", 'W');
    WorkerList.add(w2);
    Worker w3 = Worker("Rebecca Xuan", "Xuanz", "Rebecca Xuan", 'W');
    WorkerList.add(w3);
}

void initCarList(List<Car> CarList, Queue q1, Queue q2) {
    Car c1 = Car("SJS1006Z","Toyota", "Saloon car");
    Car c2 = Car("SFW6666E", "hyundai", "Taxi (Saloon)");
    Car c3 = Car("SCF1006G","Mercedes", "Large Van");
    Car c4 = Car("SBQ1006Z", "Puma", "Saloon Car");

    q1.enqueue(c1);
    q2.enqueue(c1);
    q2.enqueue(c3);
    q1.enqueue(c4);
    q1.enqueue(c1);
    q1.enqueue(c1);
    q1.enqueue(c1);
    q2.enqueue(c2);
    q2.enqueue(c2);
}

エラーはまったくありません。しかし、デバッグ時に何も表示されません...試してみましたが、initCarList(CarList、q1、q2);に何か問題があると思います。そのコードの後に​​、他のコードがまったく機能する可能性があります。何か問題がありますか?ありがとう

4

3 に答える 3

5

キュー変数を参照ではなく値で渡しています。

initCarList(CarList, q1, q2); // Error here

そのため、initCarList の変更は発信者に反映されません

関数の署名を次のように変更します

void initCarList(List<Car> CarList, Queue& q1, Queue& q2) {

そして宣言

void initCarList(List<Car>, Queue&, Queue&);

パラメーターを値で渡す場合、内部の変更initCarListは関数スコープに対してローカルであり、反映されません。

Pass by Value
Caller              Callee

|------|            |------|
workedList          workedList
| ___  |            | ___  |
||   | |-------->   ||   | | <------
||___| |            ||___| |       |
|      |            |      |       |
|q1    |            |q1    |     (Changing any of these variables 
| ___  |            | ___  |      won't be reflected back)
||   | |-------->   ||   | |       |
||___| |            ||___| |       |
|      |            |      |       |
|q2    |            |q2    |       |
| ___  |            | ___  |       |
||   | |-------->   ||   | |       |
||___| |            ||___| | <------
|______|            |______|


Pass by reference

Caller              Callee

--------            --------
|wList |            |wList |
| ___  |            | ____ |
||   | |-------->   ||    || <------
||___|<|------------||-*__||       |
|   _  |            |      |       |
|q1    |            |q1    |     (Changing any of these variables 
| ___  |            | ____ |       will be reflected back)
||   | |-------->   ||    ||       |
||___|<|------------||-*__||       |
|      |            |      |       |
|q2    |            |q2    |       |
| ___  |            | ____ |       |
||   | |-------->   ||    ||       |
||___|<|------------||-*__|| <------
|______|            |______|
于 2013-01-13T06:50:24.203 に答える
2

変数を値で渡します。つまり、関数のパラメーターはそれらのコピーを保持し、関数の終了時に変更して破棄します。代わりに参照渡しして、元の変数を変更します。たとえば、次のinitCarListようになります。

void initCarList(List<Car> CarList, Queue &q1, Queue &q2)

パラメータも使用しないため、CarListコード内でこのようになっている場合は、パラメータを削除することもできます。

于 2013-01-13T06:50:00.037 に答える
2

関数は値渡しです。つまり、関数は渡された変数のコピーを作成し、コピーされた変数を操作します。元のものを変更するには、参照によってパラメーターを渡す必要があります

変化する:

void initWorkerList(List<Worker>);
void initCarList(List<Car>, Queue, Queue);

に:

void initWorkerList(List<Worker> &);
void initCarList(List<Car>&, Queue&, Queue&);
于 2013-01-13T06:53:27.547 に答える