простое генеалогическое дерево в c ++ с использованием указателей - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать простое генеалогическое дерево в C ++, используя указатели для ввода строк для имен, которые затем постепенно сохраняются в коде.

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

#include <iostream>
#include <cstdlib>
using namespace std;

class person
{
public:
    person* mom;
    person* dad;
    string name;
    person();
    ~person();
    person(string n);
};


person::person()
{
    mom = nullptr;
    dad = nullptr;
    name = "Unknown";
}    

person::~person()
{
//delete any dynamic memory if needed
}

person::person(string n)
{
    name = n;
}

int main()
{
string inputName;
person current;
person *pointer; //I know I'll probably need to use a class pointer 
//in some manner to keep track of the current pointer, but how?
//also, how to turn private variables in person into public
//while still being able to use them indirectly in main, if possible? 

char choice;
do {
    cout << "You are currently at: " << current.name << endl;
    cout << "Your mom is: ";
    if(current.mom == nullptr)
    {
        cout << "???" << endl;
    }
    else
    {
        cout << current.mom;
    }
    cout << "Your dad is: ";
    if(current.dad == nullptr)
    {
        cout << "???" << endl;
    }
    else
    {
        cout << current.dad;
    }
    cout << "Give name, go to mom, go to dad, back to start, or quit?" << endl;
    cin >> choice;

    if (choice == 'g')
    {
        cout << "What name (single word)?" << endl;
        cin >> inputName;
        current.name = inputName;
    }
    else if (choice == 'm')
    {
    //go to mom spot
    }
    else if (choice == 'd')
    {
    //go to dad spot
    }
    else if (choice == 'b')
    {
    //go to first registered name
    }
}
while (choice == 'g' || choice == 'm' || choice == 'd' || choice == 'b');
//else quit
return 0;
}

Мой код на данный момент довольно небрежный, так как я начинающий в C ++ и только начал неделю назад самостоятельно. Я знаю, что публичные переменные - очень плохая практика, но я не знаю, как использовать закрытые переменные в main. Будем весьма благодарны за любую помощь в том, как организовать мои указатели или как заставить работать частные переменные внутри main.

1 Ответ

0 голосов
/ 27 апреля 2018

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

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

так твой

class person
{
public:
    person* mom;
    person* dad;
    string name;
    person();
    ~person();
    person(string n);
};

Становится

class person
{
public:
    person();
    ~person();
    person(string n);

    void setName(string);

    person* getMom();
    person* getDad();
    string getName();
private:
    person* mom;
    person* dad;
    string name;
};

Обратите внимание, что при объявлении функции вам не нужно указывать имя каких-либо переменных параметров. Это совершенно необязательно; компилятору нужно только знать, какой тип переменной ожидать.

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

...
person::person(string n)
{
    name = n;
}

void person::setName(string name)
{
    this->name = name;
}

person* person::getMom()
{
    return mom;
}

person* person::getDad()
{
    return dad;
}

string person::getName()
{
    return name;
}

int main()
...

Это форматирование по сути такое же, как если бы вы разделяли класс Person на его собственные файлы заголовков (.h) и cpp (.cpp).

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

cout << "You are currently at: " << current.name << endl;

Становится

cout << "You are currently at: " << current.getName() << endl;

Надеюсь, это имеет смысл.

ps: если вы используете строковый класс C ++, вы можете #include <string>

pps: Хорошая практика - всегда использовать первую букву любого класса, который вы делаете. Просто так это выделяется. Person вместо person.

...