2016-10-05 5 views
1

私は現在、C++プログラミングのためのオブジェクト指向プロジェクトに取り組んでいます。私はメインC++変数が意図したとおりに変更されない

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

わからないでこれらの関数を呼び出すときに、これらが許可されている場合

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; 
} 

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; 
} 

、ここで私の4オブジェクトのコンストラクタは次のとおりです。 私はいくつかのオブジェクトを作成しましたCで+ +私は、Javaでそれらを行った

私はまたそれらを分離しようとしました私は希望の結果を得るでしょう。

私の質問はこのフォーマットがC++で許されているかどうか、もしそうなら私は間違っています。

私の結果は

vancouver 
vancouver 

を表示しますが、私の希望する結果が

vancouver 
washington 

これらが助け

+1

C++に関する本を入手してください。あなたの問題は、C++でJavaから学んだことを使っていることです。これらの2つの言語には根本的に異なるオブジェクトモデルがあるため、コードは失敗します。ニキータはそれのいくつかを説明しましたが(復帰値をコピーする)、それ以上のことがあるので、良い本を読むことを提案します。 –

+0

@UlrichEckhardtと同意します。あなたはポインターとリファレンスについて読んで、それらが何であるか、そしてそれらを使用する方法を理解する必要があります。これは、他の言語が動作するものに非常に近いためです。 – UKMonkey

答えて

3

ため

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; 


    } 
} 

おかげで私の取得/設定機能あるだろうはAddressオブジェクトのコピーを返します。Addressフィールドではなくコピーを変更しますので、Publisherフィールドに入力してください。問題getAddress()を解決するには

は、参照を返す必要があります。

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

returning references (pointers) to internals is bad practiceので、おそらくあなたは、あなたのオブジェクト階層を再設計する必要があります。

+0

ああ、どうすればこの問題を回避できますか –

+1

参照を返す – Philipp

+0

これはgetPublisher()とgetCity()にも当てはまりますか? 編集:ああ、これは大変ありがとうございます –

1

あなたは方法

Book::setAddress(Address ads) 

かのどちらか、それが価値だ修正するために、ポインタ/参照を使用し作成する必要があります。
それ以外の場合はコピーを入手してください

0

Javaのすべてが参考になります。 C++ではそうではありません。

オブジェクトのコピーが非常に多く、ポインタを使用しないと簡単にはできないことがあります。

関連する問題