먼저 문제를 설명하고 코드의 상당 부분을 제공합니다. I 및 process라는 사용자 지정 클래스로 큐를 채 웁니다. 이 줄 사용 :새 명령으로 새 개체를 만들 수 없음 C++
ProcessQueue.push(new Process(inputs[0], inputs[1], inputs[2], inputs[3], inputs[4]));
루프가 완료되면이 모든 것이 잘된 것처럼 보입니다. 프로세스 큐는 포인터로 채워집니다. 그러나 추가 검사를 통해 모두가 동일한 객체를 가리킨다는 것을 알았습니까?
이 호기심을 발견하고 루프의 각 반복마다 생성자를 밟았습니다.
첫번째 반복 : 생성자가 입력 될 때 모든 인스턴스 변수는 (예상) 널
번째 반복 : 생성자 들어가면 모든 인스턴스 변수 첫번째 반복에서 개체에 주어진 값을 포함 (ie : 동일한 객체)
나중에 큐를 사용할 때 큐의 모든 포인터가 동일한 프로세스 개체를 참조하고 있음을 확인했습니다. (프로세스가 상태를 포함하고 있기 때문에 이것을 알 수 있습니다. 큐를 통해 상태를 변경하면 루프가 두 번째 포인터에 대해 이미 변경된 상태가됩니다.)
나는 저의 생성과 관련하여 무언가를 잘못 수행했음을 의심합니다. . 그래서 여기에 전체가 있습니다.
당신이 배치 한 내가 어떻게 든 너무 의미없이 정적 클래스로이 만든 의심
#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;
}
... 것 같다
이 문서가 익숙한 것으로 느껴지면 .... 나는 실수로 내 오래된 질문을 삭제했다. 그래서 나는 배운 것을 다시 말해 보았습니다. – user3372128
ProcessQueue는 어디에 정의되어 있습니까? 그 코드를 보여주세요. – AndyG
_ '모든 객체가 같은 객체를 가리킨다는 것을 알았습니까?'_ 정확히 이것을 어떻게 확인 했습니까? 주소 또는 내용을 확인 하시겠습니까? –