Я начинаю изучать структуру С++. После создания структуры с именем Person я попытался объявить логическую переменную с именем genderBoolean в структуре Person и строковую переменную с именем пол. Я попытался использовать оператор if-else для следующего условия: если гендерное логическое значение истинно, то пол — мужской, а если гендерное логическое значение ложно, то гендер — женский. Я попытался поместить оператор if-else вне структуры, но IDE говорит
Идентификатор "genderBoolean" не определен
что вызывает еще одну ошибку компиляции.
Кажется, что оператор if-else нельзя использовать в структуре C++. Я обнаружил, что добавление # перед оператором if и добавление #endif может решить ошибку компиляции «ожидаемое объявление» в Microsoft Visual Code 2022, но вывод программы:
«Имя = Майк Пол = Возраст = 50 Национальность = американец»
Я ожидал, что его вывод будет: «Имя = Майк Пол = мужской Возраст = 50 Национальность = американец»
Мой код также генерирует сообщение о компиляции, в котором говорится, что переменная genderBoolean не инициализирована, но может работать:
#include <iostream>
using namespace std;
int main() {
struct Person {
string name;
bool genderBoolean;
string gender;
string age;
string nationality;
#if (genderBoolean == true) {
gender = "male";
}
else if (genderBoolean == false) {
gender = "female";
}
#endif
};
Person person1;
person1.name = "Mike";
person1.genderBoolean = true;
person1.age = "50";
person1.nationality = "American";
cout << "Name = " << person1.name << " Gender = " << person1.gender <<
" Age = " << person1.age << " Nationality = " << person1.nationality <<
endl;
return 0;
}
Я попытался поместить оператор if-else за пределы структуры, но он говорит, что идентификатор «genderBoolean» не определен.
Я ожидал, что его вывод будет: «Имя = Майк Пол = мужской Возраст = 50 Национальность = американец»
Что на самом деле получилось: «Имя = Майк Пол = Возраст = 50 Национальность = американец»
@πάνταῥεῖ Нет, не знаю. Я пришел с Java на C++.
#if
— это директива препроцессора, и в зависимости от того, как вы ее использовали, вы условно компилируете код проблемы. Причина, по которой код является проблемой, заключается в том, что вы не можете просто бросить кусок кода в определение класса или структуры. Вы должны использовать конструктор для инициализации ваших объектов.
@Javaeur Тогда вам следует обратиться к некоторой базовой документации, прежде чем начинать программировать на С++.
@RetiredNinja Без использования #if, как мне использовать оператор if-else в этом коде?
Приобретите себе хорошую книгу. Не гадать и импровизировать.
оператор if-else не может использоваться внутри структуры" Это не относится к операторам if или структурам, но правило заключается в том, что код должен быть внутри функции. Чтобы инициализировать структуру или класс, вы можете использовать конструктор.
java совершенно другой, но и в java нет такой конструкции, как в вашем коде, вы также использовали бы конструктор
@cigien Как поместить оператор if в этот код? Ни положить его внутрь, ни снаружи не получится.
@Bop Можете ли вы показать мне, как это сделать, спасибо.
@ 463035818_is_not_a_number Надеюсь, вы покажете мне, как это сделать, спасибо.
Проголосовали за открытие. Эта проблема не вызвана опечатками. Это вызвано непониманием того, как работает язык, и заслуживает ответа, который решает эту проблему. «Вызвано опечатками» следует зарезервировать для настоящих опечаток, а не для «людей, имеющих опыт работы с C++, знающих, что это недопустимо».
@Javaeur — посмотрите здесь learncpp.com/cpp-tutorial/constructors несколько примеров.
Вот несколько различных способов справиться с этим, используя конструктор и сеттер. Имейте в виду, что добавление параметризованного конструктора означает, что у структуры нет конструктора по умолчанию, поэтому вам потребуется особая осторожность, чтобы поместить его в массив и тому подобное. Добавление конструктора по умолчанию остается за вами. Я бы посоветовал сделать переменные-члены закрытыми и предоставить методы для их установки, чтобы вы могли добавить проверку ошибок и сохранить инварианты, такие как синхронизация двух гендерных переменных.
Я добавил #include <string>
, потому что вы всегда должны включать то, что вы используете, и не зависеть от другого файла, чтобы включить его, поскольку это может быть не всегда так, и удалил using namespace std;
, потому что это плохая привычка. Читать Почему «используя пространство имен std;» считается плохой практикой? для получения дополнительной информации.
#include <iostream>
#include <string>
enum class Gender
{
Male,
Female
};
struct Person
{
std::string name;
bool genderBoolean;
std::string gender;
std::string age;
std::string nationality;
Person(const std::string& name, Gender genderType,
const std::string& age, const std::string& nationality)
: name(name)
, genderBoolean(genderType == Gender::Male)
// A way to initialize the gender
, gender(genderType == Gender::Male ? "male" : "female")
, age(age)
, nationality(nationality)
{
// A way to assign the gender
// If you use this remove the one above
// You don't need both
//if (genderBoolean)
//{
// gender = "male";
//}
//else
//{
// gender = "female";
//}
}
void setGender(Gender genderType)
{
// A way to change the gender
// Would be best if the member variables were private
// But would not prevent the class from making them mismatch
// by modifying the gender variable directly
if (genderType == Gender::Male)
{
gender = "male";
}
else
{
gender = "female";
}
}
friend std::ostream& operator<<(std::ostream& out, const Person& p);
};
std::ostream& operator<<(std::ostream& out, const Person& p)
{
out << "Name = " << p.name
<< ", Gender = " << p.gender
<< ", Age = " << p.age
<< ", Nationality = " << p.nationality
<< "\n";
return out;
}
int main()
{
Person person1("Mike", Gender::Male, "50", "American");
std::cout << person1;
person1.setGender(Gender::Female);
std::cout << person1;
return 0;
}
Вывод:
Name = Mike, Gender = male, Age = 50, Nationality = American
Name = Mike, Gender = female, Age = 50, Nationality = American
Вы знаете, что на самом деле делает
#if
??