为什么我的打印功能什么都不打印?

时间:2015-12-31 09:40:46

标签: c++

这里是一段代码:

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
  • 打印6 6 6 ... 6(20次)

我实际上什么都不是。它确实编译但它没有打印任何东西,我不明白为什么。

请帮忙。

2 个答案:

答案 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);
}