0
#include <boost/scoped_ptr.hpp>

class classA
{
protected:
    struct StructB
    {
        int iAge;
        double dPrice;
    };

    boost::scoped_ptr<StructB> m_scpStructB;

public:
    classA(int age, double price)
        : m_scpStructB(new StructB)
    {
        m_scpStructB->iAge = age;
        m_scpStructB->dPrice = price;
    }

    /* DO NOT COMPILE  <= second block
    classA(int age, double price)
        : m_scpStructB(new StructB),
          m_scpStructB->iAge(age),
          m_scpStructB->dPrice(price)
    {}
    */

};

Question1> 我发现我无法使用第二个代码块来初始化智能指针指向的结构成员。这是我们无法做到的一般c ++规则吗?

如果第一个问题的答案是“你做不到”,请放弃这个问题。

Question2> 据我所知,初始化列表的赋值顺序是基于成员变量定义的顺序。假设可以通过智能指针初始化成员变量。您如何保证顺序以便始终首先初始化智能点?

4

1 回答 1

1

如果您不需要 StructB成为聚合/POD 类型,那么也只需给它一个构造函数:

#include <boost/scoped_ptr.hpp>

class classA
{
protected:
    struct StructB
    {
        StructB(int age, double price) : iAge(age), dPrice(price) { }

        int iAge;
        double dPrice;
    };

    boost::scoped_ptr<StructB> m_scpStructB;

public:
    classA(int age, double price) : m_scpStructB(new StructB(age, price)) { }
};

否则,您可以只使用工厂函数,使其保持 POD 类型:

#include <boost/scoped_ptr.hpp>

class classA
{
protected:
    struct StructB
    {
        int iAge;
        double dPrice;

        static StructB* make(int age, double price)
        {
            StructB* ret = new StructB;
            ret->iAge = age;
            ret->dPrice = price;
            return ret;
        }
    };

    boost::scoped_ptr<StructB> m_scpStructB;

public:
    classA(int age, double price) : m_scpStructB(StructB::make(age, price)) { }
};
于 2012-07-11T18:32:15.783 回答