[c++]Varför ska konstruktorn ta emot en array?

Permalänk
Medlem

[c++]Varför ska konstruktorn ta emot en array?

Tjena!
Sitter här och klurar på en uppgift och förstår inte tanken bakom det hela...
Det är nämligen så att jag ska skapa en 2d-array och sedan läsa in t.ex 3 städer från fil och de städerna ska användas i min matris, det hela ska användas för att beräkna kortaste avståndet mellan städerna med hjälp av dijkstras algoritm.

Men det jag stör mig på är att konstruktorn ska ta emot en array och en int, första som slog mig var att när inläsningen sker så ska det skapas en array som städerna sparas i och sen så ska den array skickas tillsammans med antalet städer till konstruktorn, och då ska det skapas en array/matris med storleken n x n och den första raden och kolumnen ska bestå av de städerna i den tidigare skickade arrayen.

Låter detta vettigt?
Det är det enda jag kan komma på varför konstruktorn kan ta emot en array.

Permalänk
Medlem

Vi snackar om konstruktorn till din matris-klass eller? I så fall låter det vettigt att skicka med en array av noder (städer) och antal städer i konstruktorn till den så att den kan skapas utifrån datan som du skickar med in. Detta troligtvis för att en matris alltid ska ha ett innehåll och inte ska kunna finnas / skapas tom.

Permalänk
Medlem

ja exakt konstruktor till matris-klassen, men jag förstår inte riktigt hur detta ska funka.
Om jag nu skapar en array i min funktion readFromFile() med lets say 5 platser men det finns 10 städer i filen då kommer inte alla städer att läsas in så klart, så då tänkte jag att jag på nåt sätt ska kunna ta numret som ligger överst i txtfilen och sedan skapa arrayen efter det nummret, vilket betyder att det alltid kommer skapas en array så att alla städer får plats, men det går ju inte eftersom det inte är en konstant.
Om jag bortser från det och bara har 3 städer i filen och 10 platser i arreyen så förstår jag inte riktigt hur jag ska skicka arrayen till konstruktorn, eftersom jag kan inte bara skriva Konstruktor(array,n);...

Permalänk
Medlem

Det går jättebra att göra en array av olika storlek "during runtime", dock med hjälp av dynamiska arrayer och pekare. Men jag antar att du inte lärt dig detta än.
För att skapa ett matris-objekt och använda konstruktorn skriver du bara (antar att din matris-klass heter Matris):
Matris m1(array, n);

Permalänk
Medlem

Du har rätt, det e inte det jag har redan en dynamiskt allokerad array med dubbelpekare, men jag menar att jag vill skapa en array vid inläsning från fil, men det är inte så viktigt.
Det viktiga är att jag inte vet när min konstruktor tar emot arrayen hur jag ska kunna få min 2d array att få den andra arrayens värden som en rad och en kolumn. Problemet tror jag ligger i att den ena är en array av dubbelpekare och den andra en "vanlig" array.

Permalänk
Medlem

Jaha, då förstår jag nog :P. Och du får inte ändra din Matris klass till att ta emot en dubbelpekare istället?
Om inte hade jag nog löst det genom följande:
String** cities; // Din dubbelpekare till array av dina städer
int nrOfCities;
String* temp = new String[nrOfcities]; // Då får du en enkelpekare till en array.
for(int i = 0; i < nrOfCities; i++)
{
temp[i] = *cities[i]; // Derefererar pekaren på cities. Krävs att klassen (string i detta fallet, så det är lungt) har copy-konstruktor.
}

Matris m1(*temp, nrOfCities); // Derefererar pekaren här igen för att säga att det är objektet vi vill skicka och inte pekaren.
delete temp;

Har inte testat det själv, men detta borde konvertera din dubbelpekare-array till en enkelpekare som blir inskickad till matris-klassen som en vanlig array.

Permalänk
Medlem

Jag utgår ifrån att det inte ska ändras.
Du skriver Matris m1(*temp,nrOfCities); så du vill skapa ett nytt objekt? jag e ganska förvirrad nu, först trodde jag att allt detta ska va i konstruktorn, men den raden gjorde mig tveksam
De två första raderna har jag redan, men rad tre förstår jag inte riktigt, varför skapar du en temp för att låta den tilldelas (pekarna?) från cities?
Vart kommer min array med städer in i bilden?

Permalänk
Medlem

