2014-01-25 35 views
0

对于一个assigment,我必须实现一个C++构造函数,它以另一个类的对象数组作为参数。我无法理解以下:请帮我理解这个基本的C++类实现

A.H:

class a { 
public : 
    a(const b &bb); 
private : 
    b bb_[10]; 
}; 

a.cc:

#include "a.h" 
#include "b.h" 
a::a(const b &bb) { 
    *bb_ = bb; 
} 

看来工作,但是这是怎么回事呢?目标是将bb_初始化为b类10个对象的数组。 b类有一个默认的构造函数。

谢谢!

+1

哪个特定部分不清楚?为了回答这个问题,我们必须知道哪一部分你不明白。 –

+0

你在这里做什么:传递一个参数(引用)的单个对象,然后将一个ob对象拷贝到bb_ [0](除非b有一个非拷贝拷贝构造函数)。阵列中的其他9个位置仍未使用。 – deviantfan

+0

这里没有初始化。 –

回答

0

上面的代码可以编译,但我不确定逻辑是否正确。

你看,行*bb_ = bb;只有填充数组的第一个元素。当你将一个指针引用到一个数组时,你会得到它的第一个元素(在索引0处)。

你想要做的是填补了整个阵列,而不只是第一个元素:

const int SIZE = 10; // please use constants for array sizes 

class a { 
public : 
    a(const b (&bb)[SIZE]) ; 
private : 
    b bb_[SIZE]; 
}; 

a::a(const b (&bb) [SIZE]) { 
    for (int i = 0; i < SIZE; i++) 
     bb_[i] = bb[i]; 
} 

如果你不喜欢在构造函数中的循环,你可以使用memcpy()功能会从字面上bb复制字节的内存到您的数组:

a::a(b (&bb) [SIZE]) { 
    memcpy(bb, bb_, sizeof(bb)); 
} 

另一种方法是使用更安全的替代方法:std::array

#include <array> 

const int SIZE = 10; 

class a { 
public : 
    a(std::array<b, SIZE> bb); 
private : 
    std::array<b, SIZE> bb_; 
}; 

a::a(std::array<b, SIZE> bb) { 
    bb_ = bb; 
} 
+0

谢谢。我的印象是,我可以将内部数组bb_的“地址”更改为bb(参数)中的一个。 – user3020233

+0

@ user3020233通过取消引用(使用'*'),您无法访问地址。相反,您可以直接访问其参考元素。 'bb_'是一个指向数组的指针,'* bb_'是'bb_'指向的数组的第一个元素。 – Oleksiy

+0

如果bb_是一个指向数组的指针,是不是可以改变它,所以它指向数组bb呢?我尝试了一切,但无法弄清楚如何做到这一点。谢谢。 – user3020233

0

*bb_只是bb_[0]这样的a构造是仅仅复制指定b其内部的10 b阵列的第一个单元。

如果你想在所有的内部数组bb_的10个细胞复制bb,做到这一点:如果你要的10 b数组复制到内部数组bb_

std::fill(bb_, bb_ + 10, bb); 

,你需要声明参数bb作为构造这样一个数组:

a::a(b bb[10]) { 
    std::copy(bb, bb + 10, bb_); 
} 

最后,如果你要复制的10 b到数组的地址,然后bb_应该简单地定义为指针,并在构造函数中指定的参数bb应该改变,以及成为一个指针:

啊:

class a { 
public : 
    a(const b* bb); 
private : 
    const b* bb_; 
}; 

a.cc:

#include "a.h" 
#include "b.h" 
a::a(const b* bb) { 
    bb_ = bb; 
} 
+0

对不起,我应该更具体。我试图让内部数组bb_指向在参数列表(bb)中传递的数组。没有办法将bb_的地址更改为bb而不复制所有数组元素? – user3020233

+0

然后'bb_'应该是一个不是数组的指针。 – user3146587