Проблема с указателем - PullRequest
3 голосов
/ 09 июня 2011

У меня проблемы с правильной работой моих указателей. В моем основном файле я объявляю

Analysis2 analysis = Analysis2();
MaxResults maxresults = MaxResults( analysis);

Теперь в моем классе MaxResults я хочу указать на анализ, чтобы, если какая-либо из его переменных изменилась, я все равно получил правильное значение. Прямо сейчас я объявляю конструктор в заголовке MaxResults как

MaxResults(Analysis2 analysis);
Analysis2 * analysis2;

А в классе MaxResults

MaxResults(Analysis2 analysis)
{
    analysis2 = analysis;
}

Когда я пытаюсь получить доступ к вещам из анализа, который изменился, то кажется, что анализ2 не идет в ногу. Как мне это исправить, и есть ли простой способ запомнить указатели, ссылки и разыменования в будущем?

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Если вы хотите, чтобы MaxResults держал указатель на Analysis2 объект, вы должны сделать это так:

class MaxResults {

 public:
     MaxResults(Analysis* an) : analysis(an) {}

 private:
     Analysis* analysis;
};

и сконструируйте его так:

Analysis2 analysis = Analysis2();
MaxResults maxresults = MaxResults( &analysis);

Обратите внимание на использование оператора адреса (&) для захвата адреса analysis и передачи его в качестве указателя на конструктор MaxResults, который сохраняет указатель в элементе (используя список инициализации, который является более или менее эквивалентно выполнению analysis = an в теле конструктора, на случай, если синтаксис : является для вас новым).

Для дальнейшего чтения взгляните на ссылки (разумеется, как только вы лучше поймете указатели). В этом случае ссылки, вероятно, предпочтительнее.

1 голос
/ 09 июня 2011

Я не совсем уверен, как это компилируется;это не должноПроблема в вашем конструкторе.

Во-первых, если ваш конструктор просто принимает параметр Analysis2, то этот параметр передается по значению;объект всегда копируется.Указатель не может указывать на фактический переданный объект, поскольку ваш конструктор получает только его копию.Вам необходимо использовать ссылочный параметр:

MaxResults(Analysis2& analysis);

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

MaxResults(Analysis2& analysis)
{
    analysis2 = &analysis;
}

На несвязанном примечании: это хороший стиль - использовать список инициализатора элемента для конструктора.

MaxResults(Analysis2& analysis)
    : analysis2(&analysis)
{
}
0 голосов
/ 09 июня 2011

Когда вы вызываете MaxResults maxresults = MaxResults(analysis);, ваш конструктор получает копию analysis.Вам нужно передать ссылку на analysis, чтобы конструктор получил адрес, который он может сохранить в указателе.Таким образом, maxresults имеет указатель на исходный объект, а не просто копию исходного объекта.

Сделайте что-то подобное в заголовке:

MaxResults(Analysis2 *analysis);
Analysis2* analysis2;

Сделайте это вопределение класса:

MaxResults(Analysis2 *analysis)
{
    analysis2 = analysis;
}

И создать объекты следующим образом:

Analysis2 analysis = Analysis2();
MaxResults maxresults = MaxResults(&analysis);
...