2010-10-12 5 views
12

mam tego kodu C++:Konwersja 'myItem *' do non-skalarnego typu 'myItem' o

#include <iostream> 
using namespace std; 
struct MyItem 
{ 
    int value; 
    MyItem* nextItem; 
}; 

int main() { 
    MyItem item = new MyItem; 
    return 0; 
} 

I pojawia się błąd:

error: conversion from `MyItem*' to non-scalar type `MyItem' requested 

kompilacji z g ++. Co to znaczy? I co tu się dzieje?

Odpowiedz

19

Spróbuj:

MyItem * item = new MyItem; 

Ale nie zapomnij, aby usunąć go po użyciu:

delete item; 
+0

Próbowałem * przedmiot. myślisz o przestrzeni pomiędzy sprawami?Serwery linuksowe po prostu uległy awarii. Będę musiał poczekać, aż wrócą, zanim będę mógł spróbować, używając spacji między tym * a elementem. – kralco626

+0

@kralco: Nie, to nie ma znaczenia. Czy masz wstępną książkę C++? – GManNickG

+0

Nie. Biorę klasę systemów operacyjnych. Zrobiłem mnóstwo zajęć programistycznych w Javie i użyłem C# i nadal pracuję intensywnie. jednak żaden z tych języków nie używa wskaźników takich jak C/C++. Jest to tylko część większego projektu z implementacją programu, który wykonuje pipelining (nawet jeśli wbudowany jest system Linux). Mam wszystko napisane i dostaję właśnie ten błąd. – kralco626

18

pan mieszać

MyItem item; 

który przydziela wystąpienie MyItem na stosie . Pamięć na przykład automatycznie uwalnia się na końcu zakresu otaczającej

i

MyItem * item = new MyItem; 

który przydziela wystąpienie MyItem w stercie. Odwoływałbyś się do tej instancji za pomocą wskaźnika i byłby wymagany do jawnego zwolnienia pamięci po zakończeniu używania delete item.

3

Tutaj jest edytowany kod ze zmianami wymienionymi BTW po prawej

struct MyItem     // corrected spelling struct 
{ 
    var value;     // added ; 
    struct MyItem * nextItem; // add "struct" and added ; 
};        // added ; 

MyItem * item = new MyItem; // added * before item 

delete item;     // not exactly here, but some where in your code 

, nie trzeba zrobić new. Można to możliwe stworzenie MyItem obiekt na stosie jako

MyItem anotherItem; 
+0

ya, ale wymaganie jest takie, że używamy nowego :(. Gdy tylko serwery Linux, które ulegną awarii około 30 minut temu, powrócę, wypróbuję to. – kralco626

4

Przede wszystkim, ten kod nie będzie kompilować, ponieważ zapomniał średników po każdym państwie deklaracji zmiennej i po MyItem deklaracji i słów kluczowych „struktury” jest źle napisane. Kod powinien wyglądać następująco:

struct MyItem 
{ 
var value; 
MyItem* nextItem; 
}; 

MyItem item = new MyItem; 

Teraz odpowiadając na pytanie, ten kod nie działa, ponieważ nowy operator zwraca wskaźnik do obiektu utworzonego (wartości typu MyItem*) i próbujesz przypisać ten wskaźnik do zmiennej typu MyItem. Kompilator nie pozwala na to (ponieważ wartość i zmienna mają różne typy). Należy przechowywać wskaźnik do zmiennej odniesieniu do odpowiednich, tak:

MyItem* item = new MyItem; 

W tym przypadku należy pamiętać, aby delete item aby uniknąć wycieku pamięci po więcej nie potrzebują.

Alternatywnie można utworzyć obiekt w stosie bez operatora new.

MyItem item; 

W takim przypadku obiekt przestaje istnieć po powrocie funkcji; nie musisz pamiętać, aby go usunąć.

Powiązane problemy