The encoders and decoders are not layers but net port properties and you need to attached them to a port.
This will work as you expect
dec = NetDecoder[{"Class", {"a", "b", "c"}}];
NNcompare =
NetInitialize@
NetChain[{3, LogisticSigmoid, 3, LogisticSigmoid, 3, LogisticSigmoid, 3,
SoftmaxLayer[]}, "Output" -> dec, "Input" -> 2];
NNcompare[{1, 2}]
(* "b" *)
I have fixed the input size to be able to initialize the net and use it but that can also be done at training time (the size will be inferred from the training data).