我想知道如何用C ++做点什么。我希望能够创建此结构的实例
struct ComplexInstruction : simple_instr
{
bool isHead;
bool isTail;
};
复制simple_instr实例中的所有数据。基本上,我想做这样的事情
ComplexInstruction cInstr = instr; // <- instance of simple_instr
并让cInstr拥有instr中所有数据的副本,而不必复制每个字段(因为它们有很多)。我不知道这是怎么做的,我不认为简单的铸造会起作用。另外,可以反过来吗?即有一个ComplexInstruction实例,并将其转换为simple_instr的实例。我认为这可以通过演员来完成,但我没有很多c ++经验
提前致谢
答案 0 :(得分:8)
在派生类中创建一个构造函数以从基类初始化。
class Base
{
int x;
public:
Base(int a) : x(a){}
};
class Derived : public Base
{
public:
Derived(const Base & B) : Base(B){}
};
请注意,如果您有一个Base的派生对象,那么您实际上有一个基础对象,您可以安全地使用基本副本ctor。
Derived d;
Base b(d);//the parts of Base that are in Derived are now copied from d to b.
//Rest is ignored.
如果你想要更详细,你可以在派生类中编写一个operator =,如
void operator=(const Base & b)
{
Base::operator=(b);
//don't forget to initialize the rest of the derived members after this, though.
}
这完全取决于你想做什么,真的。重要的是:明确。不要让未经初步的成员离开。
答案 1 :(得分:3)
您需要提供一个构造函数,该构造函数接受可转换为const simple_instr&
的参数:
struct simple_instr {
int i;
simple_instr(): i(0) { }
explicit simple_instr(int i): i(i) { }
};
struct ComplexInstruction: simple_instr {
explicit ComplexInstruction(const simple_instr& simple):
simple_instr(simple), isHead(false), isTail(false) { }
bool isHead;
bool isTail;
};
int main() {
simple_instr instr;
ComplexInstruction cInstr(instr);
}
这里我选择了一个显式构造函数,但是根据语义,隐式构造函数也可能是合适的。只有构造函数是隐式的,=
- 样式初始化才能在不进行转换的情况下工作。
答案 2 :(得分:0)
修改:这不是实现此目标的最佳方法,请查看其他答案。
这将满足您的需求。
struct ComplexInstruction : simple_instr
{
ComplexInstruction(const simple_instr &simple)
{
*((simple_instr*)this) = simple;
}
bool isHead;
bool isTail;
};
然后ComplexInstruciton complex = simple;
将调用转换构造函数。 ComplexInstruction的复制构造将this
强制转换为其基类,而=将调用simple_instr's
复制构造函数,默认情况下是一个按位复制。