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() {}
};