Я хочу поместить несколько myClass
объектов в пространства имен и использовать их в своей основной функции.Следующая стратегия работает, но определения пространств имен занимают много строк, и пользователю действительно не нужно их видеть.
Как я могу переместить пространства имен / инициализации переменных во включаемый файл?
// Main.C:
namespace Ns1{
myClass* mycA = new myClass(constant1A);
myClass* mycB = new myClass(constant1B);
/// ... lots more vars
}
namespace Ns2{
myClass* mycA = new myClass(constant2A);
myClass* mycB = new myClass(constant2B);
/// ... all/many of the same vars as in ns1
}
void main(){
int param = 0; // param determined in main()
Ns1::mycA->setOtherVars(param);
Ns2::mycB->accessSomething();
// clean up!?
}
Я исследовал и перепробовал множество возможных решений, но, похоже, у всех есть подводные камни.Например:
- эти объекты не
consts
;если бы они были, я думаю, это решило бы некоторые проблемы. static
инициализаторы плохие, особенно для пользовательских типов. - Глобальные переменные плохие, поэтому я хочу избежать этого.
- Я попытался объявить переменные внутри пространств имен (в заголовочном файле) и вызвать
initializeNs1Vars()
и vector<myC*> getNs1Vars()
.Я не помню, что пошло не так с этим.Может быть, это мой самый многообещающий маршрут? - Мессинг с
extern
, казалось, просто добавил намного больше кода. - А как насчет очистки!?
EDIT: ОК, переменные в пространствах имен являются завуалированными глобальными переменными.Есть ли другой способ определить множество переменных более компактным способом?
void main(){
myClass* mycA_1 = new myClass(constant1A);
myClass* mycB_1 = new myClass(constant1B);
//... lots more objects
myClass* mycA_2 = new myClass(constant2A);
myClass* mycB_2 = new myClass(constant2B);
//... lots more objects
// as before
}