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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
#1

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

08.01.2011, 12:25. Просмотров 1616. Ответов 12
Метки нет (Все метки)

Нужно поместить класс внутри класса. Примерно так
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;
}
то все работает нормально, обьясните в чем прикол
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 12:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс как поле класса (C++):

Указатель на класс как поле класса - C++
Как работать с указателем в классе class A {}; class B {private: A * uk}; // как с ним работать?

Создать класс. Символьное поле должно быть задано как объект класса string - C++
решите задачку!) 6. Создать класс. Символьное поле должно быть задано как объект класса string. Написать конструктор по умолчанию,...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс: как обратиться к методу производного класса через итератор на базовый класс? - C++
Есть абстрактный и два порожденных. Хочу создать например list&lt;Base*&gt; list1; затем добавляю себе в список: ...

Класс: Реализация через битовое поле класса "Множество" - C++
Реализация через битовое поле. Как сделать ввод и вывод множества и так чтобы элементы хранились в отсортированном порядке? #include...

Вектор, как поле класса - C++
Здравствуйте. Есть задание написать свой класс, который можно использовать как стек. Так вот помещаемые данные хранить, по-моему, удобнее...

12
panicwassano
592 / 560 / 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);
}
сделай так
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 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);
}
а зачем еще раз объявлять? они уже обявлены в классе, их нужно только проинициализировать, а так компилятор в конструкторе создает локальный объект оставляя объекты класса неинициализированными
0
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;
}
Вы это имеете ввиду?
0
panicwassano
592 / 560 / 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 те что в классе получаются неинициализированы. Поэтому, когда ты пробуешь их напечать вылетает исключение.
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.01.2011, 12:50 #6
нет, я имел ввиду то что у вас поля TPoint* НО в конструкторе(из 1-го поста) вы зачем-то еще раз объявляете TPoint*
0
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;
}
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
1
FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:26  [ТС] #9
silent_1991, спасибо вопрос решен
0
D_I_M_A_91
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 8
08.01.2011, 13:32 #10
Дай полный текст программы, сюда или в приват, мне это еще тоже предстоит.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
0
FermA
10 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:38  [ТС] #12
много текста)
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 13:39 #13
FermA, Войну и Мир почитайте... Там много.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 13:39
Привет! Вот еще темы с ответами:

Дерево как поле класса - C++
Здравствуйте, у меня есть класс с несколькими полями, например, class Person { public: string name; int year; string adress; ...

Массив как поле класса - C++
Например, имеется класс с полем массивом размерностью 10 на 10. class massiv { private: int mas; public: ... }; ...

Как вводить поле класса? - C++
Почему возникает ошибка? Я пробовал scnf,scanf_s,gets,gets_s,cin,(cin&gt;&gt;z).get(); Что не так? #include &lt;iostream&gt; using...

Массив, как поле данных класса - C++
Как правильно обьявить массив char как элемент данных класса и проинициализировать его нулями в конструкторе??


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
08.01.2011, 13:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru