Определить член структуры через параметр функции - PullRequest
0 голосов
/ 27 января 2019

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

Я имею в виду вместо создания отдельной функции для каждого члена структуры,определить член с помощью параметра функции (примеры: & .tests, courses.exams)

Записанный кодекс предназначен только для объяснения того, что я имею в виду, значения можно импортировать из текстового файла вместо назначения их с помощьюслучайный.

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

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct lsn
{
    char name[20];
    int tests[4];
    int quizzes[4];
    int exams[4];
    int finals[4];
};

void random_notes(lsn *x, int *y)
{
    int i,j;
    for(i=0;i<20;i++)
        for(j=0;j<4;j++);
            x[i].y[j]=rand()%101;
}

int main()
{
    srand(time(NULL));

    lsn lessons[30];
    random_notes(lessons, &.tests);
    random_notes(lessons, &.quizzes);
    random_notes(lessons, &.exams);
    random_notes(lessons, &.finals);

    return 0;
}

Вместо создания 4 функций, как показано ниже,

void random_tests(lsn *x)
    {
        int i,j;
        for(i=0;i<20;i++)
            for(j=0;j<4;j++);
                x[i].tests[j]=rand()%101;
    }

void random_quizzes(lsn *x)
    {
        int i,j;
        for(i=0;i<20;i++)
            for(j=0;j<4;j++);
                x[i].quizzes[j]=rand()%101;
    }

void random_exams(lsn *x)
    {
        int i,j;
        for(i=0;i<20;i++)
            for(j=0;j<4;j++);
                x[i].exams[j]=rand()%101;
    }

void random_finals(lsn *x)
    {
        int i,j;
        for(i=0;i<20;i++)
            for(j=0;j<4;j++);
                x[i].finals[j]=rand()%101;
    }

Всего одна функция, которая определяет член структуры через егопараметр,

void random_notes(lsn *x, .struct_member y)
    {
        int i,j;
        for(i=0;i<20;i++)
            for(j=0;j<4;j++);
                x[i].y[j]=rand()%101;
    }

В этом примере функция очень мала, но представьте огромный код в функции, отличается только элемент struct, а остальная часть кода такая же.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

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

random_notes(lessons, [=](lsn& lesson) { return lesson.quizzes; });

в функции random_notes, вы просто вызываете функцию с экземпляром lsn, и она даст вам массив для заполнения

0 голосов
/ 27 января 2019

Да, в C ++ есть понятие «указатели на членов». Это позволит вам передать личность участника, которого вы хотите инициализировать. Однако синтаксис немного сложен, поэтому будьте осторожны:

void random_notes(lsn *x, int (lsn::* y)[4])
{
    int i,j;
    for(i=0;i<20;i++)
        for(j=0;j<4;j++);
            (x[i].*y)[j]=rand()%101; // << Access the member of x[i] via y
}

Что следует называть так:

random_notes(lessons, &lsn::tests);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...