0

我基本上有以下两类,我使用按值返回函数来创建对象。 在下面的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); 
} 
+0

的'// OK'线是罚款,为什么还需要另一种解决方案? –

+0

@KerrekSB,我想明白什么是错误的,因为这是我的第一次尝试。 – Tin

+0

好的,但“OK”这一行是关于唯一“正确”的做法。不要使用其他的。 –

回答

0

这里是你如何设置字段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; 
} 
+0

谢谢!有效! – Tin