Вам нужно узнать о ссылках и указателях в C ++.
Это доступ к существующим объектам (подумайте «ссылка на»). Основное различие между ними состоит в том, что если вы даете ссылку на объект, вы гарантируете, что этот объект существует в момент передачи. Если вы указываете указатель, за ним может ничего не стоять, в последних версиях это называется «нулевым» указателем (записывается NULL
или nullptr
).
Вот основной способ использования обоих:
int i = 0;
int& refToI = i; // create a reference to i
int* ptrToI = &i; // create a pointer to i
int& anotherRef; // invalid, references must be initialized;
int* anotherPtr; // valid, points to garbage data, better set it to NULL though
refToI = 1; // i has been changed
*ptrToI = 1; // i has been changed, the "*" operator means "content pointed by"
Объекты (или функции), принимающие ссылку или указатель, должны уточнить время жизни, которое они ожидают от указанных объектов. То есть после создания ссылки или указателя объект, на который он указывает, также может быть уничтожен. Это плохо, избегай этого.
Вот несколько примеров в вашем случае:
// Solution 1 take a reference to the objet in the function using it
class Job; // tells the compiler that there's a Job class somewhere.
class Display
{
public:
void DoWork(Job& job) {
// write this in the CPP file, I am using a shortcut for the sake of brevity
job.DoSomething();
}
};
// usage:
Display display;
Job job;
display.DoWork(job);
// Solution 2, carry the reference (or pointer) inside the class using it
class Job; // tells the compiler that there's a Job class somewhere.
class Display
{
public:
Display(Job& job) // !! job must live at least as long as display
: _job(job)
{ }
void DoWork() {
// write this in the CPP file, I am using a shortcut for the sake of brevity
_job.DoSomething();
}
private:
Job& _job;
};
// Usage:
Job job;
Display display(job); // job and display have the same lifetime, OK
display.DoSomething();
Примечание
Существует дискуссия о том, следует ли вам использовать указатели или ссылки. Я думаю, что сейчас это немного сложнее для вас. Эмпирическое правило: используйте ссылки, когда время жизни хорошо известно, используйте умные указатели, когда их нет, или при использовании new
.
.