主要课程
#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)有问题;在该代码之后,其他代码可以工作。它有什么问题吗?感谢
答案 0 :(得分: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 | |
| ___ | | ____ | |
|| | |--------> || || |
||___|<|------------||-*__|| <------
|______| |______|
答案 1 :(得分:2)
您通过值传递变量,这意味着函数的参数包含它们的副本,您可以在函数结束时修改和丢弃它们。通过引用传递而不是修改原始变量。例如,initCarList
将成为:
void initCarList(List<Car> CarList, Queue &q1, Queue &q2)
您也不使用CarList
参数,因此如果您的代码中出现这种情况,也可以将其删除。
答案 2 :(得分:2)
您的函数按值传递,这意味着函数会复制传入的变量并对复制的变量进行操作。要修改原始版本,您需要通过引用传递参数
变化:
void initWorkerList(List<Worker>);
void initCarList(List<Car>, Queue, Queue);
要:
void initWorkerList(List<Worker> &);
void initCarList(List<Car>&, Queue&, Queue&);