2014-03-03 2 views
0

먼저 문제를 설명하고 코드의 상당 부분을 제공합니다. 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; 
    } 

... 것 같다

+0

이 문서가 익숙한 것으로 느껴지면 .... 나는 실수로 내 오래된 질문을 삭제했다. 그래서 나는 배운 것을 다시 말해 보았습니다. – user3372128

+3

ProcessQueue는 어디에 정의되어 있습니까? 그 코드를 보여주세요. – AndyG

+2

_ '모든 객체가 같은 객체를 가리킨다는 것을 알았습니까?'_ 정확히 이것을 어떻게 확인 했습니까? 주소 또는 내용을 확인 하시겠습니까? –

답변

10

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(); 
    }; 

Process.cpp 클래스 밖의 모든 멤버 변수!

int processId; 
int arrivalTime; 
int CPUTime; 
int IOFrequency; 
int IODuration; 

int Ticks; 
int CPUConsumption; 
int CPUBurstSize; 
int queueNumber; 
int IOBurstCount; 
string state; 

여기해야합니다

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; 
}; 
+0

이런 ... 어떻게 그걸 그리웠 니? –

+2

@MooingDuck : 보통 우리는 더 좋은 단어가 부족하여 더 많은 '고급'오류를 예상합니다 :-) – AndyG

+2

"우리는 전체 과정 수업을 볼 필요가 없습니다"와 같은 10 번째 의견을 쓰고 싶었을 때 대답이옵니다 함께 :) – Excelcius

3

당신은 전역 변수

int processId; 
int arrivalTime; 
int CPUTime; 
int IOFrequency; 
int IODuration; 

을 정의하고 Process 클래스의 생성자가 호출 될 때마다 그 값을 재정의합니다.

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; 
    //... 

클래스 자체에는 데이터 멤버가 없습니다.

그래서 이러한 전역 변수는 생성자의 마지막 호출에서 할당 된 값을 유지합니다.

관련 문제