Корректная инициализация объектов на основе функций возврата по значению - PullRequest
0 голосов
/ 27 ноября 2011

В основном у меня есть следующие два класса, для которых я использую функции возврата по значению для создания объектов. В приведенном ниже классе Bar у меня есть два объекта-члена класса Foo. Как я мог правильно инициализировать, каждый из этих два объекта отдельно? Ниже я приведу иллюстрацию об отображаемой ошибке компилятора.

template < typename T >
class Foo{

    public:
        Foo( );
        Foo( const Foo<T> & );
        ~Foo();

        friend Foo<T> createFoo1( double, bool );
        friend Foo<T> createFoo2( double, bool );
        friend Foo<T> createFoo3( int );

    private:

        std::vector<T> m_data;

};

template < typename T >
Foo<T> createFoo1( double param1, bool param2 ){
    Foo<T> myFoo;

    // fill myFoo.
    return (myFoo);
}

template < typename T >
class Bar{

    public:

        Bar( );
        Bar( const Foo<T> &, const Foo<T> & );
        Bar( const Bar<T> & );
        ~Bar( );

        friend Bar<T> createBar1( double, bool );

    private:
        Foo<T> m_fooY;
        Foo<T> m_fooX;
};

template < typename T >
Bar<T> createBar1( double param1, bool param2 ){
    Bar<T> myBar( createFoo1<T>(param1, param2), createFoo1<T>(param1, param2) ); //OK
    return (myBar);

    //Bar<T> myBar;
    //myBar.m_fooY(createFoo1<T>(param1, param2)); // <- error C2064: term does not evaluate to a function taking 1 arguments
    //myBar.m_fooX(createFoo1<T>(param1, param2)); // <- error C2064: term does not evaluate to a function taking 1 arguments
    //return (myBar);
}

1 Ответ

0 голосов
/ 27 ноября 2011

Вот как вы можете установить поля m_fooX ​​и m_fooY, кроме как через конструктор:

template < typename T >
Bar<T> createBar1( double param1, bool param2 ){
  Bar<T> myBar;
  myBar.m_fooY = createFoo1<T>(param1, param2);
  myBar.m_fooX = createFoo1<T>(param1, param2);
  return myBar;
}
...