。*运算符在C ++中做什么?

时间:2015-05-28 08:13:17

标签: c++ visual-c++ operators

。* b运算符在c ++中做什么?我找到了这个参考: “对象a的成员b指向的对象”,但它在以下示例中不起作用:

class Color {
    public:
    int red,green,blue;

    Color():red(255), green(255), blue(255){}
    Color(int red, int green, int blue) :red(red), green(green), blue(blue){}

    void printColor(){
        cout << "Red:" << red << "  Green:" << green << "  Blue:" << blue << endl;

    }
};

class Chair{

    public:
    Color* color;

    private:
    int legs;
    float height;

    public:
    Chair(int legs, float height):legs(legs), height(height){
        color = new Color(255, 0 , 0);
    }

    void printChair(){
        cout << "Legs: " << getLegs() << " , height: " << getHeight() << endl;
    }

    int getLegs() { return legs; }
    float getHeight(){ return height; }

    Chair& operator+(Chair& close_chair){
        this->legs += close_chair.getLegs();
        this->height += close_chair.getHeight();
        return *this;
    }

};

int main(){
     Chair my_chair(4, 1.32f);
     my_chair.*color.printColor();
     return 0;
}

当我使用my_chair。* color.printColor();在主要,我得到'颜色':未声明的标识符。我在Visual Studio中运行此示例。

谢谢。

2 个答案:

答案 0 :(得分:3)

.*是取消引用指向成员的指针,但您只是想取消引用成员指针。为此,请使用->

my_chair.color->printColor();
(*(my_chair.color)).printColor(); //same thing

在您的示例中使用.*看起来像:

auto colorP = &Chair::color;
(my_chair.*colorP)->printColor();

答案 1 :(得分:3)

如果您要取消引用color成员,请执行以下操作:

my_chair.color->printColor();

(*my_chair.color).printColor();

运算符.*取消引用指向成员的指针。

指向成员的指针 - “成员指针” - 与作为指针的成员不同 它没有指向“进入”类的特定实例,因此您需要一个与“指针”相关的实例。

示例:

struct A
{
    int x;
    int y;
};

int main()
{
    A a{1, 78};

    // Get a pointer to the x member of an A
    int A::* int_member = &A::x;
    // Prints a.x
    std::cout << a.*int_member << std::endl;

    // Point to the y member instead
    int_member = &A::y;
    // Prints a.y
    std::cout << a.*int_member << std::endl;    
}