Klasy zagnieżdzone a przyjaźnie

0

Hej

Czy ktoś może mi wytlumaczyć w czym jest problem ?

Hen.h

#include <iostream>
#include <string>

class Nest;

class Hen
{
public:
	void display(Nest *ptr);
	void set(Nest *ptr, int i, int j);
	class Nest
	{
		int nest_i, nest_j;
	public:
		friend class Hen;
		void display();
		class Egg
		{
			int egg_i, egg_j;
		public:
			void display();
		};
	};
};

Hen.cpp

#include "Hen.h"

using namespace std;

void Hen::display(Nest *ptr)
{
//	cout << "Hen display called ! " << endl;
//	cout << "i " << ptr->nest_i << " j " << ptr->nest_j << endl;
}

void Hen::set(Nest *ptr, int i, int j)
{
//	ptr->nest_i = i;
//	ptr->nest_j = j;
}

void Hen::Nest::display()
{
	cout << "Nest display called ! " << endl;
}

void Hen::Nest::Egg::display()
{
	cout << "Egg display called ! " << endl;
}

main.cpp

#include "klasa.h"
#include "Hen.h"
#include "conio.h"

using namespace std;

int main()
{
	Hen hen;
	Hen::Nest nest;
	Hen::Nest::Egg egg;


	//hen.display(&nest);
	nest.display();
	egg.display();

	_getch();
	return 0;
}

przy probie kompilacji dostaje takie oto dwa bledy :

1>f:\programy\microsoft visual c++ 2008\projects\cwiczenie 1\cwiczenie 1\hen.cpp(6) : error C2511: 'void Hen::display(Hen::Nest *)' : overloaded member function not found in 'Hen'
1>        f:\programy\microsoft visual c++ 2008\projects\cwiczenie 1\cwiczenie 1\hen.h(7) : see declaration of 'Hen'
1>f:\programy\microsoft visual c++ 2008\projects\cwiczenie 1\cwiczenie 1\hen.cpp(12) : error C2511: 'void Hen::set(Hen::Nest *,int,int)' : overloaded member function not found in 'Hen'
1>        f:\programy\microsoft visual c++ 2008\projects\cwiczenie 1\cwiczenie 1\hen.h(7) : see declaration of 'Hen'

ponadto gdy odkomentuje linijke hen.display(&nest); w main.cpp dostaje taki o to bład :

1>f:\programy\microsoft visual c++ 2008\projects\cwiczenie 1\cwiczenie 1\main.cpp(14) : error C2664: 'Hen::display' : cannot convert parameter 1 from 'Hen::Nest *' to 'Nest *'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Czy mozecie mi powiedziec co robie nie tak ?

0

Spróbuj tak:


class Hen
{
public:

		
        class Nest
        {
                int nest_i, nest_j;
				
        public:
                friend class Hen;
                void display();
                class Egg
                {
                        int egg_i, egg_j;
                public:
                        void display();
                };

		
        };
		
		void display(Nest *ptr);
        void set(Nest *ptr, int i, int j);
};

0

Problem jest raczej tu:
main.cpp

#include "Hen.h"

using namespace std;

void Hen::display(Hen::Nest *ptr)
...

void Hen::set(Hen::Nest *ptr, int i, int j)
...
0

Hej,

Pomysl podany przez galleanv pomogl. Mogłbys powiedzieć dlaczego przenoszac metody nizej (za definicja klas Nest i Egg) problem znika ?

0

A nie po prostu dlatego, ze te metody uzywaja zawartosci tych klas i zawartosci te musza byc znane?

taki kod tez nie przejdzie:

f(){
x=5;
int x;
}

wiec i taki nie:

struct X; // mowisz tylko ze "bedzie takie struct o nazwie X", ale zawartosc jest nie znana
f(X* ptr) {}  // to jest OK. nie uzywa zawartosci X, tylko wiedzy ze "jest takie X"
f(X* ptr) {ptr->Bum();} // uzywa zawartosci X - nie ok
f(X::Bum ptr) {} // uzywa zawartosci X -  nie ok
struct X{int bum;} // - nie ok, gdyz definicja zawartosci jest tutaj dopiero
g(X* ptr) {ptr->Bum();} // juz oK!
g(X::Bum ptr) {} // juz ok!

z tego powodu quetzalcoatlzaleca(r,tm,c) :) używanie szablonowej postaci plikow .h/.hpp: http://4programmers.net/Forum/viewtopic.php?id=162017

0

Dzięki wielkie za wyjaśnienie. Faktycznie racja, mój błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1