c ++中的out参数通过引用传递

时间:2016-02-04 03:01:36

标签: c++ pass-by-reference

我想在c ++中实现类似的东西。这是一个c#代码。我想尽可能避免原始指针。

class Program
{
    public class Foo
   {
        public int v1;
        public int v2; 
        public Foo(int a, int b)
        {
            v1 =a; v2 =b; 
        }
    };

    public class Bar
    {
        public static void getFoo(out Foo fooObj)
        {
            fooObj = new Foo(1,2);
        }
    };

    static void Main()
    {
        Foo fooObj = null; 
        Bar.getFoo(out fooObj);
        Console.WriteLine("Foo.v1="+fooObj.v1);
        Console.WriteLine("Foo.v2="+fooObj.v2);
    }
}

1 个答案:

答案 0 :(得分:1)

我试图将您的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;
}