我将首先解释我的问题,然后提供很好的代码部分.我用一个名为process的自定义类填充队列.使用此行:
ProcessQueue.push(new Process(inputs[0], inputs[1], inputs[2], inputs[3], inputs[4]));
Run Code Online (Sandbox Code Playgroud)
这一切看起来都很好,当循环完成时,进程队列中充满了指针.但经过进一步检查,我发现他们都指向SAME对象?
发现这个好奇,我在循环的每次迭代中都进入了构造函数.
第一次迭代:当输入构造函数时,所有实例变量都为null(如预期的那样)
第二次迭代:在进入构造函数时,所有实例变量都包含在第一次迭代中赋予对象的值(即:相同的对象)
此后,当我使用队列时,我已经确认队列中的每个指针都指向同一个进程对象.(我可以告诉这个,因为进程包含一个状态,如果循环通过队列改变状态,我会发现状态已经改变为第二个指针)
我怀疑我一定是在创造课堂上做错了.所以这里完全是这样.
Process.h
#pragma once
class Process
{
public:
Process(int _processId, int _arrivalTime, int _CPUTime,
int _IOFrequency, int _IODuration);
~Process();
bool HasArrived(int time);
bool HasCompleted();
bool HasFinishedBurst();
bool HasFinishedIO();
int GetQueueNum();
int GetID();
void SetQueueNum(int i);
void SetToReady();
void Run();
void PerformIO();
};
Run Code Online (Sandbox Code Playgroud)
Process.cpp
#include "stdafx.h"
#include "Process.h"
#include <string>
using namespace std;
int processId;
int arrivalTime;
int CPUTime;
int IOFrequency;
int IODuration;
int Ticks;
int CPUConsumption;
int CPUBurstSize;
int queueNumber;
int IOBurstCount;
string state;
Process::Process(int _processId, int _arrivalTime, int _CPUTime,
int _IOFrequency, int _IODuration)
{
processId = _processId;
arrivalTime = _arrivalTime;
CPUTime = _CPUTime;
IOFrequency = _IOFrequency;
IODuration = _IODuration;
IOBurstCount = 0;
CPUConsumption = 0;
Ticks = 0;
queueNumber = 0;
state = "None";
printf("%d: %s\n", processId,state.c_str());
int excess = CPUTime % IOFrequency;
if (excess == 0)
{
CPUBurstSize = CPUTime / IOFrequency;
}
else
{
CPUBurstSize = (CPUTime - excess) / (IOFrequency - 1);
}
}
Process::~Process()
{
}
bool Process::HasArrived(int time)
{
if (arrivalTime <= time)
{
if (state.compare("Newly Arrived") == 0)
{
printf("Already arrived!\n");
}
state = "Newly Arrived";
printf("%d: %s\n", processId, state.c_str());
return true;
}
else
{
return false;
}
}
bool Process::HasCompleted()
{
if (CPUConsumption == CPUTime && IOBurstCount == IOFrequency)
{
state = "Finished";
printf("%d: %s\n", processId, state.c_str());
return true;
}
else
{
return false;
}
}
bool Process::HasFinishedBurst()
{
if (Ticks == CPUBurstSize)
{
Ticks = 0;
state = "Blocked";
printf("%d: %s\n", processId, state.c_str());
return true;
}
else
{
return false;
}
}
bool Process::HasFinishedIO()
{
if (Ticks >= IODuration)
{
IOBurstCount++;
Ticks = 0;
return true;
}
else
{
return false;
}
}
void Process::SetToReady()
{
state = "Ready";
printf("%d: %s\n", processId, state.c_str());
}
void Process::Run()
{
state = "Running";
printf("%d: %s\n", processId, state.c_str());
Ticks++;
CPUConsumption++;
}
void Process::PerformIO()
{
Ticks++;
}
int Process::GetQueueNum()
{
return queueNumber;
}
void Process::SetQueueNum(int i)
{
queueNumber = i;
}
int Process::GetID()
{
return processId;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑我以某种方式创建了这个静态类而没有意义......
And*_*dyG 10
您似乎已将所有成员变量放在课堂外!
int processId;
int arrivalTime;
int CPUTime;
int IOFrequency;
int IODuration;
int Ticks;
int CPUConsumption;
int CPUBurstSize;
int queueNumber;
int IOBurstCount;
string state;
Run Code Online (Sandbox Code Playgroud)
应该在这里:
class Process
{
public:
Process(int _processId, int _arrivalTime, int _CPUTime,
int _IOFrequency, int _IODuration);
~Process();
bool HasArrived(int time);
bool HasCompleted();
bool HasFinishedBurst();
bool HasFinishedIO();
int GetQueueNum();
int GetID();
void SetQueueNum(int i);
void SetToReady();
void Run();
void PerformIO();
private:
int processId;
int arrivalTime;
int CPUTime;
int IOFrequency;
int IODuration;
int Ticks;
int CPUConsumption;
int CPUBurstSize;
int queueNumber;
int IOBurstCount;
string state;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |