Вызов закрытых членов другой функции - проблемы с массивами и типами - PullRequest
0 голосов
/ 29 марта 2012

У меня проблемы с вызовом C ++ элементов массива типа класса .Вот пример моего кода:

//village.h
class village
{
    public:
        class Human
        {
            public:
                void setGender(std::string g);
                std::string getGender();
            private:
                std::string gender;
        };

        class World
        {
            public:
                void join(Human c, int i);
            private:
                Human humanArray[20];
        };

//village.cpp
void village::World::join(Human c, int i)
{
    humanArray[i] = c;
    cout << humanArray[i].gender << endl;
    cout << c.getGender() << endl;
}

//main.cpp

village::Human h;
village::World world

h.setGender("Male");
world.join(c, 1);

У меня проблема в том, что я получаю сообщение об ошибке в строке;

cout << humanArray[i].gender << endl;

, говоря

'пол' является частным.

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

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Измените его на

cout << humanArray[i].getGender() << endl;

Техническая справка о том, почему это работает:

Переменная-член gender объявлена ​​ private в классе Human, поэтому другие классы (и их экземпляры) не могут получить к ней доступ (без специального разрешения). Функции-члены Human::getGender() и Human::setGender() объявлены public , поэтому к ним можно получить доступ к экземплярам (объектам) класса Human.

Поскольку функция-член может получить доступ к закрытым членам (переменным и функциям) класса, к которому она принадлежит, Human::getGender() (также верно для Human::setGender()) может получить доступ к частному gender переменная-член класса Human.

Функция join() является членом класса World, который отличается от класса Human, поэтому она имеет доступ только к открытым членам (т. Е. Имеет доступ к Human::getGender(), но не до Human::gender)

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

1 голос
/ 29 марта 2012

Вы должны использовать метод доступа getGender ()

cout << humanArray[i].getGender()<< endl;

hummanArray является членом World, поэтому к нему могут обращаться любые экземпляры класса World.

пол является членом класса Human и поэтому не может быть напрямую доступен функциям класса World.

0 голосов
/ 29 марта 2012

Проблема в том, что переменная-член gender действительно объявлена ​​закрытой, поэтому вы не можете получить к ней доступ из класса World.Когда вы говорите humanArray[i].gender, вы получаете человека, а затем пытаетесь получить доступ к его половому члену (который является частным).Вместо этого используйте humanArray[i].getGender().

...