Two options come to mind. The first is to create a source member with the d-specs for the dog attributes and instead of using likeds(dog), have a /copy after each data structure that will use that subfield definition. In my opinion, this can make for some sloppy code and can make things difficult for someone to analyze down the road. On the other hand, if you are using this same data structure in multiple programs, there are benefits.
The second option that comes to mind is to use the Based() keyword on the dog data structure and then define a pointer field. The pointer field will take up some memory, but the dog data structure will not take up any memory until your program allocates it. The Based() keyword does not carry over into other data structures defined against it with LikeDS(). So that way you have your data structure defined in your program source. You don't have to allocate memory for it and you don't have to set your pointer to any value. It defaults to Null. Just be careful not to access the dog data structure in your code. You'll get a pointer error that looks the same as if your program was called without a required parameter.