代码之家  ›  专栏  ›  技术社区  ›  user4087080

为什么我不能使用间接寻址操作符取消引用指向作为数组元素的对象的指针?

  •  14
  • user4087080  · 技术社区  · 9 年前

    #include <iostream>
    
    class A {
        public:
            virtual void test() {
                std::cout << "A\n";
            }
    };
    
    class B : public A {
        public:
            void test() {
                std::cout << "B\n";
            }
    };
    
    
    int main() {
        A* v[2];
    
        v[0] = new A();
        v[1] = new B();
    
        v[0]->test();
        *(v[1]).test(); // Error! If the arrow operator is used instead
                        // though, the code compiles without a problem.
    
        return 0;
    }
    

    下面是我得到的错误:

    $ g++ -std=c++11 test.cpp && ./a.out 
    test.cpp: In function ‘int main()’:
    test.cpp:26:13: error: request for member ‘test’ in ‘v[1]’, which is of
    pointer type ‘A*’ (maybe you meant to use ‘->’ ?)
        *(v[1]).test();
    
    2 回复  |  直到 8 年前
        1
  •  32
  •   songyuanyao    9 年前

    根据 Operator Precedence , operator. operator* (间接/取消引用运算符),因此 *(v[1]).test(); 等于 *((v[1]).test()); ,无效。(你不能打电话 test() 在…上 v[1] 哪个是 A* 通过 opeartor. .)

    将其更改为

    (*v[1]).test();
    
        2
  •  17
  •   Sergey    9 年前

    正确的方法是:

    (*v[1]).test();
    

    v[1] *v[1] )最后通过对象值调用方法。

    在您的示例中,您第一次尝试拨打 test 使用 . 在…上 v[1]版 ,这是一个指针。只有在这之后,您才取消引用该方法的返回值,这也是毫无意义的 测验 返回void。