2016-12-06 1 views
1

Я пытаюсь достичь следующего: один объект менеджера классов пытается создать много объектов класса. управляющий объект передает его как ссылку на рабочие объекты, так что рабочие объекты могут изменять свое поведение в зависимости от состояния объекта-менеджера.Как передать указатель на конструктор объекта при создании объекта с помощью push_back()?

class manager; 

class worker{ 
public: 
    worker(manager &boss); 

}; 

class manager{ 

    public: 
    unsigned int currentMethod = 5; 

    manager(int numofWorkers); 
}; 

Так я пытаюсь осуществить это путем, когда конструктор менеджер вызывается, создать вектор рабочих, и я стараюсь push_back (это) ака объект менеджера.

manager::manager(int numOfWorkers){ 

    std::vector<worker> manyWorkers; 

    for(int i = 0; i < numOfWorkers;i++){ 
    manyWorkers.push_back(this); 
    } 
} 

worker::worker(manager &boss){ 
    std::cout << "Current method is " << boss.currentMethod << std::endl; 
} 

Путь этот код называется это

int main(int argc, char *argv[]){ 

    manager manag; 

    return 0; 
} 

Оказывается, что push_back (это) не проходит «это» в конструктор класса, хотя push_back() вызывает конструктор. Я также пробовал много рабочих (это) .push_back, который тоже не работает.

Как передать указатель на конструктор объекта manyWorkers при создании объекта с помощью push_back()?

Я смущен, что назвать то, что я пытаюсь достичь, и не смог найти решение.

+0

Если вы хотите, чтобы ваш контейнер управлять полиморфных ссылки, вам нужно будет пересмотреть свой контейнер таким образом, что он управляет указателями, или еще лучше, общие указатели на базовый класс. –

ответ

2

Использование emplace_back для вызова конструктора с параметрами:

manyWorkers.emplace_back(*this); 

Уведомление должно быть *this, так как конструктор вы ссылаетесь (worker(manager &boss);) принимает параметр manager по ссылке, а не как указатель.

+1

Спасибо, это решило мою проблему. Я могу принять этот ответ за две минуты. –

+2

Обратите внимание, что 'emplace_back()' находится только в C++ 11 и более поздних версиях. В более ранних версиях (и новее) 'push_back (* this)' или 'push_back (worker (* this))' должен работать. –

+0

@RemyLebeau Спасибо за полезный акцент. –

0

Вместо того, чтобы просто хранить this в векторе (кажется, что вы хотите сохранить работников), вам нужно создать экземпляр нового рабочего, а затем направить его обратно на вектор.

std::vector<*worker> manyWorkers; // Use * since we are dynamically allocating 
for(int i = 0; i < numOfWorkers;i++){ 
    worker* myWorker = new worker(this); 
    manyWorkers.push_back(myWorker); 
} 
Смежные вопросы