Wskaźnik do tablicy obiektów

0

Wiem że problem banalny, ale nie mogę sobie z nim poradzić od dłuższego czasu. Jak stworzyć wskaźnik do tablicy obiektów? Powiedzmy że mam klasę

class Node()
{
public:
int x;
Node()
{}
Node(int number)
{
x = number;
}

...
}

W miejsce ... chciałem wstawić wskaźnik do tablicy obiektów potomnych. Próbowałem czegoś podobnego do
Node *children = new Node()[0]; albo Node *children = new Node(); tylko że nie działa. Dodam jeszcze że następująca klasa napisana w Javie działa:

class Node
{
	boolean alive = true;
	ArrayList<Node> children = new ArrayList<Node>();
	int number = 0;
	
	public Node()
	{
		
	}
	
	public Node(int x)
	{
		number = x;
	}
	
	public ArrayList<Node> getChildren()
	{
		return children;
	}
	
	public void addChild(Node c)
	{
		children.add(c);
	}
	
	public int getNumber()
	{
		return number;
	}
	
	public void kill()
	{
		alive = false;
	}
	
		
	public boolean isLiving()
	{
		return alive;
	}
} 

Jak zrobić wskaźnik do tablicy obiektów?

0

Node *children = new Node()[0]; albo Node *children = new Node(); tylko że nie działa

Bo nie możesz w klasie od razu inicjalizować pól. Daj Node *children, a new rób w konstruktorze. w destruktorze daj delete.

0

Coś za bardzo kombinujesz. C++ to nie Java, a ArrayList to nie wskaźnik - nawet nie da się tych mechanizmów ze sobą porównywać, to są zupełnie inne rzeczy.
Możesz zadeklarować w klasie Node wskaźnik do obiektów typu Node tak: Node *whatever; Potem możesz mu przypisać blok pamięci w którym siedzi tablica elementów Node (tylko nie rób tego w konstruktorze bezargumentowym, bo się wszystko posypie).

0

Już rozumiem, dzięki.

0

Jednak nie rozumiem... Mam taką klasę dla drzewka:

class Node
{
    public:
	bool alive;
	Node *children;
    int width;
	int number;

    Node (int x)
	{
		number = x;
		children = new Node();
		width = 0;
		alive = true;
	}
    Node()
    {
        number = 0;
		children = new Node();
		width = 0;
		alive = true;
    }

	~Node ()
	{
	    delete children;
	    number = 0;
	    width = 0;
	    alive = false;
	}

	Node* getChildren()
	{
		return children;
	}

	void addChild(Node c)
	{
	    Node temp[width + 1];
	    for (int i = 0; i < width; i++)
            temp[i] = children[i];
        temp[width + 1] = c;
        children = temp;
	    width++;
	}

	int getNumber()
	{
		return number;
	}

	void kill()
	{
		alive = false;
	}

	void resurrect()
	{
		alive = true;
	}

	bool isLiving()
	{
		return alive;
	}
}; 

I w metodzie main wywołuję między innymi coś takiego:

Node nodes[amo + 1];
for (int i = 0; i <= amo; i++)
	nodes[i] = new Node(i);

Podczas kompilacji wyrzuca mi w miejscu nodes[i] = new Node(i); "error: invalid conversion from 'Node* to 'int'" "error: initializing argument 1 of 'Node::Node(int)'". O co tym razem chodzi? Gdzie tam niby jest konwersja z Node* na int?

Nie ogarniam C++, w Javie mi wszystko pięknie śmiga :|.

0

Nie przyglądałem się gdzie tam kompilator widzi konwersję, ale masz inny błąd:

 Node temp[width + 1];
...
 children = temp;

przypisujesz polu children adres zmiennej lokalnej temp. Tego nie wolno robić. temp przestaje istnieć w momencie wyjścia z metody, w rezultacie wskaźnik wskazuje na śmieci.

0
  • przed nodes w deklaracji pomogła, wielkie dzięki.
0

Może mi się wydaje, ale raczej nie - tworzeniem nowego obiektu typu Node w konstruktorze klasy Node rozwalisz stos - wiecznie będziesz tworzyć nowe obiekty rekurencyjnie.

0

Nie, jak w konstruktorze bezargumentowym nie będę wywoływał konstruktorów.

0

No ale wywołujesz w tej linijce:

children = new Node();
0

Masz rację, zmieniłem to w kodzie chwilę po wklejeniu i zapomniałem dodać.

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