2016-02-04 4 views
-3

Я хочу добиться чего-то подобного в C++. Это код C#. Я хочу как можно больше избегать указателей на raw.вне параметров в C++ pass по ссылке

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); 
    } 
} 
+0

Любой учебник или учебник на C++ должен объяснить, как использовать ссылочные параметры. – Barmar

+0

@ Barmar Немногие, если таковые имеются, объяснят правильный подход, хотя (в соответствии с ответом Хосе). Многие из них будут использовать необработанные указатели или ссылки на объекты, которые довольно далеки от эквивалентности функции C#. –

ответ

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; 
} 
+0

-1, только код ответа, который ничего не объясняет и по сути просто бросает код в OP, когда они не делали попыток – Tas

+0

@ Я хотел бы, чтобы кто-то сказал мне, где искать, когда я начал на C++. Иногда вы просто хотите научиться делать что-то на языке, и у вас нет времени читать 1000 страниц книги. – Jts

+0

'= nullptr;' избыточен в ваших объявлениях объектов 'unique_ptr'; они начинаются как пустые. ИМХО делает код более запутанным. –

Смежные вопросы