Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с указателями 
:(
    Опции темы
carol
Дата 2.2.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.1.2006

Репутация: нет
Всего: нет



Есть 2 класс а А и B почему вылетает?
Код

/.h A
class A
{
public:
  void SomeFunc();
};
//.h B
class B
{
  B(){};
  B(A*object ):pt(object){object = new A;}
  protected:
    A*pt;
};
//B.cpp
void func()
{
  pt->SomeFunc();
}

PM MAIL   Вверх
Earnest
Дата 2.2.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



В чем смысл этого кода? Чему присваивается новый объект?
 
Код

B(A*object ):pt(object){object = new A;}



Это сообщение отредактировал(а) Earnest - 2.2.2007, 18:50


--------------------
...
PM   Вверх
carol
Дата 2.2.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.1.2006

Репутация: нет
Всего: нет



в классе B ( методе func)надо вызвать метод SomeFunc();
ну я и делаю в классе B указатеь типа A , и через этот указатель вызываю метод SomeFunc();
Но прога у меня вылетает
PM MAIL   Вверх
Earnest
Дата 2.2.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Еще раз: в конструктор B передается указатель на объект A, который присваивается члену pt. Он инициализирован?
Далее, затем этому указателю (параметру функции! переданному по значению!) присваивается новая выделенная память... и пропадает бесследно...
Еще далее. Код
Код

void func()
{
  pt->SomeFunc();
}

видимо надо читать как
Код

void B::func()
{
  pt->SomeFunc();
}

Если здесь вылетает, то причина скорее всего в неинициализированном объекте pt. Дикий конструктор наводит на мысль, что ты решил, что выделенный объект попадет в pt... Это не так...



--------------------
...
PM   Вверх
sergejzr
Дата 3.2.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Модератор: Название темы должно отражать ее суть!


 Правила форума: http://forum.vingrad.ruhttp://forum.vingra...ct-SR/f-27.html


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
carol
Дата 3.2.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.1.2006

Репутация: нет
Всего: нет



а  если так .
Код

//.h A
class B;
class A
{
A();
~A();
private:
  B*ob;
};
B::B()
{
  ob = new B;
}
B::~B()
{
 detete ob;
}
//.h B
class B
{
  A object_a;
}

//main .cpp
int main()
{
 B *pt = new B; //здесь вылетает ???????
 return 0;
}
 



PM MAIL   Вверх
zkv
Дата 5.2.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(carol @  3.2.2007,  16:59 Найти цитируемый пост)
а  если так .

хотите отгадать решение smile

Цитата(carol @  2.2.2007,  18:58 Найти цитируемый пост)
в классе B ( методе func)надо вызвать метод SomeFunc();
ну я и делаю в классе B указатеь типа A , и через этот указатель вызываю метод SomeFunc();

это можно сделать, например, так:
Код

#include <iostream>
using namespace std;
//.h A
class A
{
public:
    void SomeFunc();
};
void A::SomeFunc()
{
    cout<<"SomeFunc()\n";
}

//.h B
class B
{
protected:
    A*pt;
public:
    B(){}

    B(A*object )
    {
        pt = object;
    }

    void func();
};
//B.cpp
void B::func()
{
    pt->SomeFunc();
}

int main(int argc, char** argv)
{
    A a;
    B b( &a );
    b.func();
    cin.get();
}

PM MAIL   Вверх
carol
Дата 5.2.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.1.2006

Репутация: нет
Всего: нет



Код

//A.h
class B;
class A
{
 public:
 A(B*){};

public:
      B*pt_b;
      //...
public:
      void methodA();
};
//B.h
class B
{
public:
        B();
       ~B();
public:
      void methodB();
public:
      //member...
      int member;
      A*pt_A;
      ...
};
//A.cpp
A::A(B*pt_b)
{
  this->pt_b = pt_b;
  pt_b->methodB();
}
void A::methodA()
{
 int x = pt_b->member;//unhandled exception at 0x0041a036 in test.exe: 0xC0000005: Access violation reading cation 0xcdcdcde9
}
//B.cpp
B::B()
{
  pt_A = new A;
}
B::~B()
{
  delete pt_A;
}
void methodB()
{
 //что делаем
 pt_A->methodA()
}



PM MAIL   Вверх
Anikmar
Дата 5.2.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Неправильно.
Изначально создается объект B
Код

B::B()
{
  pt_A = new A;
}


Теперь смотрим как создался объект А:
Он создался с конструктором по умолчанию (по идее ругаться должен - я не нашел такого конструктора)
Затем вызываем метод 
pt_A->methodA()

И что в нем видим?
Код

void A::methodA()
{
 int x = pt_b->member;//unhandled exception at 0x0041a036 in test.exe: 0xC0000005: Access violation reading cation 0xcdcdcde9
}


А в каком месте инициализируется pt_b?
PM MAIL ICQ   Вверх
carol
Дата 5.2.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.1.2006

Репутация: нет
Всего: нет



Код

void A::methodA()
{
 int x = pt_b->member;//unhandled exception at 0x0041a036 in test.exe: 0xC0000005: Access violation reading cation 0xcdcdcde9
}
 
почему нельза переменной класса А присвоить значение переменной класса B (через указатель на класс В)?
у меня вить есть указатель  типа  В в классе А. 
P.S  при чем тут 
Цитата
Access violation reading cation 0xcdcdcde9

PM MAIL   Вверх
Anikmar
Дата 5.2.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



На момент выполнения этой инструкции:
int x = pt_b->member
Чему равен указатель pt_b?
PM MAIL ICQ   Вверх
Fazil6
Дата 5.2.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

у меня вить есть указатель  типа  В в классе А.

указатель есть, а объекта, на который он указывает нет

PM MAIL   Вверх
zkv
Дата 6.2.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



carol, во первых я вижу по крайней мере три ошибки, из за  которых код не откомпилируется;

во вторых, объясните, что вы хотите получить, а то что то не очень понятно;

в третьих, надо показывать не только как вы определили классы, но и как их используете;

в четвертых, существует режим пошагового выполнения программы, можно легко проследить, куда и что у вас присваивается.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.