2017-07-17 45 views
1

最近在工作中我碰到这个代码来(这是一个人为的例子,但是从根本上做同样的事情):如何根据基类对象中的变量值在派生类中分配变量?

class A 
{ 
public: 
    int foo; 
}; 

class B: public A 
{ 
public: 
    int bar; 
}; 

int main() 
{ 
    A a; 
    a.foo = 1000; 

    B b; 
    A* a_ptr = &b; 
    *a_ptr = a; 
} 

以上,正在发生的事情是,在a所有成员变量被复制到b中的对应成员变量,因为BA派生,并且所有类型为B的对象都保证至少具有与A类型的对象相同的所有成员变量。

在实际的代码中,A有足够的变量,手动分配每个变量都不理想。

经过一段时间的努力之后,我能够理解代码在做什么,但实际上花了我几秒钟的时间似乎就像一面红旗。

有没有另外一种方法来做这个代码可能更容易理解,或更符合C++常见做法?以这种方式查看变量是否很常见?

编辑:有人建议我的问题是可能的重复,并且我问什么对象切片是。这不是对象切片,因为我没有将派生类型的对象分配给基类型的对象。因此,代码中的任何地方都没有“切片”或丢失任何信息。

+1

为什么不重载赋值运算符? – NathanOliver

+0

@Nathan超载要做什么? –

+0

我编辑了我的问题,以澄清这不是对象切片。这与对象切片相反。请仔细阅读代码。 – medman826

回答

3

我会说使用像这样的指针操作来完成赋值在C++中实际上并不常见。

另一种方法是用演员明确地拼出你的意图。我不能完全肯定,如果它是更具可读性:

A a; 
a.foo = 1000; 

B b; 
static_cast<A&>(b) = a; 

根据您的具体需求,但是你可能会带着孩子构造函数家长和适当的构造本身得到更好的服务。这样你就不需要默认构造孩子,然后将父母成员分配为第二步。

+0

尽管这是编写示例更可读的方式,但它没有解决问题。在我看来,这应该是一个评论。 –

+0

我认为你的代码可能会更具可读性,但仍然有点混乱。你觉得使用子构造函数是一种更常见的练习/可读的完成这个任务的方式吗? – medman826

1

如果a_ptr外没有其他目的,只是作为一个临时到A类成员分配给B对象和以后的代码只使用b,我建议创建B一个构造函数的A对象。如果没有别的,它提供比目前更好的可读性。

class A 
{ 
public: 
    int foo; 
}; 

class B: public A 
{ 
public: 
    B(const A &a) 
    { 
     A* a_ptr = this; 
     *a_ptr = a; 
    } 
    int bar; 
}; 

int main() 
{ 
    A a; 
    a.foo = 1000; 

    // Create B with copy of 'a' members 
    B b(a); 
} 
相关问题