Problemet var väll att din matris tar emot en vanlig array, men att du har en dubbel-pekare av dina städer? Nu kanske jag missförstod dig
Den koden jag skrev konverterar din dubbel-pekare array till en vanlig array så att du kan skicka in den till matrisen. Eller är det att skapa en matris av arrayen i konstruktorn som du behöver hjälp med?

Skrivet av Z3R0:

varför skapar du en temp för att låta den tilldelas (pekarna?) från cities?

cities[i] är ju en pekare till ett string objekt. Genom att skriva *cities[i] dereferar du pekaren och menar att du vill accessa objektet, och inte pekaren. Så temp-arrayen tilldelas objekten (som en vanlig array) och inte pekarna. Därför kan du senare dereferera temp med *temp också, för att skicka det objektet den pekar på (en vanlig array) in till konstruktorn.

Permalänk
Medlem

Förstår att det lätt kan bli missförstånd när jag inte har postat någon konkret kod
Min konstruktor tar emot en statisk array och antalet element sedan så skapar den en 2d array(inte helt hundra dock) med storleken n X n.
Till slut så ska den statiska arrayens innehåll kopieras till 2d arrayen så att första raden och kolumnen blir fulla men plats [0][0] ska fortfarande vara tom.
nåt i stil med.

blev väldigt litet, men man ser poängen.

Permalänk
Medlem

Arrayen du skickar in till konstrukorn innehåller bara namn på städer va? Varje koppling mellan städer och avståndet på den kopplingen läggs till senare via funktionsanrop eller?
I så fall hade jag löst det genom att haft en array i matris-klassen som innehåller alla nodes, dvs en vanlig string array med namnen på alla städer (kopia av den du skickar in i konstruktorn). Sen hade jag även gett matris-klassen en 2d-array av typen int som lagrar alla kopplingar och då värden på kopplingarna.
Exempel:
nodes: string nodes = new String[nrOfNodes]
matris: int matrix = new int[nrOfNodes][nrOfNodes]

Så när du vill lägga till en koppling (avståndet) mellan 2 noder så skickar du in 2 strings samt en int för avståndet mellan dom 2. Matrisen skannar igen sin nodes array (städerna) och hittar på vilka positioner som dessa städer finns i arrayen. Sen använder den dom två positionerna för att lägga in avståndet i matrisen. matrix[pos1][pos2] = value och matrix[pos2][pos1] = value.
När du vill få reda på avstånden mellan 2 städer skickar du in 2 strings. Matrisen hittar positionerna för dessa i sin nodes array och hämtar sen avståndet via value = matrix[pos1][pos2];
Du vill dock fylla hela 2d arrayen med -1 tex. när du skapar den för att visa att det inte finns en koppling mellan dom två noderna.

Permalänk
Medlem

du har helt rätt, det är exakt så det ska se ut.
Ska se om jag förstått det hela korrekt. Du menar att det ska finnas under private: en string nodes[20] och en int **matrix?
Men varför ska konstruktorn ta emot en string array med städer när matrix är av typen int?
Allt det andra låter perfekt.

Permalänk
Medlem

String* nodes[nrOfNodes] är för att hålla koll på dom själva noderna. Denna behöver inte vara string utan kan vara av annan typ om det inte är strängar man vill ha i kolum och rad huvuden.
int** matrix är en int eftersom det är heltal du vill spara i matrisen (avståndet mellan städerna). Vill du ha med decimaler kan du göra en double** matrix istället. Och vill du spara några helt andra värden releterade till dina noder (städer) så gör du din matrix av den typen.
Så string* nodes är bara till för att innehålla etiketterna för raderna och kolumnerna. Int** matrix innehåller själva datan av matrisen. Och eftersom dom är lika stora (bredd/höjd på matrisen och bredden på nodes) så "mappas" innehållet i string* nodes perfekt mot innehållet i arrayen. Så positionen ett objekt har i string nodes arrayen är samma position det objektet har i din matris, både i bredd och längd.

Permalänk
Medlem

I C hade en dubbelpekare varit en fullt rimlig lösning.
I det här fallet och C++ föreslår jag en referens till dubbelarrayen istället.

String& cities; // Din referens till array av dina städer
etc.

Permalänk
Medlem

tror att jag löst nästintill allt när det gäller o skapa, läsa in och kolla om det finns en väg mellan städerna.
tack som fan för hjälpen!