Конечно, это совершенно разумно. В основном то, что вы сделали, очень похоже на фабричный шаблон. Я не вижу никаких проблем с этим, поскольку ваш код, по-видимому, подразумевает, что каждый объект Software должен иметь указатель на своего создателя.
Хотя, как правило, вы можете избежать использования классов «Manager», таких как SoftwareProducer, и просто использовать статические методы в Software. Так как кажется вероятным, что будет только один SoftwareProducer. Возможно, что-то вроде этого:
class Software {
private:
Software() : m_key(0) { /* whatever */ }
public:
void buy() { m_key = new_key(); }
public:
static Software *create() { return new Software; }
private:
static int new_key() { static int example_id = 1; return example_id++; }
private:
int m_key;
};
Тогда вы можете просто сделать это:
Software *soft = Software::create();
soft->buy();
Конечно, если вы планируете иметь более одного объекта SoftwareProducer, то то, что вы сделали, кажется уместным.