Basically you can resolve without using a pointer because a pointer (or reference) is the only thing you can declare in the presence of an incomplete type and either X or Y must be incomplete at the time the other is declared.
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.