Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с указателями


Автор: carol 2.2.2007, 18:41
Есть 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();
}

Автор: Earnest 2.2.2007, 18:49
В чем смысл этого кода? Чему присваивается новый объект?
 
Код

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


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

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

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

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

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

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

Автор: sergejzr 3.2.2007, 12:08
Модератор: Название темы должно отражать ее суть!


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

Автор: carol 3.2.2007, 16:59
а  если так .
Код

//.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;
}
 



Автор: zkv 5.2.2007, 08:52
Цитата(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();
}

Автор: carol 5.2.2007, 13:34
Код

//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()
}



Автор: Anikmar 5.2.2007, 15:14
Неправильно.
Изначально создается объект 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?

Автор: carol 5.2.2007, 16:06
Код

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

Автор: Anikmar 5.2.2007, 16:15
На момент выполнения этой инструкции:
int x = pt_b->member
Чему равен указатель pt_b?

Автор: Fazil6 5.2.2007, 20:06
Цитата

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

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

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

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

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

в четвертых, существует режим пошагового выполнения программы, можно легко проследить, куда и что у вас присваивается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)