Я пытаюсь создать простое семейное дерево в 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.
Вы правильно объявили и определили общедоступных членов вашего класса, чтобы реализовать частные, вам не нужно слишком много менять.
В соответствии с определением вашего класса, вам просто нужно включить раздел «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
,
Других решений пока нет …