Typ wskaznika this

0

Mam pytanie gdy wywołuje metode zmien na rzecz obiektu klasy w typu Wektor. To jak ten wskaznik do obiektu na którego została wywołana metoda zmien jest przekazywany do niej ? . Na przykład taka deklaracja tej metody nie jest poprawna *int zmien(const Wektor this,int y) **

 
#include <iostream>

using namespace std;
class Wektor
{
    int x;
public:
    Wektor():x(0){}

    friend ostream& operator<<(ostream& out,const Wektor& ob)
    {
        return out << ob.x;
    }
    int zmien(int y)
    {
       return this->x=y;
    }
};
int main()
{
    Wektor w;
    cout << w;
    operator<<(cout,w);
    cout << w.zmien(20);
    return 0;
}

4

Jest przekazywany niejawnie. A sygnatura, którą podałeś jest niepoprawna, ponieważ używasz tam słowa kluczowego this.

0

Mógłbyś mi zapisać jak będzie wyglądać jawne przekazanie wskaźnika do obiektu na rzecz którego została wywołana metoda zmien ?
Może coś mi się rozjaśni wtedy.

0

Mozesz napisac jawnie tak:

    static int zmien(Wektor * const thisObj, int y)
    {
       return thisObj->x=y;
    }

Chociaz nie wiem po co.

https://ideone.com/xbMDlc

1
Knrad napisał(a):

Mógłbyś mi zapisać jak będzie wyglądać jawne przekazanie wskaźnika do obiektu na rzecz którego została wywołana metoda zmien ?
Może coś mi się rozjaśni wtedy.

struct foo {
	int x = 2;
	void greets() const {
		cout << "foo" << x << endl;
	}
};

struct bar{ 
	int y = 3;
};

void greets(const bar &self) {
	cout << "bar" << self.y << endl;
}

int main() {
    foo{}.greets();
    greets(bar{});
    return 0;
}
0

@Vpiotr Nie rozumiem przecież this odnosi się do obiektu klasy, natomiast metoda statyczna odnosi się do klasy.
Chyba że w klasie tak naprawdę mamy wskaźnik który może pokazać na obiekty tej klasy ?
Czyli w klasie Wektor mamy tak naprawdę takie pole dodatkowo?

 Wektor* this;
1
struct Foo
{
	void foo() const {
		BARK;
		DBG(bar);
	}

	int bar = 42;
};

void Foo_foo(Foo const * const this_){
	BARK;
	DBG(this_->bar);
}

int main()
{
	Foo f;
	f.foo();
	Foo_foo(&f);
}

http://melpon.org/wandbox/permlink/KyjY34eeGAQdkp3H

Foo_foo i Foo::foo są (na Twoje potrzeby) równoważne

0
  1. metoda statyczna niekoniecznie odnosi sie do klasy. Raczej "nie odnosi sie implicite do obiektu".

  2. "this" nie jest zdefiniowany w klasie tylko w jej metodach. Jest to alias na ukryty argument ktory do metod klasy przesylany jest jako pierwszy. Dlatego metody klasy i funkcje ktore maja dodany jako pierwszy argument "Wektor *" sa ze soba w pewnych sytuacjach kompatybilne.

1
Knrad napisał(a):

Na przykład taka deklaracja tej metody nie jest poprawna *int zmien(const Wektor this,int y) **

Jak wcześniej już zostało wspomniane wskaźnik this masz przekazywany niejawnie i jest to słowo kluczowe (stąd nie ma sposobu użyć go jako nazwy zmiennej). Oprócz tego zastanów się czemu chciałbyś przekazywać wskaźnik this (const Wektor*) jako wskaźnik do stałej? W końcu funkcja zmien (nie const) modyfikuje dany obiekt. Mógłbyś napisać to następująco (i też zastanów się, czy jest sens):

int zmien(Wektor* const myThis, int y)
{
  return myThis->x=y;
}

// ...

w.zmien(&w, 20);
2

@Knrad this nie jest zmienną, ani ukrytą ani jawną. To wyrażenie, które jest przetłumaczone przez kompilator na wskaźnik do obiektu.

9.3.2/1 [class.this]

In the body of a non-static (9.3) member function, the keyword this is a prvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*. If the member function is declared const, the type of this is const X*, if the member function is declared volatile, the type of this is volatile X*, and if the member function is declared const volatile, the type of this is const volatile X*.

Jak to jest implementowane zależy od kompilatora. Stąd pytanie "jak można jawnie przekazać this" jest bez sensu. Trochę jak pytanie "Jestem taksówkarzem i wożę ludzi, ale w jaki sposób mogę wozić serca pasażerów niezależnie od ich ciał?"

0

Dziękuję za odpowiedzi ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1