【问题标题】:this pointer pointing to a class property which itself is a pointerthis 指向一个类属性的指针,该属性本身就是一个指针
【发布时间】:2016-06-05 13:45:37
【问题描述】:

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

谁能解释一下编译器抛出这个错误的原因?我相信这背后一定有一个解释。 请注意,错误被称为 cmets;当从代码中删除所有 'this->' 时(如预期的那样),总共会抛出 4 个错误,并且程序按要求编译和运行。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您的* 放错地方了。在this-&gt;X 中,X 必须命名类的成员,而不是一些任意的表达式。你的代码没有意义!

    改为写*(this-&gt;data1)。这会给你指针this-&gt;data1,然后取消引用它。

    【讨论】:

    • 那里不需要括号;你可以写成*this-&gt;data1
    • 但是这里 data1 是 sampclass 的属性,为了访问属性,使用了 this->,不是吗?为什么相同的约定不适用于指针?请解释一下。
    • @melpomene:如果你想保住你的工作,那就不要了 :)
    • @hecate:同样的约定确实适用,这就是你这样写的原因。指针变量称为data1,因此要访问它,请根据您刚刚给出的公式编写this-&gt;data1。之后您对生成的表达式所做的事情(例如,将* 应用于取消引用)不会影响它。
    • @hecate:我刚刚意识到您可能认为该成员被称为*data1。它不是。它被称为data1,类型为int*。这就是为什么我希望人们停止右对齐他们的星号! kera.name/articles/2010/05/… 无论如何,你在析构函数中做对了。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2014-08-13
    • 2019-04-06
    • 1970-01-01
    • 2015-05-25
    • 2011-05-09
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多