-2

「this」ポインターはモジュール自体で宣言された個々のオブジェクトを指しているため、この場合は隠しパラメーターのようになるため、「関数で予期しないメンバー識別子....」というエラーでこのコードがコンパイルに失敗するのはなぜだろうかと思っていました。クラスがスタンドアロン (つまり、他のクラスを継承しないクラス) の場合、'this' の使用は痕跡であり、'this' を明示的に使用しても違いがあってはなりません。

また、「this」を使用してポインターであるプロパティを指すことは違法であることを考慮すると (コンパイラーがエラーをスローするため)、コンパイラーがユーザー定義メソッド (getdata1()、getdata2()、 setdata1(),setdata2()) コンストラクタとデストラクタをエラーなしと見なしますか? (これは、ポインターであるプロパティを指すために「this」を使用することは違法ではないことを示唆しています。このエラーの背後には何らかの理由があるはずです。)

    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->' がコードから削除されると (予想どおり)、プログラムは必要に応じてコンパイルおよび機能します。

前もって感謝します。

4

1 に答える 1