Я работаю над проектом, который имеет высокую многопоточность между определенными классами, поэтому мне нужно получить доступ к значению в определенном классе, и я хочу использовать указатели для доступа к нему, поэтому то, что я делаю, в основном описано ниже:
У меня есть 3 класса:
хиджры
class A{
public: int myvalue;
}
В классе A.cpp
class A{
A::A(){
myvalue=0;
}
function(){
myvalue++;
}
}
Теперь я хочу получить доступ к этому значению в промежуточном классе под названием B, потому что я могу получить к нему доступ напрямую. В классе Б.ч
class B{
public: A *myptr1;
}
В классе B.cpp
class B{
B::B(){
myptr1 = new A();
}
Function (){
printf("My value is = %d \n",myptrt1->myvalue);
}
}
Когда я запускаю программу, мой вывод верен и равен 5. Однако мне нужно также получить доступ к этому значению в третьем классе, поэтому я использую другой указатель из второго класса для доступа к нему.
Давайте назовем третий класс C, поэтому в классе C.h
class C {
public: B *myptr2;
}
В классе C.cpp
class C{
C::C(){
myptr2 = new B();
}
Function (){
printf("My value is = %d \n",myptr2->myptrt1->myvalue);
}
}
Когда я запускаю программу, мой вывод был неверным. Я получил некоторые значения, равные нулю, а другие являются отрицательными значениями, поэтому я думаю, что второй указатель указывает на неправильную ячейку памяти? поэтому мой вопрос, как правильно получить доступ к этому значению. Я пытаюсь написать код, похожий на мой код для простоты, потому что код слишком велик.
Заранее благодарны за Вашу помощь.
В опубликованном вами упрощенном псевдокоде вы получаете доступ к myvalue
атрибут, и так как он инициализируется нулями в A
Это конструктор и увеличивается после этого, нет никаких причин, почему его значение должно стать отрицательным. Это, скорее всего, вызвано некоторой ошибкой (скрытой в вашем реальном коде), которая переписывает myvalue
ценность.
Но больше всего меня привлекает то, что у вас есть:
class C
{
public:
C() { bPtr = new B(); }
B* bPtr;
Теперь, если время жизни экземпляра B
содержится в случае C
привязан к жизни этого экземпляра C
кажется разумным для bPtr
быть агрегированным по значению ~>, т.е. быть объектом с автоматической продолжительностью хранения, а не указателем:
class C
{
public:
C() { }
B b;
что уменьшит уродливое управление памятью, связанное с работой с голыми указателями, подобными этим. Ваш код также будет намного менее подвержен ошибкам.
Или, если вам нужен этот экземпляр B
чтобы быть разделенным между несколькими объектами, вы можете также рассмотреть возможность установки ограничения, которое «экземпляр C
не может существовать без экземпляра B
« (который также вызовет этот класс C
не будет нести ответственность за существование b
):
class C
{
public:
C(B& bRef) : b(bRef) { }
B& b;
Других решений пока нет …