Как написать приватный атрибут класса? - PullRequest
0 голосов
/ 20 сентября 2019

Я работал над классом, который будет содержать массив объектов другого класса.Но я не могу этого сделать.Вот упрощенная версия кода, который я пытаюсь использовать.Может ли кто-нибудь помочь мне работать с этим?

Почему s не может получить доступ к своим собственным элементам данных?

Может кто-нибудь показать всю концепцию того, как справляться с такими сценариями?

PS - ТОЛЬКО ИСПОЛЬЗОВАНИЕКлючевое слово FRIEND (класс или функция).Наследование не разрешено.

class Student{
private:
    int roll;
    char name1[15];
};

class Subject  {
private:
    Student s[10];
};

int main()
{
    Subject s1;
    s1.s[1].roll = 5; // trying to set roll of 1st student
    return 0;
}

Я ожидал, что будет присвоено значение, но в нем есть следующая ошибка.Почему это так?

error: 'Student Subject::s [10]' is private`
error: 'int Student::roll' is private
error: 'Student Subject::s [10]' is private
error: 'int Student::roll' is private

Ответы [ 4 ]

3 голосов
/ 20 сентября 2019

Может кто-нибудь помочь мне, как с этим работать.почему s не может получить доступ к своим собственным членам данных.

Конечно, может, но ошибка, которую вы видите, является результатом попытки доступа к private членам Subject и Student в main.

main не может получить доступ к private членам Subject или Student.Чтобы позволить main напрямую обращаться к переменным-членам, вам нужно сделать переменные-члены public.Другой вариант заключается в добавлении public функций доступа и модификаторов, соответствующих private переменным-членам.

2 голосов
/ 20 сентября 2019

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

В этом случае вам нужно сделать это дважды, для каждого из ваших классов с закрытыми атрибутами, которые вы все же хотите установить.

class Student{
    public:
        void setroll(int newroll)
        {
            roll = newroll;
        }
    private:
        int roll;
        char name1[15];
};

class Subject  {
    public:
        void setstudentsroll(int newroll, int index)
        {
            /* a good setter would at this point check the index,
            to make sure it does not access beyond the array */
            s[index].setroll(newroll);
        }
    private:
        Student s[10];
};

int main()
{
    Subject s1;
    s1.setstudentsroll(5,1); // trying to set roll of 1st student
    return 0;
}

Использование ключевого слова friend для этого возможно для внутреннего случая, когда код доступа находится в классе, который можетбыть названным.Но, и я предполагаю, что это реальная проблема, с которой вы столкнулись, она не помогает разрешить настройку main().

2 голосов
/ 20 сентября 2019

Массив ученика объявлен как закрытый член класса Subject.

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

первый вариант для вас - объявить этот массив как открытый член.другой - использовать getter / setter для этого участника, который получит / изменит этого участника

class Student
{
private:
    int roll;
    char name1[15];

public:
    char* getName(void)
    {
        return strdup(this->name1); 
    }

    void setRoll(int r)
    {
        this->roll = r;
    }
};

class Subject
{
private:
    Student s[10];

public:

    void setStudentRoll(int roll, char *s_name)
    {
        for (int i = 0; i < 10; i++)
        {
            if (strcmp(this->s[i].getName(), s_name) == 0)
            {
                this->s[i].setRoll(roll);
                break;
            }
        }
    }
};

, имейте в виду, что для установки члена ролика студента (который также объявлен как закрытый член), у вас будет такая же проблема.

0 голосов
/ 20 сентября 2019

Вы объявили переменную, и у объекта Object есть спецификатор частного доступа.Вы не можете инициализировать значения переменных вне этого класса.используя public вы можете инициализировать переменную в любом месте программы ... Решение:

class Student{
 public:
 int roll;
 char name1[15];
 };
 class Subject  {
 public:
 Student s[10];
 };
 int main()
 {
  Subject s1;
  s1.s[1].roll = 5; // trying to set roll of 1st student 
 return 0;
 }
...