2009-11-18 5 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

im компиляция с g ++ – user69514

+2

@unknown: только для обеспечения, это код, вставленный выше в classes.h? и какая из этих строк равна 81? это строка с «void execute» – Aishwar

ответ

4

У вас возникла проблема с типом первого параметра вашей функции execute. Прочитайте this, чтобы узнать больше о том, как передавать массивы.

+0

спасибо, что помогли – user69514

1

Попробуйте это:

недействительными выполнить (интермедиат anArr [], Int аваль)

, поскольку Вы не можете использовать массив ссылок.

+0

void execute (int [] anArr, int aVal) все равно дает мне ту же ошибку – user69514

4

Поскольку тип anArr недействителен.

Также вам может быть интересно использовать covariant return type по вашему методу клонирования. То есть он может вернуть указатель на ST вместо инструкции.

1

Если execute() предполагается принимать массив целых чисел, вероятно, вы должны объявить его как это:

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; 
} 
Смежные вопросы