Аватар для FermA
10 / 8 / 0
Регистрация: 07.01.2011
Сообщений: 34

Класс как поле класса

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

Author24 — интернет-сервис помощи студентам
Нужно поместить класс внутри класса. Примерно так
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2011, 12:25
Ответы с готовыми решениями:

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

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

Класс квадрат, поле класса - длина стороны
Создать класс квадрат, поле класса - длина стороны. Предусмотреть в классе методы вычисления и вывода сведений о фигуре диагональ,...

12
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
08.01.2011, 12:38
пример
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.01.2011, 12:41
Цитата Сообщение от 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 / 0
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 12:46  [ТС]
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
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
08.01.2011, 12:49
тебе вот про это имеют ввиду
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.01.2011, 12:50
нет, я имел ввиду то что у вас поля TPoint* НО в конструкторе(из 1-го поста) вы зачем-то еще раз объявляете TPoint*
0
 Аватар для FermA
10 / 8 / 0
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:09  [ТС]
Как мне в конструкторе 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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 13:20
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 / 0
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:26  [ТС]
silent_1991, спасибо вопрос решен
0
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 8
08.01.2011, 13:32
Дай полный текст программы, сюда или в приват, мне это еще тоже предстоит.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 13:34
И всё же расово верной была бы примерно такая реализация

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 / 0
Регистрация: 07.01.2011
Сообщений: 34
08.01.2011, 13:38  [ТС]
много текста)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 13:39
FermA, Войну и Мир почитайте... Там много.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2011, 13:39
Помогаю со студенческими работами здесь

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

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} private: int type; }

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru