когда мне нужно передать по указателю (а не по ссылке) - PullRequest
0 голосов
/ 15 октября 2010

Можете ли вы привести пример, когда я не могу передать аргумент по ссылке, и мне нужно использовать указатель. Я нашел пример, но я не уверен.

Предположим, у вас есть класс D, полученный из базового класса B. Вам нужен указатель, если вы хотите сделать это:

void function(B* b){...}
int main{
  D* d;
  function(d);
}

Ответы [ 8 ]

6 голосов
/ 15 октября 2010

Если существует руководство по кодированию (например, Google), в котором говорится об использовании аргументов указателя, то это то, что вы делаете.

В противном случае объявляйте вашу собственную функцию только с формальным аргументом указателя, когда

  • нулевой указатель является действительным и значимым фактическим аргументом, или

  • фактический аргумент является наиболее естественным указателем, или

  • вы собираетесь хранить этот указатель где-нибудь.

Возможно, больше случаев, но я думаю, что вы получаете смещение: когда у вас есть выбор (нет рекомендаций по кодированию, говорящих иначе), предпочтите ссылки.

Приветствия и hth.,

6 голосов
/ 15 октября 2010

Единственный раз, когда вы не можете использовать ссылку и должны использовать указатель, это если вы разрешаете концепцию «без аргумента», передавая нулевой указатель.

Однако вы можете использовать указатели какаргументы, когда вы на самом деле храните указатель на то, что было передано.Большинство разработчиков C ++ заметят, что вы не используете ссылку, и обратите особое внимание на то, что написано в вашей документации.

1 голос
/ 16 октября 2010

Обычно вы используете указатели для одной из двух вещей:

  • Переназначение - вы не можете перепривязать ссылку.
  • Нулевые указатели - нет такой вещи, как нулевая ссылка.

Если для предполагаемого варианта использования не требуется ни одно из этих двух свойств, используйте ссылку.Иначе, используйте указатель.

1 голос
/ 15 октября 2010

Другой случай: если переданная вами вещь является последним аргументом перед varargs:

void fn1(A &a, ...); // Uh oh
void fn2(A *a, ...); // Good

Я не знаю, требуется ли это стандартом или это просто ошибка в реализации используемого мной компилятора C ++.

0 голосов
/ 15 октября 2010

Я думаю, что если вы хотите передать функцию, вы должны передать ее по указателю.Я не вижу, как вы можете передать функцию по ссылке.

Например, возьмите следующую функцию:

#include <iostream>
#include "math.h"

void myfun (double value, size_t nofloops, double (*function)(double))
   {
   std::cout << value << std::endl;
   for (size_t i=0;i<nofloops;++i)
      {
      value = function(value);
      std::cout << value << std::endl;
      }
   std::cout << "------------------" << std::endl;
   }

void main()
   {
   myfun(100,10,sin);
   myfun(100,10,cos);
   myfun(100,10,sqrt);
   }

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

0 голосов
/ 15 октября 2010

http://www.daniweb.com/forums/thread216353.html

Пример односвязных списков, в которых указатели и указатели указателей используются в качестве параметров функции.

0 голосов
/ 15 октября 2010

Если вы хотите разрешить отсутствие объекта, вам нужно использовать указатели:

// This allows DoSomething to receive pointers to NULL, which cannot
// be done with references
void DoSomething(Something *pSomething)
{
  if (pSomething)
  {
    ...
  }
}

int main()
{
  Something *pSomething=NULL;

  DoSomething(pSomething);
}
0 голосов
/ 15 октября 2010

единственная причина в том, что вам нужно передать значение NULL. Т.е. вы хотите вызвать функцию, говорящую «у меня нет одного из них»

...