Передача массива Struct в функцию по ссылке - PullRequest
0 голосов
/ 16 сентября 2011

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

struct employeeType
{
string firstName;
...
double monthlyBonus;
};

void readEmpData(ifstream& infile, employeeType *emp, int length);

Я думал, что я только что сделал employeeType & emp или employeeType & emp [], но получаю ошибки и все, что я гуглил, только что указатели.

Вот полныйкод на pastebin для разъяснения моего эксперимента по обучению: http://pastebin.com/6NfZ3LC4

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

Является ли массив фиксированного размера?Если нет, вы можете использовать шаблон:

template <unsigned int N>
void myFunction(Foo (&arr)[N])
{
   // arr[0] etc.
}

Естественно, это будет работать только для массивов времени компиляции:

void f()
{
  Foo a[10];
  myFunction(a);  // OK

  Foo * b = new Foo[11];
  myFunction(b); // error, nonsense, b is a pointer, not an array
}

(Если ваш массив всегда имеет одинаковый размер,Вы можете пропустить шаблон и напрямую указать размер аргумента. Обратите внимание, что «массив» - это не один тип в C ++, а T[N] - это различный тип для каждого N.почему у вас не может быть единственной функции для "всех массивов".)

0 голосов
/ 16 сентября 2011

Указатель может быть указателем на отдельный объект или на массив объектов.Не имеет никакого значенияПричина, по которой вы не нашли ссылок на массивы, заключается в том, что они обычно избыточны.

*emp будет обращаться к одному объекту или первому объекту массива.

emp[0] - этоточно так же, как *emp с другим синтаксисом.Они оба ведут себя одинаково.

emp[1] получит второй объект в массиве.Откуда C ++ знает, что вы передали массив функции?Это не так.Он ожидает, что you будет отслеживать, указывает ли указатель на массив, и размер массива.

0 голосов
/ 16 сентября 2011

Я предполагаю, что вы хотите, чтобы readEmpData считывал массив сотрудников из файла. В этом случае вызывающая сторона не будет знать, сколько сотрудников, и поэтому массив и его длина должны быть выходными параметрами. Подходящая подпись будет:

void readEmpData(ifstream & infile, employeeType *& emp, int & length);

или

employeeType * readEmpData(ifstream & infile, int & length);

Вы также можете определить оператор << для employeeType и прочитать, используя STL:

vector<employeeType> employees;
copy(istream_iterator(file), istream_iterator(), back_inserter(employees));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...