W moim projekcie C ++ mam dwie klasy Particlei Contact. W Particleklasie mam zmienną składową, std::vector<Contact> contactsktóra zawiera wszystkie kontakty Particleobiektu oraz odpowiednie funkcje składowe getContacts()i addContact(Contact cont). Zatem w „Particle.h” dołączam „Contact.h”.
W Contactklasie chciałbym dodać kod do konstruktora, aby Contactten wywołał Particle::addContact(Contact cont), aby contactsbył aktualizowany zarówno dla Particleobiektów, między którymi Contactobiekt jest dodawany. Dlatego musiałbym dołączyć „Particle.h” do „Contact.cpp”.
Moje pytanie brzmi, czy jest to akceptowalna / dobra praktyka kodowania, a jeśli nie, jaki byłby lepszy sposób na wdrożenie tego, co próbuję osiągnąć (po prostu, automatycznie aktualizując listę kontaktów dla określonej cząstki za każdym razem, gdy nowy kontakt jest tworzone).
Klasy te zostaną połączone razem Networkklasą, która będzie miała cząsteczki N ( std::vector<Particle> particles) i styki Nc ( std::vector<Contact> contacts). Ale chciałem particles[0].getContacts()mieć takie funkcje - czy Particlew tym przypadku można mieć takie funkcje w klasie, czy też istnieje lepsza „struktura” asocjacji w C ++ do tego celu (z dwóch powiązanych klas używanych w innej klasie) .
Może potrzebuję zmiany perspektywy w tym, w jaki sposób do tego podchodzę. Ponieważ obie klasy są połączone przez Networkobiekt klasy, czy typową organizacją kodu / klasy jest posiadanie przez Networkobiekt pełnej kontroli informacji o łączności (w tym sensie, że obiekt cząstek nie powinien być świadomy swoich kontaktów, a zatem nie powinien mieć getContacts()członka funkcjonować). Następnie, aby wiedzieć, jakie kontakty ma konkretna cząstka, musiałbym uzyskać tę informację przez Networkobiekt (np. Za pomocą network.getContacts(Particle particle)).
Czy mniej typowy (być może nawet zniechęcony) projekt klasy C ++ dla obiektu Particle miałby również tę wiedzę (tj. Miałby wiele sposobów dostępu do tych informacji - za pośrednictwem obiektu Network lub obiektu Particle, w zależności od tego, co wydaje się wygodniejsze )?
Networkobiekt klasy, który zawiera Particleobiekty i Contactobiekty. Mając tę podstawową wiedzę, mogę następnie spróbować ocenić, czy pasuje ona do moich konkretnych potrzeb, które wciąż są badane / rozwijane w miarę rozwoju projektu.