2011-07-02 4 views
8

Wstawiam szablon wskaźnika wrapper podobny w funkcji do boost::shared_ptr.Co robi "* ptrInt ++"?

Mam wskaźnik do liczby całkowitej ptrInt.

Co chcę zrobić: Zwiększ liczbę całkowitą punktów ptrInt do.

Mój początkowy kod był następujący: *ptrInt ++;, chociaż ja też próbowałem to samo używając (*ptrInt) ++;

Najwyraźniej jednak to nie wydaje się, aby robić to, co spodziewałem się, że. W końcu mam to działa przy użyciu *ptrInt += 1; jednak pytam siebie:

  • Co dokładnie *ptrInt ++; zrobić?
  • Czy istnieje bardziej eleganckie rozwiązanie do korzystania z *ptrInt += 1;?
+1

Co wydaje się robić? –

+0

Wprowadzam szablonowe opakowanie wskaźnika ** STOP ** nie należy tego robić. Nawet najlepsi programiści C++ się mylą. Użyj dostarczonych narzędzi bez ponownego wynalezienia koła (później będzie na to czas). –

Odpowiedz

9
*p++ // Return value of object that p points to and then increment the pointer 
(*p)++ // As above, but increment the object afterwards, not the pointer 
*p += 1 // Add one to the object p points to 

dwóch ostatnich przyrost zarówno przedmiot, więc nie jestem pewien, dlaczego nie myśleć to działało. Jeśli wyrażenie zostanie użyte jako wartość, ostateczny formularz zwróci wartość po zwiększeniu, ale pozostałe zwracają wartość wcześniej.

x = (*p)++; // original value in x 

(*p)++; 
x = *p;  // new value in X 

lub

x = ++*p; // increment object and store new value in x 
+2

@Caleb: pierwsza linia działa prawie tak, jak opisuje @ DigitRoss. Wskaźnik staje się inkrementowany, a wynikiem operacji jest * stara wartość *, która następnie zostaje usunięta z dereferencji. –

+0

@Martinho, służy mi tak, że nie próbuję go pierwszy. Dziękuję za poprawienie mnie. – Caleb

4

*ptr++ równoważne *(ptr++)

-1

*ptrInt++ w Twoim przypadku ma zwiększyć wskaźnik, nic więcej (przed że pobiera wartość z umieszczeniem w rzuca ją. Od oczywiście jeśli użyjesz go w bardziej złożonym wyrażeniu, użyje go)

(*ptrInt)++ w kapelusz, którego szukasz.

+1

Nie do końca zrozumiałam, dlaczego ludzie biorą udział w głosowaniu –

3

*ptrInt ++ będzie

  1. przyrost ptrInt przez 1

  2. dereference starej wartości ptrInt

i (*ptrInt) ++ jak również *ptrInt += 1 będą robić to, co chcesz.

Zobacz Operator Precedence.

0

Wyrażenie jest obliczane przy użyciu reguł dotyczących pierwszeństwa operatora.

Postfiksowa wersja ++ (ta, w której ++ występuje po zmiennej) ma wyższy priorytet niż operator * (kierunek pośredni).

To dlatego *ptr++ jest odpowiednikiem *(ptr++).

0

Chcesz (*ptrInt)++, który zwiększa obiekt, co zwykle robi to samo, co *ptrInt += 1. Być może masz przeciążony operator +=, ale nie operatorów ++ (przyrostowych i przyrostowych operatorów increment)?

0

Elegancki sposób jest tym, czego wcześniej próbowałeś. tj. (*ptrInt) ++;

Ponieważ nie jesteś z tego zadowolony, może to być spowodowane post-inkrementem.

Powiedz, std::cout<<(*ptrInt) ++; pokazałby ci wartość nie zwiększoną.

Spróbuj podać ++(*ptrInt);, które mogą zachowywać się zgodnie z oczekiwaniami.

1

(* ptr) ++ powinno to zrobić, chyba że używasz jego wartości od razu. Użyj ++ * ptr, co jest równoznaczne z ++ (* ptr) z powodu skojarzeń od prawej do lewej.

Na marginesie, here is my smart pointer implementation, być może może ci pomóc w pisaniu własnych.