error C2064, problem z obiektem klasy w klasie

0

Witam,
otoz wyskakuje mi powyzszy blad, a dokladnie "error C2064: term does not evaluate to a function taking 1 arguments", podczas proby kompilacji ponizszego:

Klasy.h

#ifndef A_H
#define A_H
#include <iostream>

//namespace tracked{


///////////////////////////////Klasa A//////////////////////////////////// 

class A{
private:
	int dana;
public:
	A();
    A(int);
	A(A&);
	~A();
	void zmiana(int);
	A& operator=(const A&);
	friend std::ostream& operator<<(std::ostream& strm, const A& obiektA);
	//friend B (A&,A&);
};

///////////////////////////////Klasa B//////////////////////////////////// 

class B{
private:
	A a1;
	A a2;
public:
	B (A&,A&);
	B (B&);
	//~B();
	//&B operator=(B&);
	//&B operator=(A&);
};


//} // przestrzen
#endif // A_H

Klasy.cpp

#include <iostream>
#include "Klasy.h"

//namespace tracked{

////////////////////////////////////////////////////////////////////
	A::A(int parametr):dana(parametr) {
		std::cout << "A::A(int) "  <<  dana << std::endl;
	}
////////////////////////////////////////////////////////////////////
	A::A(A& obiektKlasy):dana(obiektKlasy.dana){
		std::cout << "A::A(A&) "  <<  dana << std::endl;
	}
////////////////////////////////////////////////////////////////////
	A::~A(){
		std::cout << "A::~A() " <<  dana << std::endl; 
	}
////////////////////////////////////////////////////////////////////
	void A::zmiana(int Parametr){
		std::cout << "void A::zmiana(int) z " << dana << " na " << Parametr  << std::endl;
		dana=Parametr;
	}
////////////////////////////////////////////////////////////////////
	A& A::operator=(const A& rhs){
		std::cout << "A& A::operator=(const A&) z " << dana << " na " << rhs.dana << std::endl; 
		dana=rhs.dana;
		return *this;
	}
////////////////////////////////////////////////////////////////////
	std::ostream& operator<<(std::ostream& strm, const A& obiektA){
		strm << "dana obiektu: " << obiektA.dana << ' ';
		return strm;
	}


//******************************************************************
	B::B(A & gd, A &ft){
		a1(gd); // tu wyskakuje blad!
		a2(ft); // i tu tez!
	}
//}

Chcialbym pobrac dane za pomoca konstruktora B::B(A&,A&). Probowalem to zrobic za posrednictwem konstruktora z klasy A, do ktorej mam pobrac dane.
Czy da sie tak zrobic? Czy da sie skorzystac z listy inicjalizacyjnej?
Nie moge korzystac z dziedzieczenia.

Pozdrawiam,
prosze o szybka pomoc!

0

A co niby mialo by znaczyć u ciebie to
a1(gd)?
Obiekt a1 w chwili w której próbujesz to wywołac JUŻ ISTNIEJE. Więc siłą rzeczy nie możesz użyć konstruktora. Ale możesz to zrobić właśnie z listy inicjalizacyjnej. W ogóle wszystkie takie przypisania wartości powinno się tam robić...

   B::B(A & gd, A &ft) a1(gd),a2(ft) {}
0

Dzieki za pomoc, udalo mi sie rozwiazac problem.
Rozumiem, ze lista inicjalizacyjna, poza stalymi, przydaje sie (jest wymagana) rowniez do inicjalizacji pol?
Dlaczego nie moge sobie zrobic przypisania: "a1=gd;" w konstruktorze?

Pozdrawiam

0

Możesz, nikt ci tego nie broni, ale musiałbyś wtedy przeładować dodatkowo operator=.
Moim zdaniem używanie listy inicjalizacyjnej poprawia czytelność kodu.

0

Tylko, ze jezeli tak robie wyskakuje mi blad:
"error LNK2001: unresolved external symbol "public: __thiscall tracked::A(void)" (??0A@tracked@@QAE@XZ)".
Nie wiem czemu :/

0
webmaster211 napisał(a)

Tylko, ze jezeli tak robie wyskakuje mi blad:
"error LNK2001: unresolved external symbol "public: __thiscall tracked::A(void)" (??0A@tracked@@QAE@XZ)".
Nie wiem czemu :/

Jakby co odkomentowalem przestrzen nazw.

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