Przypisanie do wskaźnika

0

Witam. Mam pewien problem ze wskaźnikiem.

 template<class T>
class ListItem
{
	protected:
		ListItem<T>* next;
		

	public:
	        ListItem<T>* GetNext() { return next; }

};
 template<class T>
class List: public ListItem<T>
{
	private:
		ListItem<T>* head;

	public:
		void HeadInsert(T item_val);

};
 template<class T>
void List<T>::HeadInsert()
{

	ListItem<T>* nelement = new ListItem<T>();
	if(tail == NULL)
	{
		nelement->GetNext() = NULL; // Error 2 error C2106: '=' : left operand must be l-value	

	}
	else
	{
		nelement->GetNext() = this->head; // Error 2 error C2106: '=' : left operand must be l-value	
	}

}

Jak powinienem zmodyfikować kod, żeby możliwe było przypisanie, przy którym aktualnie występuje błąd? Mówiąc szczerze, trochę się pogubiłem.

Pozdrawiam

0

kod który wkleiłeś zawiera różnice.
definicja a deklaracja funkcji HeadInsert, brak tail w ifie (nie ma takiej zmiennej), do NULL trzeba cstdio dodać
Jaki kompilator/IDE używasz bo mi pod g++ po poprawkach wyżej wymienionych się kompiluję.

0

Faktycznie, chciałem załączyć tylko istotne fragmenty kodu i przeoczyłem jedną zmienną. Ale to akurat nie ma większego znaczenia.
Visual C++ 2010.

Błąd występuje przy próbie wywołania w main, np.

 List<int> lista;

lista.HeadInsert(1);
0

tak jak pisałem wcześniej. wkleiłeś na pewno nie ten kod co kompilujesz bo na 100% nie skompilowała by Ci się funkcja HeadInsert.
Nie widziałem edita.

EDIT.
Brakuję CI settera. Nie możesz zwrócona wartość przypisać. Getter zwraca Ci wartość setter ustawia ;) powinno być na zasadzie
SetNext(NULL);

0

Podany kod nie kompiluje się wyłącznie z powodu zaznaczonych błędów. Jak je wyeliminować? :)

Edit: Faktycznie. Można też pokombinować z uzyskaniem adresu wskaźnika, ale to już chyba utrudnianie sobie życia. Dziękuję.

0

Jesli chcesz zwrocic argument z funkcji bez kopiowania go, to musisz zrobic to przez wskaznik/referencje.
Co wiecej, jesli chcesz zwrocic wskaznik bez kopiowania go to musisz uzyc podwojnego wskaznika lub referencji do wskaznika.

void func(int* p)
{
    printf("%p\n", p);
}
 
int main()
{
    int* p = new int(3);
    printf("%p\n", p);
    func(p);
    return 0;
}

http://ideone.com/77rAVo

W tym przykladzie printf() wydrukuje 2 te same adresy, adresy na ktore wskazuje p.
Ale jesli zobaczymy adres tego wskaznika w pamieci, to zobaczymy, ze zostal on skopiowany.

void func(int* p)
{
    printf("%p\n", &p);
}
 
int main()
{
    int* p = new int(3);
    printf("%p\n", &p);
    func(p);
    return 0;
}

http://ideone.com/qvFRgn

To samo sie dzieje z Twoim wskaznikiem zwracanym przez funkcje, dlatego tez nie mozesz przypisac do wyniku funkcji wartosci, bo wynik ten jest tymczasowy.

Edit: Zapomnialem rozwiazania dac, otoz sa 2.
To co probojesz zrobic, tylko zwracasz podwojny wskaznik i uzywasz operatora wyluskania.
Ludzkie podejscie - utworzenie settera.

struct A
{
    int** TwojStyl() { return &p; }     // zwrocenie przez funkcje adresu i przypiseniu
                                        // za pomoca operatora wyluskania
    void MojStyl(int* tmp) { p = tmp; } // stworzenie settera i ustanowienie wartosci
                                        // za jego pomoca
    int* p;
};

http://ideone.com/Nvmiw2

0

Racja. Dzięki wielkie ;)

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