2016-06-05 5 views
-2

Мне было интересно, почему этот код не скомпилирован с ошибкой, указав «Идентификатор члена неожиданно в функции ....», поскольку «этот» указатель указывает на отдельный объявленный объект в самом модуле, который делает его похожим на скрытый параметр в этом случае, поскольку использование «this» является рудиментарным, если класс является автономным (т.е. классы, которые не наследуют какие-либо другие классы), и не должен иметь значения при использовании этого «этого», в явном виде.этот указатель указывает на свойство класса, которое само является указателем

А также, учитывая, что использование «этого» для указания свойств, являющихся указателями, является незаконным (поскольку компилятор выдает ошибку), почему компилятор обнаруживает ошибки только по пользовательским методам (getdata1(), getdata2(), setdata1(), setdata2()) и считает конструкторы и деструкторы свободными от ошибок? (Ну, это говорит о том, что использование «это», чтобы указать на свойства, которые являются указателями не является незаконным, должен быть какой-то причиной этой ошибки.)

class sampclass { 
    private: 
     int *data1,*data2; 
    public: 
     sampclass(); // constructor 
     ~sampclass(); // destructor 
     int getdata1() const { 
      return this->(*data1); // ERROR: Member identifier unexpected in function sampclass::getdata1() const 
     } 
     int getdata2() const { 
      return this->(*data2); // ERROR: Member identifier unexpected in function sampclass::getdata2() const 
     } 
     void setdata1(int data) { 
      this->(*data1)=data; // ERROR: Member identifier unexpected in function sampclass::setdata1(int) 
     } 
     void setdata2(int data) { 
      this->(*data2)=data; // ERROR: Member identifier unexpected in function sampclass::setdata2(int) 
     } 
    }; 

    sampclass::sampclass() { 
    this->data1=new int(0); // assign default value of 0 
    this->data2=new int(0); 
    cout << "\nConstruction Successful\n"; 
} 

sampclass::~sampclass() { 
    delete this->data1; 
    delete this->data2; 
    //data1=NULL; 
    //data2=NULL; 
    cout << "\nDestruction Successful\n"; 
} 

int main() { 
    sampclass *obj=new sampclass; 
    cout << "data1: " << obj->getdata1() << "\ndata2: " << obj->getdata2() << endl; 
    obj->setdata1(10); 
    obj->setdata2(99); 
    cout << "data1: " << obj->getdata1() << "\ndata2: " << obj->getdata2() << endl; 
    delete obj; 
    obj=NULL; 
    cout << "End of program"; 
    return 0; 
}  

Может кто-нибудь, пожалуйста, объясните мне причину этой ошибки брошенной компилятором? Я считаю, что за этим должно быть объяснение. Обратите внимание, что ошибки упоминаются как комментарии; существует всего 4 ошибки, и программа компилируется и функционирует по мере необходимости, когда все «this->» удаляются из кода (как и ожидалось).

Заранее спасибо.

ответ

2

Ваш * находится не в том месте. В this->X, X должен называть член класса, а не быть произвольным выражением. Ваш код не имеет смысла!

Напишите вместо этого *(this->data1). Это даст вам указатель this->data1, а затем разыщите его.

+0

Пары не требуются там; вы можете записать его как '* this-> data1'. – melpomene

+0

Но здесь data1 является свойством sampclass, и для доступа к свойствам используется это -><имя свойства>, не так ли? Почему одно и то же соглашение не применяется к указателям? Plz объясняет. – hecate

+0

@melpomene: Нет, если вы хотите сохранить свою работу :) –

 Смежные вопросы

  • Нет связанных вопросов^_^