最简单和最可靠的方法是简单地使用转换构造函数:
class Rectangle
{
public:
Rectangle(uint8_t l, uint8_t h) : length(l), height(h) {};
// ...
};
这应该是您的首选方法,直到由于某种原因这是不可能的。
除此之外,下一个最好的事情就是简单地进行成员初始化:
Rectangle rect;
rect.width = 20;
rect.height = 40;
如果无法执行上述操作,并且如果所讨论的对象是标准所指的“聚合”(基本上是 POD),则可以使用如下初始化器:
Recatagle rect = {10,20};
这样做时,您必须记住,成员将按照它们在类中声明的顺序进行初始化。如果你改变声明的顺序,你会像上面那样破坏每个初始化。这是非常脆弱的。出于这个原因,我将这种结构的使用限制在所讨论的类高度本地化的情况下(如单个翻译单元中的帮助类),并且我记录了保持声明顺序完整的需要。
编辑评论:
在您尝试将字符串复制到您的类中或指向任何类型数据的指针的情况下,您将需要进行深层复制:
class Gizmo
{
public:
Gizmo(const char* str) : str_(0)
{
str_ = new char[strlen(str)+1];
strcpy(str_,str);
}
};
请注意上面的代码的笨拙和脆弱。这里有很多可能出错的地方。其中最重要的是忘记delete
str_
何时Gizmo
被销毁,丑陋和似乎缺乏必要new
的char
字符串首先,一次过去的错误......名单还在继续。由于这些原因,最好完全避免使用原始指针并使用智能指针(即unique_ptr
,shared_ptr
等)或集合类。在这种情况下,我会使用 a std::string
,它可以被认为是一个集合类:
class Gizmo
{
public:
Gizmo(const char* str) : str_(str) {};
private:
std::string str_;
};
随意将其转换为与 a 一起使用u_char*
,并通过验证源指针是否有效来增加鲁棒性。