1

Possible Duplicate:
What is the difference between the dot (.) operator and -> in C++?

What is the difference between the two? When do you use one instead of the other?

There was once I tried to use '->' instead of '.' and I got "left operand has 'class' type, use '.'" error, what does it mean?

halfer
  • 19,824
  • 17
  • 99
  • 186
yeeen
  • 4,911
  • 11
  • 52
  • 73

6 Answers6

3

The . allows you to access members of a class. thingy.member, for example.

If you have a pointer to your class, say pThingy, you need to dereference it in order to access the members. Like (*pthingy).member.

A shortcut to the dereference/access combination is ->: pThingy->member.

JXG
  • 7,263
  • 7
  • 32
  • 63
2

All these answers are somewhat correct in a narrow scope. You can use the -> operator even if you don't have a pointer because you can overload it. Take a look at smart pointers:

class A
{
    public:
       void foo();
}

class SmartPtr
{
public:
    SmartPtr (A& obj)
    {
        instance = obj;
    }
    A instance;
    A operator-> ()
    {
        return instance;
    }
};

Then you can do:

A a;
SmartPtr smart(a);
smart->foo();

so you can use -> even though SmartPtr is not a pointer to an object of type SmartPtr.

This answer is in addition to previous ones, as they might be misleading. In a simple case, they are all correct. Note that the dot(.) operator cannot be overloaded.

Luchian Grigore
  • 253,575
  • 64
  • 457
  • 625
1

. to be use if the object is of type T. -> if the object is of type T*.

class foo {};

foo obj;

obj type is foo and it lies on stack. So, to access it's members . operator needs to be used.

foo *hObj = new foo();

hObj is a pointer to the object. So, to access it's members -> operator needs to be used.

Mahesh
  • 34,573
  • 20
  • 89
  • 115
1

You use object.property to get the property of an object. However if you have a pointer to an object (let's call it pointer_to_object) then you will use -> to access its properties: pointer_to_object->property

The reason why you got the error is because the statement pointer_to_object->property will try to dereference first to the actual object and then access its property. If the variable is not a pointer to an object, then you get the error.

Rolando Cruz
  • 2,834
  • 1
  • 16
  • 24
0

x->blah is a nice why of writing (*x).blah. That is it dereferences a pointer, and then accesses the member blah. If x isn't a pointer than you have a compile time error.

Paul
  • 139,544
  • 27
  • 275
  • 264
0

If a is a pointer (or an object proposing "pointer semantics") think to a->b as (*a).b

In more general term, if a is not a pointer they are two operators: -> is overridable (so what it does depends on the class it applies, note class as a type, not pointer to a class: see above for that), the other is the non overridable member selection (meaningless for non composite types), so a->b means "access the b member trough the pointer returned by A::operator->() called on a", and a.b means "access the b member of a".

Emilio Garavaglia
  • 20,229
  • 2
  • 46
  • 63