C++ 有没有一种不用构造函数初始化简单类的简单方法?

C++ 有没有一种不用构造函数初始化简单类的简单方法?,c++,C++,我有一个非常简单的类,如下所示: class MySimpleClass { public: uint16_t m_myInt; String m_myString; String m_myOtherString; MyEnum m_myEnumValue; bool m_myBool; }; 这个类是我无法更改的预编译库的一部分,并且它不提供构造函数。有没有什么方法可以不用做这样的事情就初始化这个类 我并不反对这

我有一个非常简单的类,如下所示:

class MySimpleClass
{
public:
    uint16_t   m_myInt;
    String     m_myString;
    String     m_myOtherString;
    MyEnum     m_myEnumValue;
    bool       m_myBool;
};
这个类是我无法更改的预编译库的一部分,并且它不提供构造函数。有没有什么方法可以不用做这样的事情就初始化这个类

我并不反对这样做,但我很想知道是否有某种初始化语法可以做到这一点


我在C++03中工作,但C++11中的答案也很有趣。

您可以添加一个可用作构造函数的自由函数:

MySimpleClass make_msc(
    uint16_t myInt,
    String myString,
    String myOtherString,
    MyEnum myEnumValue,
    bool myBool)
{
    MySimpleClass msc;
    msc.m_myInt = myInt;
    msc.m_myString = myString;
    msc.m_myOtherString = myOtherString;
    msc.m_myEnumValue = myEnumValue;
    msc.m_myBool = myBool;
    return msc;
}

//Usage:
MySimpleClass msc = make_msc(1,"foo","bar",ENUM_VALUE_YES,true);
或者,您可以使用聚合初始化:

MySimpleClass msc = {1,"foo","bar",ENUM_VALUE_YES,true};//C++03 or C++11
MySimpleClass msc{1,"foo","bar",ENUM_VALUE_YES,true}; //C++11 only

注:该

MySimpleClass msc = {1,"foo","bar",ENUM_VALUE_YES,true};
表单只能在声明中使用,但:

MySimpleClass{1,"foo","bar",ENUM_VALUE_YES,true}
make_msc(1,"foo","bar",ENUM_VALUE_YES,true)

表单可以用在任何需要使用
MySimpleClass

的表达式中,C++11中的统一初始化非常有用

MySimpleClass x {1, "foo", "bar", NUM_VALUE_YES, true};

游戏进行得有点晚了,但我认为一种更优雅的方法是创建一个子类,该子类继承自类
MySimpleClass
,并实现其构造函数以满足您的需要

例如:

class MyImprovedClass : public MySimpleClass
{
public:
    MyImprovedClass(uint16_t myInt, String myString, String myOtherString,
        MyEnum myEnumValue, bool myBool)
    {
        m_myInt = myInt;
        m_myString = myString;
        m_myOtherString = myOtherString;
        m_myEnumValue = myEnumValue;
        m_myBool = myBool;
    }
};
然后使用它,例如:

MyImprovedClass
而言,可以将其作为
MySimpleClass
传递并进行相同的处理。这里的另一个好处是,您可以通过将默认构造函数设置为私有来强制初始化,例如:


另一方面,如果选择为“改进”类实现默认构造函数,则可以在动态分配期间自动初始化该类。如果您选择这样做,您可以添加一个复制构造函数,甚至可以通过添加更多成员函数来扩展(和封装)它的功能,并保持整洁。

您可以将它设置为一个结构(不确定这是否必要),并使用旧c:
MySimpleClass msc={1,string(“foo”),…}IMHO,在这种情况下,最优雅的方法是创建一个从这个类继承的子类,并实现子类的构造函数,不管你选择什么…@EitanT我认为这是对继承的滥用,令人困惑,我看不到任何好处。@EitanT再次强调,所有这些都是对继承的滥用。这在Java中可能看起来很优雅。而动态分配可能是危险的。您当然不能通过基类指针删除派生对象。@但这将是未定义的行为,因为基类没有虚拟析构函数。+1用于自由函数解决方案:如果库供应商决定更改其结构布局,则是唯一远程健壮的解决方案。自由函数是一个极好的解决方案!声明只与C++03格式兼容吗?@ComicSansMS-您知道当结构更改时,声明只与语法发生了什么变化吗?是编译器出错还是某种未定义的行为?@KarlNicoll:要么以错误的顺序默默初始化结构,或者会出现编译错误。如果析构函数需要是虚拟的,并且在基类中没有声明为虚拟的,则可能导致内存泄漏。@Matt对于这种特定情况,我不认为这是危险的,基类很简单,因为在其构造过程中没有进行动态分配。
class MyImprovedClass : public MySimpleClass
{
public:
    MyImprovedClass(uint16_t myInt, String myString, String myOtherString,
        MyEnum myEnumValue, bool myBool)
    {
        m_myInt = myInt;
        m_myString = myString;
        m_myOtherString = myOtherString;
        m_myEnumValue = myEnumValue;
        m_myBool = myBool;
    }
};
MyImprovedClass msc(1, "Foo", "Bar", ENUM_VALUE_YES, true);
class MyImprovedClass : public MySimpleClass
{
public:
    MyImprovedClass(uint16_t myInt, String myString, String myOtherString,
        MyEnum myEnumValue, bool myBool)
    {
        // Implement as above...
    }

private:
    MyImprovedClass() {}
};