2009-11-18 3 views
0

아래 코드에서이 오류가 발생하는 이유는 무엇입니까?이이 범위에서 선언되지 않았습니다. C++

class ST : public Instruction{ 
public: 
ST (string _name, int _value):Instruction(_name,_value){} 

    void execute(int[]& anArr, int aVal){ 
     //not implemented yet 
     cout << "im an st" <<endl; 
     anArr[value] = aVal; 
    } 
    virtual Instruction* Clone(){ 
     return new ST(*this); 
    } 
}; 



classes.h:81: error: ‘anArr’ was not declared in this scope 
classes.h:81: error: ‘aVal’ was not declared in this scope 
+0

코드를 약간 수정하면 (즉,'Instruction'을 없애는 것), 같은 줄에 다른 오류가 생기고 그 문법이 생깁니다. 어떤 컴파일러를 사용하고 있습니까? – dirkgently

+0

g ++로 컴파일하는 메신저 – user69514

+2

@unknown : 그냥 classes.h에 위에 붙여 넣은 코드입니까? 그리고이 라인들 중 어느 라인이 81입니까? "void execute"가있는 줄입니까 – Aishwar

답변

4

execute 함수의 첫 번째 매개 변수 유형에 문제가 있습니다. this을 읽으면 배열을 전달하는 방법에 대해 자세히 알 수 있습니다. execute() 만약

+0

감사합니다. – user69514

1

이것을 시도 :

공극은 실행 (INT anArr [], INT 군함) 참고 기준 배열을 사용 캔트 때문에

.

+0

void execute (int [] anArr, int aVal) 여전히 나에게 같은 오류가 발생합니다 – user69514

4

종류가 anArr이므로 유효하지 않습니다.

또한 복제 방법에 covariant return type을 사용하는 데 관심이있을 수 있습니다. 나는. 명령 대신 ST에 대한 포인터를 반환 할 수 있습니다.

1

이 정수의 배열을 복용하도록되어, 당신은 아마 다음과 같이 선언한다 :

void execute(int* anArr, int anArrLength, int aVal) 
{ 
    // ... 
} 

주를 당신의 방법을 몇 가지 차이가 ​​있음 :

  • anArr이 통과가 에서 배열포인터로. 클라이언트 코드는 단순히 배열 변수 이름을 전달할 수 있습니다. 이는 정의에 따라 "배열의 시작 위치에 대한 포인터"와 같습니다.
  • anArrLength은 배열의 길이가임을 나타 내기 위해 전달됩니다. 이 방법은 execute() 메서드가 배열의 범위를 벗어난 메모리 (또는 배열에 할당 된 메모리)에 액세스하지 못하도록하기 위해 필요합니다. 그렇게하면 메모리 손상이 발생할 수 있습니다.

성공 또는 실패를 나타내는 반환 값을 추가하여 위의 메소드 서명을 개선 할 수 있습니다. 이렇게하면 클라이언트 코드가 문제가 있는지 여부를 감지 할 수 있습니다. 예를 들면 다음과 같습니다.

// Returns true on success, false on failure 
bool execute(int* anArr, int anArrLength, int aVal) 
{ 
    // Get "value" through whatever means necessary 
    // ... 

    if (value >= anArrLength) 
    { 
     // Out of bounds of array! 
     return false; 
    } 

    anArr[value] = aVal; 

    // Do whatever else you need to do 
    // ... 

    return true; 
} 
관련 문제