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

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

Восстановить пароль Регистрация
 
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
26.11.2014, 11:16     Поля структуры внутри класса #1
Здравствуйте, почему при выполнении метода 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.11.2014, 11:20     Поля структуры внутри класса #2
gettingNode возвращает копию объекта, эту копию Вы и модифицируете в методе movingNode
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
26.11.2014, 11:21     Поля структуры внутри класса #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от greendaizer Посмотреть сообщение
почему
в строке
C++
1
aleshenka.movingNode(aleshenka.gettingNode(2), 3.0, 4.0);
метод gettingNode возвращает копию (!) элемента вектора. эта копия успешно изменяется методом movingNode, но изменений в векторе вы естественно не видете
aLarman
636 / 557 / 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;
    }
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
26.11.2014, 11:25  [ТС]     Поля структуры внутри класса #5
Спасибо, сработало
Yandex
Объявления
26.11.2014, 11:25     Поля структуры внутри класса
Ответ Создать тему
Опции темы

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