2016-10-05 1 views
1

Ich arbeite derzeit an einem objektorientierten Projekt für C++ - Programmierung. Ich habe ein paar Objekte erstellt:C++ - Variablen ändern sich nicht wie beabsichtigt

int main() 
{ 
    Address address1 = Address("7732","cambie street","vancouver","BC","v5p3r3"); 
    Author author1 = Author("Joe","Howe","[email protected]"); 
    Publisher publisher1("candy",address1); 
    Book book1 = Book("sprite",author1,publisher1,"1995"); 
return 0; 
} 

und hier sind meine 4 Objektkonstruktoren

Address::Address(string number, string name, string c, string crty, string pCode){ 
    streetNumber = number; 
    streetName = name; 
    city = c; 
    country = crty; 
    postalCode = pCode; 
} 
Book::Book(string newTitle, Author author1,Publisher pub, string y){ 
    ISBN++; 
    bookISBN = ISBN; 
    title = newTitle; 
    a = author1; 
    authorCount = 1; 
    d = pub; 
    year = y; 
} 
Author::Author(string fN, string lN, string e){ 

    firstName = fN; 
    lastName = lN; 
    email = e; 
} 
Publisher::Publisher(string n, Address x){ 
    name = n; 
    a = x; 
} 

, wenn ich diese Funktionen in der Haupt

nennen
cout << book1.getPublisher().getAddress().getCity() << endl; 
book1.getPublisher().getAddress().set("washington",Address::CITY); 
cout << book1.getPublisher().getAddress().getCity() << endl; 

nicht sicher, ob diese zulässig sind in C++ habe ich sie in Java,

Ich habe auch versucht, sie zu trennen d es würde mir die gewünschten Ergebnisse geben,

so meine Frage wird, ist dieses Format in C++ erlaubt und wenn ja, was mache ich falsch.

mein Ergebnis zeigt

vancouver 
vancouver 

aber würde mein gewünschtes Ergebnis

vancouver 
washington 

das sind meine get/set-Funktionen seines

Address Publisher::getAddress(){ 
    return a; 
} 


Publisher Book::getPublisher(){ 
    return d; 
} 
void Address::set(string value , int number){ 
switch(number) 
{ 
    case STREET_NUMBER: 
     streetNumber = value;break; 
    case STREET_NAME: 
     streetName = value;break; 
    case CITY: 
     city = value;break; 
    case COUNTRY: 
     country = value;break; 
    case POSTAL_CODE: 
     postalCode = value;break; 


    } 
} 

Danke für die Hilfe

+1

Bitte besorgen Sie sich ein Buch über C++. Ihr Problem ist, dass Sie Dinge aus Java in C++ gelernt haben. Da diese beiden Sprachen ein grundlegend anderes Objektmodell haben, schlägt Ihr Code fehl. Nikita erklärte einiges (Kopieren von Rückgabewerten), aber es gibt mehr dazu, daher der Vorschlag, ein gutes Buch zu lesen. –

+0

Stimmen Sie mit @UlrichEckhardt überein; Sie sollten über Zeiger und Referenzen lesen und verstehen, was sie sind und wie Sie sie verwenden ... da dies viel näher an dem ist, mit dem andere Sprachen arbeiten. – UKMonkey

Antwort

3

getAddress() gibt eine Kopie von Address Objekt zurück, so dass Sie die Kopie ändern, nicht Address Feld in Publisher.

das Problem zu beheben getAddress() sollte Bezug zurück:

Address& Publisher::getAddress() 
{ 
    return a; 
} 

Wahrscheinlich müssen Sie Ihre Objekthierarchie neu zu gestalten, weil returning references (pointers) to internals is bad practice.

+0

ah ok so wie würde ich dieses Problem umgehen –

+1

einen Verweis zurückgeben – Philipp

+0

in Ordnung wäre dies auch mit getPublisher() und getCity() bearbeiten gilt: oh ya es funktioniert es Ihnen danken –

1

Hier finden Sie die Methode

Book::setAddress(Address ads) 

oder verwenden Sie entweder Zeiger/Verweis erstellen müssen, um es Wert zu ändern.
Andernfalls erhalten Sie nur eine Kopie davon

0

In der Java ist alles Referenz. In C++ ist es nicht.

Es gibt so viele Kopien Ihrer Objekte, dass Sie nicht einfach tun können, was Sie wollen, ohne Zeiger zu verwenden.

Verwandte Themen