Как передать значение A::a другому классу B::b, если в классе A у меня есть объект класса B

Итак, я создаю проект C++ и столкнулся с новой проблемой. И вопрос в том, как я могу получить значение A::a эффективным способом. Я отмечу, что класс A довольно большой, и я не хочу получать объект класса A. Вот упрощенная версия проблемы:

#include <iostream>
using namespace std;

class A
{
public:
    int a = 0;
    A(int n): b(5)
    {
        a = n; 
    }
private:
    B b;
};

class B
{
public:
    int b = 0;
    B(int n)
    {
        b = n;
    }
    void test()
    {
        // here how i can get the A::a value in most efficent way
    }
};

int main()
{
    A a(10);
    B b(20);
    b.test();
    return 0;
}

Я думал о том, чтобы передать A::a ptr классу B, но нахожу это довольно неубедительным. Мне интересно ваше мнение.

«[...] но мне это кажется довольно отстойным» — почему? А что вам мешает предоставить ссылку на A в качестве параметра для test()?

Fureeish 04.07.2024 17:48

Как бы вы ожидали, что B получит доступ к члену static, не являющемуся A, без указателя, ссылки или значения? И вы беспокоитесь об эффективности, но убедились ли вы, что существует проблема с производительностью?

Stephen Newell 04.07.2024 17:51

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

user12002570 04.07.2024 17:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Передайте свой экземпляр A по ссылке на test:

void test(A & obj)
{
    // now you can access obj.a
}

Если вам нужен доступ к A::a только для чтения (не для изменения), лучше передать константную ссылку, чтобы компилятор обеспечил следующее:

void test(A const & obj)
{
    // now you can access obj.a (for reading only)
}

Использование:

A a(10);
B b(20);
b.test(a);

Другой альтернативой является передача экземпляра по указателю/константному указателю:

void test(A * pObj)  {...} // now you can access pObj->a
// or:
void test(A const * pObj) {...} // now you can access pObj->a (for reading only)

Использование:

A a(10);
B b(20);
b.test(&a);  // note the `&` for taking the address of the object

Однако в C++ обычно рекомендуется отдавать предпочтение ссылкам, а не указателям, когда это применимо. Дополнительную информацию смотрите здесь.

Примечание:
лучше избегать using namespace std; - см.: В чем проблема с «использованием пространства имен std;»?.

Другие вопросы по теме

Похожие вопросы

Как получить MAC-адрес моего локального сетевого интерфейса с помощью сокета Win или удаленного IP-адреса
Использование Open62541 для подключения к серверу не удалось из-за «Не найдено подходящего UserTokenPolicy для возможных конечных точек»
Информация о растровом изображении регулярно возвращает серию одних и тех же неправильных значений, прежде чем возвращать правильные цвета пикселей
Перемещение std::thread со ссылками
Как выбрать правильную перегрузку шаблона функции?
Ошибка EVP_DigestVerifyFinal — ECDSA P-256/SHA-256 с OpenSSL (Libcrypto)
Почему я получаю сообщение об ошибке «Ошибка анализа JSON: тип [json.Exception.type_error.302] должен быть массивом, но является объектом»
Переменная, условно объявленная constexpr в соответствии с выражением ее инициализации
Почему я получаю разные значения от this_thread::get_id() и gettid()?
Исключение при загрузке dll C# во дополнительный поток в C++ MFC