Как получить доступ к указателю класса, указывающего на другой указатель класса, указывающего на значение

Я работаю над проектом, который имеет высокую многопоточность между определенными классами, поэтому мне нужно получить доступ к значению в определенном классе, и я хочу использовать указатели для доступа к нему, поэтому то, что я делаю, в основном описано ниже:

У меня есть 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);
}
}

Когда я запускаю программу, мой вывод был неверным. Я получил некоторые значения, равные нулю, а другие являются отрицательными значениями, поэтому я думаю, что второй указатель указывает на неправильную ячейку памяти? поэтому мой вопрос, как правильно получить доступ к этому значению. Я пытаюсь написать код, похожий на мой код для простоты, потому что код слишком велик.

Заранее благодарны за Вашу помощь.

-2

Решение

В опубликованном вами упрощенном псевдокоде вы получаете доступ к 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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]