2014-09-30 3 views
2

Мне нужно создать много объектов из класса, но каждый из них должен знать определенное значение X, которое является общим для каждого объекта этого класса, как глобальный параметр. Это необходимо, чтобы мои конструкторы правильно работали в моих объектах.Как использовать общие значения во многих объектах в C++?

Есть ли способ сделать это, не передавая значение в качестве параметра конструктора? То, что я хочу сделать, это использовать одну и ту же переменную во всех объектах, чтобы я не терял память.

* В моей реальной ситуации это не просто значение X, это вектор с 1024-мерным увеличением.

+0

Передайте это значение в функции по ссылке, а не по значению, чтобы не создавать дополнительные копии. – CoryKramer

+0

* 1024-dimmension int vector * Серьезно? – deviantfan

+0

Что не так с глобальными переменными? если вам это не нравится - статическая переменная тоже будет работать –

ответ

1

Я предполагаю, что вы хотите, чтобы вектор размером 1024 в качестве общей переменной использовался во всех ваших классах. Вы могли бы это сделать:

class MyClass { 

    static std::vector<int> s_my_vector; 
} 

Этот код заходил в ваш файл заголовка. В вашем файле cpp вам нужно будет инициализировать std :: vector. Однако я не рекомендую это делать. Статические переменные класса, для которых требуются вызовы конструктора (т. Е. Не примитивы или типы POD), имеют много ошибок, которые я не планирую включать. Я буду предлагать лучшее решение однако:

class MyClass { 
    static std::vector<int> & GetMyVector() 
    { 
    static std::vector<int> my_vector; 
    static bool initialized = MyVectorInit(my_vector); 
    return my_vector; 
    } 

    static bool MyVectorInit(std::vector<int> & v) 
    { 
    v.resize(1024); 
    ... 
    } 
public: 
    MyClass() { 
    std::vector<int> & v = GetMyVector(); 
    ... 
    } 

    static void EarlyVectorInit() 
    { 
    GetMyVector(); 
    } 
} 

В этом случае статическая локальная переменная гарантирует, что будет только одна копия my_vector, и вы можете получить ссылку на него по телефону GetMyVector. Кроме того, инициализированный статический bool гарантированно создается только один раз, а это значит, что MyVectorInit будет вызываться только один раз. Вы можете использовать этот метод, если вам нужно заполнить свой вектор каким-то нетривиальным способом, который не может быть выполнен в конструкторе. Как я его написал, ваш вектор будет создан автоматически в первый раз, когда вам нужно его использовать, что довольно удобно. Если вы хотите вручную инициировать создание по какой-либо причине, вызовите функцию EarlyVectorInit().

+1

GetMyVector и связанные с ним функции должны быть статическими. –

+0

Я это считал. Есть ли потенциал роста, чтобы сделать их статичными? Поскольку они должны быть приватными в любом случае (oops, забудьте сделать ctor public), у меня возникли проблемы с мыслью о том, как это может измениться. –

+1

Почему они не статичны? Они не требуют, чтобы какой-либо объект существовал. –

2

Что вы хотите, это статический член. «Когда элемент данных объявлен как статический, для всех объектов класса поддерживается только одна копия данных». например

class myClass { 
    public: 
    static int x; 
}; 
Смежные вопросы