Форум программистов, компьютерный форум CyberForum.ru

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создать матрицу из контейнера std::array http://www.cyberforum.ru/cpp-beginners/thread1090354.html
Есть код: #include <iostream> #include <array> using namespace std; int main () { array <int,5> myarray; return 0;
C++ Опишите код - какая функция за что отвечает? опишите плиз код какая функция за что отвечает? код: #include <stdlib.h> #include <time.h> #include <grx20.h> #include <grxkeys.h> #include <stdio.h> http://www.cyberforum.ru/cpp-beginners/thread1090344.html
В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки C++
помогите с описанием кода какая функция за что отвечает? Следует разработать программу, которая преобразует любой текстовый файл в другой текстовый файл по правилу: В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки код: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <assert.h> ...
Хак препроцессора, объясните как работает C++
Уже кучу времени сижу как баран и питаюсь понять, как же это работает: #define BOOK_PP_CAT_IMPL(a, b) a ## b #define BOOK_PP_CAT(a, b) BOOK_PP_CAT_IMPL(a, b) #define BOOK_ID(identifier) BOOK_PP_CAT(auroraDetail_, identifier) #define BOOK_LINE_ID(identifier) BOOK_PP_CAT(BOOK_ID(identifier), __LINE__) #define FOREACH(declaration, container) \ if (bool...
C++ Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля. http://www.cyberforum.ru/cpp-beginners/thread1090322.html
Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.
C++ Умные указатели Пишу класс дерево поиска:template<typename T, typename Compare> class AvlTree { private: struct Node { T key; size_t height; std::unique_ptr<Node> leftChild; std::unique_ptr<Node> rightChild; explicit Node(const T &key) : key(key), height(1), leftChild(nullptr), подробнее

Показать сообщение отдельно
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
06.02.2014, 01:23     Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
Доброго времени суток!
Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме:
Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
У одного владельца (Person) может быть 0...* машин (Car).
У одной машины может быть 0...1 владельцев.

Первая попытка не компилируется:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Car;
 
class Person {
    vector<Car*> cars;
    string name;
public:
    string get_name() const { return name; }
    void add_car(Car* car) { 
        cars.push_back(car); 
        car->set_owner(this); 
    }
    void delete_car(Car* car) {
        for(vector<Car*>::iterator it=cars.begin(); it!=cars.end(); it++)
            if(*car == *(*it)) { 
                car->set_owner(0); 
                cars.erase(it); 
                return; 
            }
    }
};
 
class Car {
    Person* owner;
public:
    Car() : owner(0) {}
    Car(Person* person, string model = "n/a", string number = "n/a")
        :   owner(person), mod(model), num(number)
    {}
 
    Person get_owner() const { return *owner; }
    void set_owner(Person* person) { owner = person; }
 
    bool operator==(const Car& arg) {
        return ((this->mod == arg.mod)&&(this->num == arg.num));
    }
    bool operator!=(const Car& arg) {return !(*this==arg);}
    
    string mod;
    string num;
};
main():
C++
1
2
3
4
5
6
7
8
    Car* Ferrari = new Car(0,"Ferrari","LOV3K5U");
    Car* Mers = new Car(0,"Mers","C++student");
    
    Person* Dude = new Person("Jeff Lebowski");
    Dude->add_car(Ferrari);
    Dude->add_car(Mers);
    
    cout << Ferrari->get_owner()->get_name();
Вывод:
1>code.cpp(100): error C2027: использование неопределенного типа "Car"
1> code.cpp(91): см. объявление "Car"
1>code.cpp(100): error C2227: выражение слева от "->set_owner" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>code.cpp(104): error C2676: бинарный "==": "Car" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
1>code.cpp(105): error C2027: использование неопределенного типа "Car"
1> code.cpp(91): см. объявление "Car"
1>code.cpp(105): error C2227: выражение слева от "->set_owner" должно указывать на тип класса, структуры или объединения либо на универсальный тип

Если поменять порядок объявления классов, то программа компилируется:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Person;
 
class Car {
    Person* owner;
        // . . . 
};
 
class Person {
    vector<Car*> cars;
    string name;
    // . . .
};
Я хотел спросить почему первый вариант не работает и как лучше реализовывать подобные отношения классов.
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru