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

Класс как поле класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
FermA
 Аватар для FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 12:25     Класс как поле класса #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
#include <iostream.h>
#include <conio.h>
// program.hpp
class TPoint
{
    public:
    int x;
    int y;
    TPoint (int,int);
};
class TLine
{
    public:
    TPoint* start;
    TPoint* end;
        TLine (int,int,int,int);
};
 
// program.cpp
TPoint::TPoint (int _x,int _y)
{
        x = _x;
        y = _y;
}
TLine::TLine (int x1,int y1,int x2,int y2)
{
        TPoint* start = new TPoint (x1,y1);
        TPoint* end = new TPoint (x2,y2);
}
 
int main()
{
        TLine* line = new TLine (1,2,3,4);
        cout << line->end->y <<endl;
        getch();
        return 0;
}
Выводит что вздумается

UPD:
если сделать так
C++
1
2
3
4
5
6
7
TLine::TLine (int x1,int y1,int x2,int y2)
{
        TPoint* _start = new TPoint (x1,y1);
        TPoint* _end = new TPoint (x2,y2);
        start = _start;
        end = _end;
}
то все работает нормально, обьясните в чем прикол
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.01.2011, 12:38     Класс как поле класса #2
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Point
{
public:
    double x, y;
};
 
class Triangle
{
public:
    double GetArea();
    double GetPerimeter();
    Point GetCenter();
 
    void Move(double dx, double dy);
    void Scale(double sx, double sy);
    void Rotate(Point center, double angle);
    Point p0, p1, p2;
};
Добавлено через 5 минут
C++
1
2
TPoint* start = new TPoint (x1,y1);
    TPoint* end = new TPoint (x2,y2);
зачем объявлять еще раз переменную *start и *end? отсюда и ошибка

C++
1
2
3
4
5
TLine::TLine (int x1,int y1,int x2,int y2)
{
    start = new TPoint (x1,y1);
    end = new TPoint (x2,y2);
}
сделай так
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.01.2011, 12:41     Класс как поле класса #3
Цитата Сообщение от FermA Посмотреть сообщение
Line::TLine (int x1,int y1,int x2,int y2)
{
TPoint* start = new TPoint (x1,y1);
TPoint* end = new TPoint (x2,y2);
}
а зачем еще раз объявлять? они уже обявлены в классе, их нужно только проинициализировать, а так компилятор в конструкторе создает локальный объект оставляя объекты класса неинициализированными
FermA
 Аватар для FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 12:46  [ТС]     Класс как поле класса #4
C++
1
2
3
4
5
TLine::TLine (int x1,int y1,int x2,int y2)
{
        start = new TPoint (x1,y1);
        end = new TPoint (x2,y2);
}
сделай так
так я так и делаю

Добавлено через 3 минуты
а зачем еще раз объявлять? они уже обявлены в классе, их нужно только проинициализировать, а так компилятор в конструкторе создает локальный объект оставляя объекты класса неинициализированными

C++
1
2
3
4
5
6
7
Line::TLine (int x1,int y1,int x2,int y2)
{
     start->x = x1;
     end->x = x2;
     start->y = y1;
     end->y = y2;
}
Вы это имеете ввиду?
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.01.2011, 12:49     Класс как поле класса #5
тебе вот про это имеют ввиду
C++
1
2
3
4
5
Line::TLine (int x1,int y1,int x2,int y2)
{
TPoint* start = new TPoint (x1,y1);
TPoint* end = new TPoint (x2,y2);
}
у тебя start и end уже объявлены в классе, а ты их в конструкторе еще раз объявляешь только локальными(внутри конструктора), а start и end те что в классе получаются неинициализированы. Поэтому, когда ты пробуешь их напечать вылетает исключение.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.01.2011, 12:50     Класс как поле класса #6
нет, я имел ввиду то что у вас поля TPoint* НО в конструкторе(из 1-го поста) вы зачем-то еще раз объявляете TPoint*
FermA
 Аватар для FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:09  [ТС]     Класс как поле класса #7
Как мне в конструкторе TLine заполнить поля start и end не создавая нового обьекта?

