【问题标题】:Correct initialization of objects based on return-by-value functions基于按值返回函数正确初始化对象
【发布时间】:2011-11-27 00:44:19
【问题描述】:

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

【问题讨论】:

  • // OK 行很好,为什么需要其他解决方案?
  • @KerrekSB,因为这是我第一次尝试,所以我想知道哪里出了问题。
  • 好的,但是// OK 行是唯一“正确”的做法。不要使用其他的。
  • @KerrekSB,下面Adam Z.给出的解决方案也是错的?如果是,为什么?
  • 这不是错误的,但你永远不会那样使用它。始终正确初始化。 Adam 方法首先默认初始化,然后赋值。最好的情况只是多余且难以阅读;在最坏的情况下,它根本不适用于非默认可构造类型(这包括基础子对象)。

标签: c++ templates functional-programming return-value return-value-optimization


【解决方案1】:

除了通过构造函数之外,您还可以通过以下方式设置字段 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多