2016-04-23 2 views
0

создать два следующих объектов:Создание массива объектов вызывает вопрос

bool Reception::createNProcess() 
{ 
    for (int y = 0; y < 3; ++y) 
    { 
     Process   *pro = new Process; // forks() at construction 
     Thread   *t = new Thread[5]; 

     this->addProcess(pro); // Adds the new process to a vector 
     if (pro->getPid() == 0) 
     { 
     for (int i = 0; i < 5; ++i) 
     { 
      pro->addThread(&t[i]); // Adds the new thread to a vector 
      t[i].startThread(); 
     } 
     } 
} 

Где я создаю 3 процесса (что я воплощен в Process) и создать 5 потоков в каждом из этих процессов.

Но я не уверен, что следующая строка верна:

Thread   *t = new Thread[5]; 

Поскольку мои две функции addProcess и addThread оба принимают указатель на Process и Thread соответственно, и все же компилятор запрашивает ссылку на t[i] для addThread, и я не понимаю, почему.

void Process::addThread(Thread *t) 
{ 
    this->threads_.push_back(t); 
} 

void Reception::addProcess(Process *p) 
{ 
    this->createdPro.push_back(p); 
} 

createdPro определяется в Reception классе следующим образом:

std::vector<Process *>  createdPro; 

и threads_ в Process класса, как, например:

std::vector<Thread *>   threads_; 

и сообщение об ошибке (так очевидно, как это) является следующим:

error: no matching function for call to ‘Process::addThread(Thread&)’ pro->addThread(t[i]);

process.hpp:29:10: note: candidate: void Process::addThread(Thread*) void addThread(Thread *);

process.hpp:29:10: note: no known conversion for argument 1 from ‘Thread’ to ‘Thread*’

Хотя я определил свой Thread как указатель.

+0

Можете ли вы показать определение 'threads_' и' createdPro'? – Christophe

+0

Хорошо! Благодарю. Здесь нет никакого рассогласования с объектами. Но кул, вы также показываете точное сообщение об ошибке, пожалуйста? – Christophe

+0

'pro-> addThread (&t[i]);' выглядит правильно для меня на основе того, что вы опубликовали. Что вы подразумеваете под «компилятор запрашивает ссылку на t [i] для addThread»? Вы должны написать точное сообщение об ошибке –

ответ

0

Вы определили функцию чтобы взять указатель:

void Process::addThread(Thread *t) 
{ 
    ... 
} 

Вы затем вызывать эту функцию для &t[i], который является указателем и должен работать идеально:

 pro->addThread(&t[i]); // Adds the new thread to a vector 

Вы также можете вызвать это с t+i, и все будет хорошо. Однако ваше сообщение об ошибке сообщает нам что-то другое: компилятор не находит соответствия для pro->addThread(t[i]); (т. Е. Отсутствует &).

Либо вы сделали опечатку в своем вопросе, либо вы сделали опечатку в своем коде. Или у вас есть еще один вызов где-то, где вы забыли амперсанд: t[i] бы, конечно, обозначающий предмет (это эквивалентно *(t+i)), а не указатель, и вызвать сообщение об ошибке вы (demo mcve)

Смежные вопросы