这个指针指向一个类属性,它本身就是一个指针

时间:2016-06-05 13:45:38

标签: c++ oop pointers this pointer-to-pointer

我想知道为什么这段代码无法编译时出现错误,声明'成员标识符在函数中意外...',因为'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;
}    

任何人都可以解释一下编译器抛出此错误背后的原因吗?我相信必须有一个解释。 请注意,错误被提及为注释;当所有'this-&gt;'时,总共会抛出4个错误并且程序会根据需要进行编译和运行从代码中删除(如预期的那样)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您的*位置错误。在this->X中,X必须命名该类的成员,而不是某些任意表达式。你的代码毫无意义!

改为写*(this->data1)。那将给你指针this->data1,然后取消引用它。