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

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

Войти
Регистрация
Восстановить пароль
 
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
#1

Поля структуры внутри класса - C++

26.11.2014, 11:16. Просмотров 245. Ответов 4
Метки нет (Все метки)

Здравствуйте, почему при выполнении метода movingNode поля элемента структуры node (координаты x и y) не меняются?

Метод:

C++
1
2
3
4
5
void movingNode(node &node1, double dx, double dy)
    {
        node1.x += dx;
        node1.y += dy;
    }
Программа целиком:

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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <cstdlib>
#include <ctime>
#include <math.h>
 
using namespace std;
 
class graph
{
public:
    struct node
    {
        int id;
        double radius; 
        double x;
        double y;
        int degree;
        list <int> arclist;
    };
 
    vector <node> nodes;
    int numberOfNodes;
    int numberOfArcs;
    bool connected;
    //double generalRadius;
    //double instantOfTime;
 
    node creatingNode(int inId)
    {
        node outNode;
        outNode.id = inId;
        outNode.degree = 0;
        outNode.radius = rand() % 10;
        outNode.x = rand() % 10;
        outNode.y = rand() % 10;
        return outNode;
    }
 
    void addingArc(node &node1, node &node2)
    {
        node1.arclist.push_back(node2.id);
        node1.degree++;
        node2.arclist.push_back(node1.id);
        node2.degree++;
        numberOfArcs++;
    }
 
    double calculatingDistance(node &node1, node &node2) // Вычисляет расстояние между вершинами u и v
    {
        return sqrt((node2.x - node1.x)*(node2.x - node1.x) + (node2.y - node1.y)*(node2.y - node1.y));
    }
 
    bool arcExist(node &node1, node &node2) // Проверяем, достаёт ли сигнал одной вершины до другой
    {
        if (node2.radius >= calculatingDistance(node1, node2) || node1.radius >= calculatingDistance(node1, node2))
            return true;
        else
            return false;
    }
 
    bool isConnected()
    {
        for (int i = 0; i < nodes.size(); i++)
        if (nodes[i].degree == 0)
            return false;
        return true;
    }
 
    graph()
    {
        numberOfNodes = rand() % 10;
        bool flag1=true;
 
        for (int i = 0; i < numberOfNodes; i++)
        {
            node cNode = creatingNode(i);
            nodes.push_back(cNode);
        }
            
        for (int i = 0; i < nodes.size(); i++)
        for (int j = 0; j < nodes.size(); j++)
        if (arcExist(nodes[i], nodes[j]) && i < j)
            addingArc(nodes[i], nodes[j]);  
 
        connected = isConnected();
 
    };
    
    bool findingArc(node &node1, node &node2)
    {
        for (list<int>::iterator it = node1.arclist.begin(); it != node1.arclist.end(); it++)
        if (*it == node2.id)
            return true;
 
        return false;
    }
 
    node gettingNode(int id1)
    {
        for (int i = 0; i < nodes.size(); i++)
        if (nodes[i].id == id1)
            return nodes[i];
    }
 
    void deleteArc(node &node1, node &node2)
    {
        node1.arclist.erase(find(node1.arclist.begin(), node1.arclist.end(), node2.id));
        node2.arclist.erase(find(node2.arclist.begin(), node2.arclist.end(), node1.id));
    }
 
    void movingNode(node &node1, double dx, double dy)
    {
        node1.x += dx;
        node1.y += dy;
    }
 
    void deleteNode(node &node1)
    {
        for (int i = 0; i < nodes.size(); i++)
        if (i == node1.id)
            nodes.erase(nodes.begin()+i);
 
        //Надо удалить эту вершину из всех арклистов, т.е. все рёбра, которые входят в неё.
    }
 
    void printingGraph()
    {
        cout << "Вершины:" << endl;
        for (int i = 0; i < nodes.size(); i++)
            cout << nodes[i].id << " радиус: " << nodes[i].radius << " координаты: " << nodes[i].x << " " << nodes[i].y << " степень: " << nodes[i].degree << endl;
        cout << "Рёбра:" << endl;
 
        for (int i = 0; i < nodes.size(); i++)
        for (list<int>::iterator it = nodes[i].arclist.begin(); it != nodes[i].arclist.end(); it++)
        {
            cout << nodes[i].id << " " << *it << endl;
        }   
    }
 
