Loading [MathJax]/jax/output/HTML-CSS/config.js
Ask Your Question
1

Deklarace/Definice trid C++

asked Mar 22 '15

Ondra Exner gravatar image

updated Mar 22 '15

PeterBocan gravatar image

Zdravim. Mam 2 tridy A a B. Trida A ma v sobe slozku { B m_data1 } a trida B ma v sobe slozku { A m_data2 } . Dale jsou v obou tridach metody, ktere vyuzivaji metod tridy druhe.

( pr. A ma metodu: string getName() ... B ma metodu: getTheOtherName() { return m_data2 . getName() } )

Problem nastava uz pri kompilaci. Trida A potrebuje mit pred sebou definovanou tridu B a naopak. Napsal jsem tedy pred definici tridy A "class B;" , takze trida A uz znala tridu B .... timto zmizelo par erroru, ale nastaly nove:

main.cpp:27:55: error: invalid use of incomplete type class CCar
main.cpp:15:7: error: forward declaration of class CCar
class CCar;

Nevite nekdo, co si stim pocit? Diky.

add a comment

2 Answers

Sort by » oldest newest most voted
1

answered Mar 22 '15

Josef Kokeš gravatar image

Na tohle narazíte snad ve všech jazycích a snad ve všech se to řeší stejně: V deklaraci A řeknete, že chcete používat třídu B, ale neříkáte nic o tom, jak ta třída B vypadá. Podle jazyka se liší to, jak konkrétně to řeknete. Konkrétně pro C++ viz např. zde: http://stackoverflow.com/questions/4964482/how-to-create-two-classes-in-c-which-use-each-other-as-data (první odpověď na Google c++ classes use each other).

link

Comments

Diky. A kdyz to vztahnu na muj problem, kde mam v tride A slozku { vector<ccar*> m_Cars; } takze pouzivam pointery na tridu CCar a pak mam jen v definici jedne metody neco typu "return m_Cars[i] -> getName() " ... proc je to porad spatne?

Ondra Exner (Mar 22 '15)

Protože když chcete použít metodu X, tak už kompilátor potřebuje vědět, že nějaká metoda X existuje. V té době už musí být příslušná třída kompletně definována. Ale při deklaraci to potřeba není. Dívejte se na odpověď, ne na otázku. Všimněte si, co se includuje v jednotlivých hlavičkových souborech. (Správná odpověď: nic.)

Josef Kokeš (Mar 22 '15)

Chvilku jsem si o tom pocetl a uz mi to docvaklo. Dekuji za nakopnuti :)

Ondra Exner (Mar 22 '15)
add a comment
0

answered Mar 22 '15

PeterBocan gravatar image

updated Mar 22 '15

Keď chcem byť grumpy a nedať otvorené API do sveta tak používam PIMPL (Private Implementation): http://akhodakivskiy.github.io/2012/12/11/private-implementation-forward-declaration.html

Jednou z výhod je to, že to zrýchľuje kompiláciu. napr. :)

link
add a comment

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: Mar 22 '15

Seen: 461 times

Last updated: Mar 22 '15

Related questions