Ask Your Question
1

Deklarace/Definice trid C++

asked 2015-03-22 19:15:23 +0100

Ondra Exner gravatar image

updated 2015-03-22 21:03:22 +0100

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.

edit retag flag offensive close delete

2 Answers

Sort by » oldest newest most voted
1

answered 2015-03-22 19:36:04 +0100

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).

edit flag offensive delete publish link more

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 ( 2015-03-22 19:48:16 +0100 )edit

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š ( 2015-03-22 20:11:27 +0100 )edit

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

Ondra Exner ( 2015-03-22 23:01:18 +0100 )edit
0

answered 2015-03-22 21:29:37 +0100

PeterBocan gravatar image

updated 2015-03-22 21:30:57 +0100

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. :)

edit flag offensive delete publish link more

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: 2015-03-22 19:15:23 +0100

Seen: 461 times

Last updated: Mar 22 '15

Related questions