Итак, я создаю проект 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, но нахожу это довольно неубедительным. Мне интересно ваше мнение.
Как бы вы ожидали, что B
получит доступ к члену static
, не являющемуся A
, без указателя, ссылки или значения? И вы беспокоитесь об эффективности, но убедились ли вы, что существует проблема с производительностью?
Данный код даже не компилируется . Всегда публикуйте правильный минимально воспроизводимый пример, чтобы людям не приходилось вносить изменения.
Примечание: В чем проблема с «использованием пространства имен std;»?
Передайте свой экземпляр 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;»?.
«[...] но мне это кажется довольно отстойным» — почему? А что вам мешает предоставить ссылку на
A
в качестве параметра дляtest()
?