#include <iostream>
using namespace std;
 
class classA
{
public:
	classA() {
    	std::cout<<"Construct InstA At:"<<this<<std::endl;
    }
    classA(const classA& a){
    	std::cout<<"Construct InstA At:"<<this<<" With A At "<<&a<<std::endl;
    }
    classA & operator=(const classA& a) {
    	std::cout<<"Copy InstA At:"<<&a<<" To A At "<<this<<std::endl;
    	return *this;
    }
    ~classA(){
    	std::cout<<"Destruct InstA At:"<<this<<std::endl;
    }
};
 
class classB
{
public:
    classA PropertOfInstanceA;
    classA* PropertOfInstanceAPointer;
    classB() {
    	std::cout<<"Construct InstB At:"<<this<<std::endl;
    }
    classB(const classB& b){
    	this->PropertOfInstanceA = b.PropertOfInstanceA;
    	this->PropertOfInstanceAPointer = b.PropertOfInstanceAPointer;
    	std::cout<<"Construct InstB At:"<<this<<" With B At"<<&b<<std::endl;
    }
	classB & operator=(const classB& b) {
		this->PropertOfInstanceA = b.PropertOfInstanceA;
    	this->PropertOfInstanceAPointer = b.PropertOfInstanceAPointer;
    	std::cout<<"Copy InstB At:"<<&b<<" To B At "<<this<<std::endl;
    	return *this;
    }
 
    ~classB(){
    	std::cout<<"Destruct InstB At:"<<this<<std::endl;
    }
};
 
classA createA()
{
    classA instanceA;
    return instanceA;  
}; 
 
classB* createInstBPtrWithInstA(classA InstA)
{
    classB* instanceBPointer = new classB();
    instanceBPointer->PropertOfInstanceA = InstA;
    return instanceBPointer;
}
 
int main() {
	// your code goes here
	classA InstA;
    classB* InstBPtrWithInstA = createInstBPtrWithInstA(InstA);
 
	return 0;
}
