C++ и вложенная структура

в этой программе меня интересует такая проблема: как получить доступ к построению переменных и я не понимаю ошибок:

gcc struct1En.cc -lstdc++ -o struct1En 
struct1En.cc: In member function 'void job::cie::printBuilding()':
struct1En.cc:22: error: 'job' is not a base of 'job::cie'
struct1En.cc: In function 'int main()':
struct1En.cc:48: error: incompatible types in assignment of 'const char [10]' to 'char [20]'

Я читал, что люди используют класс, а не структуру. Но в этом случае я просто хочу знать, почему я не могу добраться до здания переменной и почему ошибка говорит о несовместимости типов при назначении 'const char [10] to' char [20] '

#include <iostream>

struct job {
    private:
    char name[20];
    double salary;

    public:
    int building;
    void initName() {std::cin >> name;}
    void initSalary() {std::cin >> salary;}
    void printName() {std::cout << "name: " << name << std::endl;}
    void printSalary() {std::cout << "Salary: " << salary << std::endl;}
    void printBuilding() {std::cout << "Building number : " << building << std::endl;}

    struct cie {
        char name[20];
        int employee;

        void printName(){ std::cout << "name: " << cie::name << std::endl;}
        void printEmployee() {std::cout << "number of employees : " << employee << std::endl;}
        void printBuilding() {std::cout << "Building number: " << this->job::building << std::endl;}
    };

};


int main() {

    job teacher;
    std::cout << "Enter a name: \n";
    std::cout << "Name: "; 
    teacher.initName();
    teacher.printName();

    std::cout << "Enter a salary: \n";
    std::cout << "Salary: ";
    teacher.initSalary();
    teacher.printSalary();

    std::cout << "Enter the number of the building: \n";
    std::cout << "Building n°: ";
    std::cin >> teacher.building;
    teacher.printBuilding();


    job::cie educationNationale;
    educationNationale.name = "Courriere";
    educationNationale.printName();

    educationNationale.employee = 200 + 1;
    educationNationale.printEmployee();

    educationNationale.printBuilding();

    return 0;
}

Структура внутри структуры - это отдельная структура. Он не получает никакой информации от родительской структуры и не получает доступа ни к одной из ее переменных.

David Ledger 20.09.2018 12:10

Хорошо, спасибо. Меняю и теперь эта ошибка исчезает при компиляции. void printBuilding (задание aJob) {std :: cout << "Номер здания:" << aJob.building << std :: endl;} and educationNationale.printBuilding (учитель); извините за этот дубликат.

ripeisripe 20.09.2018 12:14

Я до сих пор не понимаю эту ошибку: несовместимые типы при присвоении 'const char [10]' 'char [20]' Почему компилятор говорит const?

ripeisripe 20.09.2018 12:15

Я нахожу начало решения в этом вопросе: stackoverflow.com/questions/5414186/…

ripeisripe 20.09.2018 12:22

Поэтому я меняю код: void initName () {std :: cin >> name;} (в struct cie) и std :: cout << "Введите имя: \ n"; std :: cout << "Имя:"; educationNationale.initName (); educationNationale.printName ();

ripeisripe 20.09.2018 12:30

Когда вы назначаете educationNationale.name = "Courriere"; Имя переменной - это char [20], а "Courriere" - это char [10]. Это отдельные типы. Вероятно, вы захотите использовать std :: string там, где у вас есть char [20]. Введите заголовок #include <string> и замените все вхождения char [20] в ваших классах (элементы имени) на std :: string.

David Ledger 21.09.2018 04:57

если вам действительно нужно использовать char [20], вы можете использовать memcpy, но это, вероятно, нецелесообразно, поскольку ошибки с ним могут быть дорогостоящими. Этот код работает: char label [20]; memcpy (метка, "Courriere", sizeof ("Courriere")); Но это небезопасно, как если бы вы попытались присвоить имя, которое было длиннее, чем char [20], вы бы записали в разделы памяти, которые находятся за пределами класса (BAD).

David Ledger 21.09.2018 04:58

Спасибо за объяснение! Я использую std :: string и не использую memcpy, поскольку это, вероятно, нецелесообразно.

ripeisripe 21.09.2018 09:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
1 631
0

Другие вопросы по теме