Приватный конструктор / деструктор?
Приватный конструктор / деструкторы имеет смысл для любого типа класса, экземплярами объекта которого должен управлять какой-то другой manager класс (который, например, имеет список всех экземпляров класса, которым он управляет).Пример:
class AManager;
class A {
private:
friend class AManager;
A() {};
~A() {};
}
class AManager {
public:
A* createA() { a = new A(); aList.add(a); return a; }
void destroy(A* a) { aList.remove(a); delete a; }
private:
list<A> aList;
}
Защищенный конструктор / деструктор?
Если вы хотите, чтобы создавались только подклассы вашего класса (например, если ваш класс является просто абстрактнымкласс, но не имеет чисто виртуальных методов, поэтому его теоретически можно было бы создать, если бы он был общедоступными конструкторами):
class A {
protected:
A() {};
~A() {};
}
class A1: public A {
public:
A1() {}
}
class A2: public A {
public:
A2() {}
}
Это наиболее целесообразно как часть шаблона factory :
class AFactory {
public:
A* createA() {
if(someCondition()) return new A1();
else return new A2();
}
void destroyA(A* a) { delete a; }
private:
bool someCondition() { /*...*/ }
}
Методы create
/ destroy
также могут быть статическими методами базового класса A
, но тогда это становится немного сложнее из-за необходимости предварительных объявлений.Кроме того, в качестве альтернативы конструкторы A1
и A2
могут оставаться защищенными и AFactory
быть другом A1
и A2
.
Защищенный унаследованный основной класс?Частный унаследованный основной класс?
Что вы подразумеваете под Main
классом?В любом случае непубличное наследование очень похоже на агрегацию, поэтому, если нет особой причины не делать этого, агрегацию следует отдавать предпочтению частному / защищенному наследованию.