Если вы не можете изменить class A
, вам следует избегать его копирования. Я думаю, что самый безопасный способ сделать это - динамически выделить объект class A
:
void anotherFunction(std::shared_ptr<A> aPtr)
{
// please also note that in your case token is PRIVATE
std::cout << aPtr->token << std::endl;
}
std::shared_ptr<A> aPtr(new A);
std::cout << aPtr->token << std::endl;
anotherFunction(aPtr);
Или, если вы настаиваете на выделении стека, вы должны изменить anotherFunction
подпись на:
void anotherFunction(const A& a)
{
std::cout << a.token << std::endl;
}
для передачи вашего аргумента по константной ссылке (избегайте копирования-конструктора).
Теперь, если вы МОЖЕТЕ изменить свой class A
, вам следует применить правило трех / пяти / нуля , потому что у вас нетривиальный деструктор. Ленивый способ сделать это состоит в том, чтобы просто объявить другие конструкторы как удаленные (тогда, как в вашем примере, вы не можете скопировать ваш объект A
, но у вас также есть гарантия, что никто не будет пытаться это сделать):
class A
{
public:
// for this example purpose I made token PUBLIC, but it is a bad idea in general
char *token;
A()
{
token = GetRandomToken(); // GetRandomToken will return a 'new Char' array
}
~A()
{
if(token != NULL)
{
delete[] token; // it is A's responsibility to delete the memory it created
token = NULL;
}
}
A(const A& other) = delete;
A(A&& other) = delete;
};
Или, если вам не лень, вы можете подумать о том, как скопировать память из указателя token
в одном объекте в другой объект - это зависит от вас, как бы вы это реализовали. Это зависит от требований и реализации GetRandomToken
.