这里是一段代码:
using namespace std;
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
// CLASS: SimpleArray
template <class T> class SimpleArray {
private:
vector<T> array;
public:
SimpleArray ();
SimpleArray (int sz);
SimpleArray (int sz, T elem);
void print (void);
};
// END OF CLASS
// CLASS CONSTRUCTORS
// Non-parameterized constructor
template<class T> SimpleArray<T>::SimpleArray() {
vector<T> array(0);
}
// Empty array of size sz
template<class T> SimpleArray<T>::SimpleArray(int sz) {
vector<T> array(sz);
}
// Array of elements elem of size sz
template<class T> SimpleArray<T>::SimpleArray(int sz, T elem) {
vector<T> array(sz);
for (int i = 0; i < sz; i++)
array.push_back(elem);
}
// CLASS METHODS
template<class T> void SimpleArray<T>::print (void) {
for (int i = 0; i < array.size(); i++)
cout << array[i] << " ";
}
int main(int argc, const char * argv[]) {
// insert code here...
SimpleArray<int> a(20, 6);
a.print();
return 0;
}
因此,正如我所料,这段代码应该执行以下操作:
SimpleArray<int>
类型的对象,其中创建一个整数向量;在我的例子中,它是一个20个元素的向量,每个元素都是6 我实际上什么都不是。它确实编译但它没有打印任何东西,我不明白为什么。
请帮忙。
答案 0 :(得分:2)
你的建造者没有做你认为他们做的事。您在每个变量中声明了局部变量array
,这会隐藏数据成员array
。当然,当构造函数退出时,对该局部变量的所有修改都消失了,并且首先没有对array
成员执行任何操作。
要初始化类成员,请使用构造函数的mem-initializer-list:
template<class T> SimpleArray<T>::SimpleArray() //nothing needed here
{}
template<class T> SimpleArray<T>::SimpleArray(int sz) : array(sz)
{}
// Array of elements elem of size sz
template<class T> SimpleArray<T>::SimpleArray(int sz, T elem)
{
for (int i = 0; i < sz; i++)
array.push_back(elem);
}
请注意,在第三个构造函数中,您首先将(局部变量)array
初始化为大小sz
,然后将额外的sz
元素推入其中。您最终会得到一个大小为2 * sz
的向量,其中第一个sz
元素将默认构建,第二个sz
元素将是elem
的副本。我假设这不是你想要的,所以我在上面的第三个构造函数中省略了初始化为非零的大小。
此外,请注意std::vector
有一个构造函数,它将与第三个构造函数执行相同的操作,但效率更高:
// Array of elements elem of size sz
template<class T> SimpleArray<T>::SimpleArray(int sz, T elem) : array(sz, elem)
{}
答案 1 :(得分:-1)
template<class T> SimpleArray<T>::SimpleArray(int sz, T elem) {
vector<T> array(sz); // <<<<<<< new variable, not a class member!
for (int i = 0; i < sz; i++)
array.push_back(elem);
}