Здесь я попытаюсь преобразовать ваш код C# в C++. Однако, как только вы запустите его, вам необходимо провести правильное исследование того, как использовать все функции, которые я использовал здесь. unique_ptr будет в основном управлять «необработанным» указателем для вас (это то, что вы хотите, и оно освободит его, когда оно выйдет за рамки). Я добавил улучшенную версию с использованием вариативных шаблонов, чтобы вы могли передавать любое количество аргументов любого типа для динамического создания вашего класса Foo.
#include <memory>
#include <iostream>
class Foo
{
public:
int v1;
int v2;
Foo(int a, int b)
{
v1 =a; v2 =b;
}
};
class Bar
{
public:
// This is what your function looks like in C++
static void getFoo(std::unique_ptr<Foo>& fooObj)
{
fooObj = std::make_unique<Foo>(1, 2);
}
// This is a better implementation.
template<typename ...Args>
static void getFoo_improved(std::unique_ptr<Foo>& fooObj, Args&&... args)
{
fooObj = std::make_unique<Foo>(std::forward<Args>(args)...);
}
// This is the one used more often in C++ tho.
template<typename ...Args>
static std::unique_ptr<Foo> getFoo_improved_x2(Args&&... args)
{
return std::make_unique<Foo>(std::forward<Args>(args)...);
}
};
int main()
{
std::unique_ptr<Foo> fooObj = nullptr; //nullptr is not needed tho
Bar::getFoo(fooObj);
std::unique_ptr<Foo> fooObj_alt = nullptr; //nullptr is not needed tho
Bar::getFoo_improved(fooObj_alt, 9, 10);
//This is as fast as the other two
auto fooObj_alt_x2 = Bar::getFoo_improved_x2(50, 60);
std::cout << "Foo.v1=" << fooObj->v1 << std::endl;
std::cout << "Foo.v2=" << fooObj->v2 << std::endl;
std::cout << "Foo_alt.v1=" << fooObj_alt->v1 << std::endl;
std::cout << "Foo_alt.v2=" << fooObj_alt->v2 << std::endl;
std::cout << "Foo_alt_x2.v1=" << fooObj_alt_x2->v1 << std::endl;
std::cout << "Foo_alt_x2.v2=" << fooObj_alt_x2->v2 << std::endl;
return 0;
}
Любой учебник или учебник на C++ должен объяснить, как использовать ссылочные параметры. – Barmar
@ Barmar Немногие, если таковые имеются, объяснят правильный подход, хотя (в соответствии с ответом Хосе). Многие из них будут использовать необработанные указатели или ссылки на объекты, которые довольно далеки от эквивалентности функции C#. –