    void printingArclist(node &node1)
    {
        for (list<int>::iterator it = node1.arclist.begin(); it != node1.arclist.end(); it++)
        {
            cout << *it << " " << endl;
        }
    }
};
 
int main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    graph aleshenka;
    int b=0;
    /*for (int i = 0; i < 10000; i++)
    {
        graph p;
        if (p.connected)
            b++;
    }
    cout << b << endl; */
    aleshenka.printingGraph();
//    aleshenka.deleteNode(aleshenka.gettingNode(1));
//  cout << aleshenka.gettingNode(2).radius << endl;
/*  if (aleshenka.arcExist(aleshenka.gettingNode(1), aleshenka.gettingNode(3)))
    {
        aleshenka.deleteArc(aleshenka.gettingNode(1), aleshenka.gettingNode(3));
 
        aleshenka.printingArclist(aleshenka.gettingNode(1));
    }
*/
    aleshenka.movingNode(aleshenka.gettingNode(2), 3.0, 4.0);
    aleshenka.printingGraph();
  
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 11:16     Поля структуры внутри класса
Посмотрите здесь:

Использовать объект структуры внутри класса - C++
Здравствуйте! Необходимо сделать так, чтобы была возможность использовать данные из структуры внутри класса. Конкретно в этом примере -...

Как сделать локализацию внутри класса/структуры? - C++
Как сделать локализацию внутри класса/структуры?

Как перегрузить операцию = для присваивания элементам структуры внутри класса значений? - C++
Помогите, если не затруднительно. Столкнулся с проблемой, когда пытался присвоить в конструкторе значения элементам структуры, которая...

Инициализация класса A внутри класса B - C++
заранее извиняюсь, наверняка подобное было на одной из 1000 страниц=)... есть 2 класса //собственно первый класс class matrix ...

Структура внутри структуры - C++
Вопрос следующий... Есть структура следующего вида : struct student { int stud_id,birth_year,pass_year; char fio; ...

Объявить указатель на структуру внутри структуры - C++
Объявить указатель на структуру внутри структуры. Добавлено через 5 часов 24 минуты Просто отрывок кода.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.11.2014, 11:20     Поля структуры внутри класса #2
gettingNode возвращает копию объекта, эту копию Вы и модифицируете в методе movingNode
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
26.11.2014, 11:21     Поля структуры внутри класса #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от greendaizer Посмотреть сообщение
почему
в строке
C++
1
aleshenka.movingNode(aleshenka.gettingNode(2), 3.0, 4.0);
метод gettingNode возвращает копию (!) элемента вектора. эта копия успешно изменяется методом movingNode, но изменений в векторе вы естественно не видете
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.11.2014, 11:22     Поля структуры внутри класса #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
попробуйте такой вариант
C++
1
2
3
4
5
6
7
8
node & gettingNode(int id1)
    {
static node empty_node;
        for (int i = 0; i < nodes.size(); i++)
        {if (nodes[i].id == id1)
            return nodes[i];}
        return empty_node;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2014, 11:25     Поля структуры внутри класса
Еще ссылки по теме:

Возможно ли указать на переменную внутри структуры, а не на ее значение? - C++
Всем привет. Есть у меня структура, к примеру: struct { char a; char b; char c;

Что означает слово struct внутри объявления структуры? - C++
Допустим объявляю структуру следующим образом: struct element{ int id; struct element* next; }; Что означает в данном...

Реализовать динамический массив структур внутри динамической структуры - C++
Добрый вечер! Я никак не могу реализовать динамический массив структур внутри динамической структуры. Может кто нибудь ссылочку скинет на...

Структуры. Создание переменной int внутри функции. Ошибка - C++
Первый раз работаю со структурами. Компилятор жалуется на 13 строку со словами &quot;new types may not be defined in a return type two or...

Перегрузка внутри класса - C++
Как описывается перегрузка внутри класса и вне его?

Перегрузка внутри класса - C++
Есть класс Points, который использует обычные стандартные функции. Здесь для примера написал две функции(работают со значениями переменных...


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

Или воспользуйтесь поиском по форуму:
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
26.11.2014, 11:25  [ТС]     Поля структуры внутри класса #5
Спасибо, сработало
Yandex
Объявления
26.11.2014, 11:25     Поля структуры внутри класса
Ответ Создать тему
Опции темы

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