Добавлено через 16 минут
сделал так - вылетает с ошибкой
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
#include <iostream.h>
#include <conio.h>
// program.hpp
class TPoint
{
        public:
        int x;
        int y;
        void Set (int,int);
};
class TLine
{
        public:
        TPoint* start;
        TPoint* end;
        TLine (int,int,int,int);
};
 
// program.cpp
void TPoint::Set (int _x,int _y)
{
        x = _x;
        y = _y;
}
TLine::TLine (int x1,int y1,int x2,int y2)
{
        start->Set(x1,y1);
        end->Set(x2,y2);
}
 
int main()
{
        TLine* line = new TLine (1,2,3,4);
        cout<<line->end->y<<endl;
        return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.01.2011, 13:20     Класс как поле класса #8
FermA, у вас start и end - указатели на тип TPoint. Только вот они никуда не указывают. А как вы это "никуда" можете инициализировать? Одним из вариантов решения будет:

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
#include <iostream>
 
class TPoint
{
public:
    int x;
    int y;
 
    TPoint(int, int);
};
 
TPoint::TPoint(int _x, int _y)
{
    x = _x;
    y = _y;
}
 
class TLine
{
public:
    TPoint* start;
    TPoint* end;
    
    TLine(int, int, int, int);
};
 
TLine::TLine(int x1, int y1, int x2, int y2)
{
    start = new TPoint (x1, y1);
    end = new TPoint (x2, y2);
}
 
int main()
{
    TLine* line = new TLine (1, 2, 3, 4);
    std::cout << line->end->y << std::endl;
    return 0;
}
FermA
 Аватар для FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:26  [ТС]     Класс как поле класса #9
silent_1991, спасибо вопрос решен
D_I_M_A_91
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 8
08.01.2011, 13:32     Класс как поле класса #10
Дай полный текст программы, сюда или в приват, мне это еще тоже предстоит.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.01.2011, 13:34     Класс как поле класса #11
И всё же расово верной была бы примерно такая реализация

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
 
//-----------------------------------------------------------------------------
 
class TPoint
{
private:
    int _x;
    int _y;
 
public:
    TPoint(int = 0, int = 0);
 
    void set_x(int);
    int get_x() const;
 
    void set_y(int);
    int get_y() const;
};
 
TPoint::TPoint(int x, int y):
_x(x),
_y(y)
{
}
 
void TPoint::set_x(int x)
{
    _x = x;
}
 
int TPoint::get_x() const
{
    return _x;
}
 
void TPoint::set_y(int y)
{
    _y = y;
}
 
int TPoint::get_y() const
{
    return _y;
}
 
//-----------------------------------------------------------------------------
 
class TLine
{
private:
    TPoint* _start;
    TPoint* _end;
    
public:
    TLine(int = 0, int = 0, int = 0, int = 0);
    ~TLine();
 
    void set_start(const TPoint &);
    TPoint get_start() const;
 
    void set_end(const TPoint &);
    TPoint get_end() const;
};
 
TLine::TLine(int x1, int y1, int x2, int y2):
_start(new TPoint (x1, y1)),
_end(new TPoint (x2, y2))
{
}
 
TLine::~TLine()
{
    delete _start;
    delete _end;
}
 
void TLine::set_start(const TPoint &start)
{
    delete _start;
 
    _start = new TPoint (start);
}
 
TPoint TLine::get_start() const
{
    return *_start;
}
 
void TLine::set_end(const TPoint &end)
{
    delete _end;
 
    _end = new TPoint (end);
}
 
TPoint TLine::get_end() const
{
    return *_end;
}
 
//-----------------------------------------------------------------------------
 
int main()
{
    TLine* line = new TLine (1, 2, 3, 4);
 
    std::cout << line->get_end().get_y() << std::endl;
    
    return 0;
}
FermA
 Аватар для FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:38  [ТС]     Класс как поле класса #12
много текста)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 13:39     Класс как поле класса
Еще ссылки по теме:

Создать класс. Символьное поле должно быть задано как объект класса string C++
C++ Указатель на класс как поле класса
Дерево как поле класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.01.2011, 13:39     Класс как поле класса #13
FermA, Войну и Мир почитайте... Там много.
Yandex
Объявления
08.01.2011, 13:39     Класс как поле класса
Ответ Создать тему
Опции темы

Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru