ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

26.07.2009, 20:24
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Поищи в разделе, выкладывалось несколько раз
вот например
Это если ты хотел просто пример работы, а не применительно к спикам.
Последний раз редактировалось Fata1ex; 26.07.2009 в 20:35..
|
|
|

26.07.2009, 22:10
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
Провел на форуме: 233095
Репутация:
21
|
|
Fata1ex, оно, спасибо!
|
|
|

27.07.2009, 00:08
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
Провел на форуме: 233095
Репутация:
21
|
|
И снова я с вопросом. В общем такая ситуация:
Код:
#include <iostream>
using namespace std;
class node
{
public:
void C(node* _node);
int data;
};
void main()
{
node* _node = 0;
_node->C(_node);
cout << _node->data << endl;//и тут ступор
}
void node::C(node *_node)
{
_node = new node;
_node->data = 5;
}
Что я тут не правильно сделал? Почему после возвращения в мейн, данные теряются? Вроде как указатели юзаю...
Я то проблему решил, но совсем не так как мне этого хотелось. Вышло что-то типа:
Код:
#include <iostream>
using namespace std;
class node
{
public:
node* C(node* _node);
int data;
};
void main()
{
node* _node = 0;
_node = _node->C(_node);
cout << _node->data << endl;
}
node* node::C(node *_node)
{
_node = new node;
_node->data = 5;
return _node;
}
Почему первый вариант не работает? Как решить проблему?
Последний раз редактировалось horlyk; 27.07.2009 в 00:16..
|
|
|

27.07.2009, 02:51
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
жуть. почитай ка лучше дейтела.
я даже не могу понять, что ты хочешь этим кодом сделать... тут не список даже. чем то напоминает фабричный метод, тока зачем он здесь? O_o
|
|
|

27.07.2009, 09:27
|
|
Участник форума
Регистрация: 09.08.2008
Сообщений: 139
Провел на форуме: 560332
Репутация:
15
|
|
Код:
node* _node = 0;
_node->C(_node);
Как это может быть?
Ты делаешь у указателя значение 0 и пытаешься потом по этому адресу обратиться...
|
|
|

27.07.2009, 09:40
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Отличный пример того, как не стоит называть переменные в запутанных кодах.
Glazz, эээ....нулевой указатель?
Хотя да...логика кода неверна:
Код:
node* _node = 0;
_node->C(_node);
...
_node = new node;
_node->data = 5;
Короче твои переменные сами тебя и погубили  Функция еще не успела создать новый _node, он еще нулевой, а ты его уже используешь. Вроде так. Хотя все равно твой код отдает руническими письменами.
Последний раз редактировалось Fata1ex; 27.07.2009 в 09:48..
|
|
|

27.07.2009, 13:15
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
Провел на форуме: 233095
Репутация:
21
|
|
Имена то так, я по быстренькому тестовую прогу написал, так как в основной проге с этой проблемой столкнулся. Идея должна быть вот примерно такая: из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором new. Далее изменяется значение data указателя. Дальше возврат в мэйн и вывод измененного значения на экран. Но значение остается прежним.
Следовательно, как мне из другого метода, изменить адрес указателя, который передавался.
Код:
class node
{
public:
node() { cout << "constructor...\n"; }
~node() { cout << "destructor...\n"; }
void func(node* Mynode);
node(node&) { cout << "copy-constructor...\n"; }
int data;
};
void main()
{
node* Mynode = new node;
Mynode->func(Mynode);
cout << Mynode->data << endl;
}
void node::func(node *Mynode)
{
Mynode->data = 5;
Mynode = new node;
Mynode->data = 7;
}
То есть чтоб вывелось на экран значение 7, а не 5.
Не используя return в func
Последний раз редактировалось horlyk; 27.07.2009 в 13:29..
|
|
|

27.07.2009, 13:27
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
node* node::C(node *_node)
{
_node = new node;
_node->data = 5;
return _node;
}
Из-за такого бреда может лопнуть моск ))
В классе создаешь метод типа push() или какой нибуть сеттер, далее в мейне создаешь экземпляр класса(в стеки/в куче как хочешь) и уже к нему обращаешься.
|
|
|

27.07.2009, 13:30
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Из-за такого бреда может лопнуть моск ))
ааа, ты тоже заметил
и ему присваивается новый адрес оператором new
мда. Почитай литературу лучше...
Вообщем не есть хорошая практика пытаться писать слова, пока не освоил алфавит. Попробуй работать пока без ООП, которое ты пытаешься сейчас применить, потому как преимуществ и особенностей его ты еще не понимаешь.
Последний раз редактировалось Fata1ex; 27.07.2009 в 13:37..
|
|
|

27.07.2009, 13:37
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
void node::func(node *Mynode)
{
Mynode->data = 5;
Mynode = new node;
Mynode->data = 7;
}
Во первых в классе есть неявный указатель на экземпляр this
Во вторых, переменная data является открытой и доступна вне класса
В третьих, у тебя тут Mynode = new node; будет утечка памяти.
В общем как сказал товарищ Fata1ex, лучше сейчас потрать больше времени на прочтение литературы и это в будущем тебе сэкономит уйму времени )
Последний раз редактировалось razb; 27.07.2009 в 13:41..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|