#include <iostream>

typedef unsigned char bYte;
#define min(a,b) ( a<b ? a : b )

class B;

class A {
	public:
		bYte data[256]; bYte datalen;
		
	public:
		A(const void* b, bYte len); // assign binary data
		A(char* string); // assign C string
		A(B& b); // Assign B
		// NOTICE if I Change it to
		// A(const B& b)
		// then the warning goes away and I get the correct results
		
		
		operator char*() // to c string
		{
			data[sizeof(data)-1]=0;
			return (char*)data;
		};
};

class B {
	public:
		bYte data[256]; bYte datalen;
		
	public:
		B(const void* b, bYte len); // assign binary data
		B(char* string); // assign C string
		operator char* ()  // to c string
		{
			data[sizeof(data)-1]=0;
			return (char*)data;
		}
};


A::A(const void* b, bYte len) // assign binary data
{
	datalen = min(len, sizeof(data)-1);
	memcpy(data, b, datalen);
	data[datalen]=0;
}

A::A(char* string) // assign C string
{
	datalen = min(strlen(string)+1, sizeof(data));
	memcpy(data, string, datalen);
	data[sizeof(data)-1]=0;
}

A::A(B& b)
{
	datalen = b.datalen;
	memcpy(data, b.data, sizeof(data));
}

B::B(const void* b, bYte len) // assign binary data
{
	datalen = min(len, sizeof(data)-1);
	memcpy(data, b, datalen);
	data[datalen]=0;
}

B::B(char* string) // assign C string
{
	datalen = min(strlen(string)+1, sizeof(data));
	memcpy(data, string, datalen);
	data[sizeof(data)-1]=0;
}

A ReturnB()
{
	const char binary[10] = {1,2,0,3,4,5,6,7,8,0};
	B b(binary, 10);
	return b;
}

int main(int argc, const char *argv[])
{
	A a = ReturnB();
	int len = a.datalen;
	std::cout << "This should return 10 and it returns " << len << "\r\n";
	return 0;
}


