#c #struct #switch-statement
Вопрос:
*Я пытаюсь присвоить одному объекту структуры значения из другой структуры для любого типа птиц, выбранного с помощью оператора switch. Однако я получаю conflicting decoration
ошибку. Как я могу это решить?
/**
temp and humidity control points
*/
struct chicken_config
{
char *node_type = "incubator";
char *sub_type = "chicken"; // set the type of incubator
int sub_type_id = 1;
int hot = 102; //set hot parameter
float optimum_temp = 99.5; // set optimum_temp temp to go to b4 turning off
float cold = 89.9; //set cold parameter
int high_hum = 65; //set high humidity parameter
int optimum_hum = 60; // set optimum humidity parameter to go to b4 turning off
int low_hum = 55; // set low humidity parameter
};
struct turkey_config
{
char *node_type = "incubator";
char *sub_type = "turkey"; // set the type of incubator
int sub_type_id = 2;
int hot = 102; //set hot parameter
float optimum_temp = 99.5; // set optimum_temp temp to go to b4 turning off
float cold = 89.9; //set cold parameter
int high_hum = 65; //set high humidity parameter
int optimum_hum = 60; // set optimum humidity parameter to go to b4 turning off
int low_hum = 55; // set low humidity parameter
};
struct peacock_config
{
char *node_type = "incubator";
char *sub_type = "peacock"; // set the type of incubator
int sub_type_id = 3;
int hot = 101; //set hot parameter
float optimum_temp = 99.5; // set optimum_temp temp to go to b4 turning off
float cold = 98.9; //set cold parameter
int high_hum = 65; //set high humidity parameter
int optimum_hum = 60; // set optimum humidity parameter to go to b4 turning off
int low_hum = 55; // set low humidity parameter
};
struct chameleon_config
{
char *node_type = "incubator";
char *sub_type = "chameleon"; // set the type of incubator
int sub_type_id = 4;
int hot = 81; //set hot parameter
float optimum_temp = 77.5; // set optimum_temp temp to go to b4 turning off
float cold = 76.5; //set cold parameter
int high_hum = 95; //set high humidity parameter
int optimum_hum = 85; // set optimum humidity parameter to go to b4 turning off
int low_hum = 75; // set low humidity parameter
};
// structure for current incubator configuration
struct current_config
{
char *node_type = "incubator";
char *sub_type; // set the type of incubator
int sub_type_id;
int hot; //set hot parameter
float optimum_temp; // set optimum_temp temp to go to b4 turning off
float cold; //set cold parameter
int high_hum; //set high humidity parameter
int optimum_hum; // set optimum humidity parameter to go to b4 turning off
int low_hum; // set low humidity parameter
} currentConfig;
//////////////////////////////////////////////////////
Вот в чем у меня проблемы.
// setup directed sub-type
void switch_sub_type(int sub_type)
{
switch (sub_type)
{
// assign the bird type params
case 1: chicken_config currentConfig;
case 2: turkey_config currentConfig;
case 3: peacock_config currentConfig;
case 4: chameleon_config currentConfig;
}
return;
}
ЛЮБЫЕ предложения или советы будут высоко оценены.
Комментарии:
1. Это объявление char node_type = «инкубатор»; не имеет смысла. Вы пытаетесь инициализировать один символ строковым литералом.
2. Вы определили пять различных несвязанных и несовместимых
struct
типов. Я сильно подозреваю, что вам нужно что-то совсем, совсем другое. Как насчет одногоstruct
типа и пяти разных значений?3. как они не связаны между собой? Они имеют элементы одного и того же типа и одинаковой длины.
4. Они не связаны, потому что у них разные имена.
5. Кстати, подумайте об использовании соглашения об именовании, в котором имена структур имеют другой стиль, чем переменные (и члены). Это значительно упростит дифференциацию структур от переменных.
Ответ №1:
В вашем коде есть несколько соответствующих проблем
- Концепция C
struct
кажется неправильной: вы можете определить одинstruct
тип с определенным набором параметров и создать несколько его экземпляровstruct
. В вашем случае вы можете создать базовую структуру animal_config и по одному экземпляру для каждого животного, которое вы хотите включить в свой код.
Таким образом, вы можете создать общую конфигурацию:
struct animal_config
{
char node_type;
char sub_type; // set the type of incubator
int sub_type_id;
int hot = 102; //set hot parameter
float optimum_temp; // set optimum_temp temp to go to b4 turning off
float cold; //set cold parameter
int high_hum; //set high humidity parameter
int optimum_hum; // set optimum humidity parameter to go to b4 turning off
int low_hum; // set low humidity parameter
};
А затем назначьте ему разные значения в зависимости от условия:
void switch_sub_type(int sub_type)
{
switch (sub_type)
{
// assign the bird type params
struct animal_config currentConfig;
case 1:
animal_config.node_type = "incubator";
animal_config.sub_type = "chicken";
animal_config.sub_type_id = 1;
animal_config.hot = 102;
...
};
break;
case 2:
...
}
return;
}
- Я не знаю, является ли это просто минимальным примером, но
switch_sub_type
метод ничего не возвращает и нигде не сохраняет текущую конфигурацию. Он будет удален из стека после завершения вызова функции. Следуя моему предыдущему примеру, возможно, вы захотите вернутьcurrentConfig
объект вызывающему:
struct animal_config switch_sub_type(int sub_type)
{
switch (sub_type)
{
// assign the bird type params
struct animal_config currentConfig;
case 1:
animal_config.node_type = "incubator";
animal_config.sub_type = "chicken";
animal_config.sub_type_id = 1;
animal_config.hot = 102;
...
};
break;
case 2:
...
}
return currentConfig;
}
- Что касается вашего предложения о переключении, возможно, вам нужно включить
break;
заявление после каждого случая. В противном случае, если выбрано обращение, все обращения после него также будут выполнены, что приведет (вероятно) к нежелательному поведению.
Комментарии:
1.
animal_config = {
неверно, вы не можете назначить тип . Другим вариантом было бы иметьconst
предопределенные объекты для возможных инициализаторов, а затем оператор switch просто выполняет простое назначение2. Да, вы правы. Это возможно только для инициализации. Я все исправлю. Спасибо.
Ответ №2:
У меня есть две рекомендации: одна структура, отдельные переменные; и один базовый класс, несколько дочерних классов.
Одна структура, Много переменных
Согласно вашему коду, каждая птица может быть другим экземпляром одной и той же структуры.
struct Bird_Config
{
char *node_type;
char *sub_type; // set the type of incubator
int sub_type_id;
int hot; //set hot parameter
float optimum_temp; // set optimum_temp temp to go to b4 turning off
float cold; //set cold parameter
int high_hum; //set high humidity parameter
int optimum_hum; // set optimum humidity parameter to go to b4 turning off
int low_hum; // set low humidity parameter
};
int main()
{
Bird_Config chicken;
chicken.hot = 102;
Bird_Config turkey;
//...
return 0;
}
Базовый класс и наследование
Другой реализацией может быть использование родительского/базового класса и множества дочерних классов:
struct Bird_Config
{
char *node_type = "incubator";
char *sub_type; // set the type of incubator
int sub_type_id;
int hot; //set hot parameter
float optimum_temp; // set optimum_temp temp to go to b4 turning off
float cold; //set cold parameter
int high_hum; //set high humidity parameter
int optimum_hum; // set optimum humidity parameter to go to b4 turning off
int low_hum; // set low humidity parameter
};
class Chicken_Config : public Bird_Config
{
Bird_Config::sub_type = "chicken";
//...
};
The inheritance model allows you to do something like this:
int main()
{
std::vector<Bird_Config *> configs;
Bird_Config * p_bird = new Chicken_Config;
configs.push_back(p_bird);
p_bird = new Turkey_Config;
configs.push_back(p_bird);
//...
for (int i = 0; i < configs.size(); i)
{
std::cout << "Bird Configuration["
<< i
<< "]: "
<< configs[i]->sub_type
<< "n";
}
return 0;
}
В приведенном выше примере вам не нужно делать это в switch
зависимости от типа конфигурации. Механизм наследования (полиморфизм) справится с этим за вас.
Комментарии:
1. Не согласен с предложением о наследовании — оно чрезмерно усложняет код, и вектор необработанных указателей трудно правильно использовать (опять же, чрезмерно усложняя код, чтобы избежать утечек памяти) . Было бы намного проще просто иметь
vector<Bird_Config>
и инициализировать значения в обычном режиме