Domanda C ++ per principianti sulla progettazione del programma con unique_ptr e vettori [closed]

0

Attualmente sto facendo un programma di console sull'acquisto di una proprietà in una città. Le proprietà possono essere acquistate dalla città da qualcuno, trasferite a un'altra persona o restituite alla città se la persona che ha la proprietà muore.

Ho creato 3 classi: Persona, Città e Proprietà. Le mie classi Person e City hanno entrambi i vettori di unique_ptrs of Property. My main.cpp ha una città unique_ptr e un vettore di Person unique_ptrs e fa l'inizializzazione di base.

class Person {
    string name;
    vector<unique_ptr<Property>> ownedProperties;
    public:
        string getName();
        vector<unique_ptr<Property>> const& getOwnedProperties();
};

class City {
    string name;
    vector<unique_ptr<Property>> ownedProperties;
    public:
        string getName();
        vector<unique_ptr<Property>> const& getOwnedProperties();
};

class Property {
    string name;
    int id;
    public:
        int getID();
        string getName();
}

int main() {
    int numProperties;
    vector<unique_ptr<Person>> people;
    unique_ptr<City> city;
    //  initializing everything
    printAllProperties();
}

Ho deciso di utilizzare unique_ptr perché sto pensando di creare sottoclassi di proprietà in un secondo momento e perché voglio assicurarmi che una proprietà abbia un solo proprietario. Sto usando move () per trasferire la proprietà tra i vettori di proprietà di Città e Persona. Sto anche stampando informazioni come questa:

City: San Johncisco
ID | Property Name | Owner
0  | A             | John
1  | B             | San Johncisco
2  | C             | Johnny
3  | D             | Johnathan
4  | E             | San Johncisco
5  | F             | Johnalina
6  | G             | Johnatha

Il problema è che poiché voglio stampare le proprietà in ordine, finisco per avere qualcosa del genere:

for (int currentID = 0; currentID < numProperties; currentID++) {
    for (auto property: city->getOwnedProperties()) {
        if (property->getID() == currentID) {
            // print info
        }
    }
    for (auto person: people) {
        for (auto property: person->getOwnedProperties()) {
            if (property->getID() == currentID) {
                // print info
            }
        }
    }
}

Questo sembra davvero brutto e mi sento come se avessi potuto progettare meglio il programma / metodo. Qualche consiglio?

    
posta Jonathan Myer 04.02.2018 - 07:22
fonte

1 risposta

2

Dovresti esaminare std::map . È una mappatura tra un valore e l'altro. Nel tuo caso, sembra che tu voglia avere una mappa di ID s a Property s. Puoi crearne uno in questo modo:

std::map<int,Property> propertyIDMap;

Puoi aggiungere delle proprietà ad esso da id in questo modo:

propertyIDMap [ id ] = property;

E puoi ricavarne le proprietà per ID facendo quanto segue:

Property myProperty = propertyIDMap [ id ];

Potresti anche desiderare una mappatura tra gli ID di proprietà e le persone. Sebbene, se Property abbia mantenuto un link al suo proprietario, non è necessario eseguire alcuna ricerca. Il tuo ciclo diventerebbe:

for (int currentID = 0; currentID < numProperties; currentID++) {
    Property nextProperty = propertyIDMap [ currentID ];
    Person owner = nextProperty.owner;
    // print info
}
    
risposta data 04.02.2018 - 08:06
fonte

Leggi altre domande sui tag