使用类指针创建动态数组

时间:2015-06-16 01:45:37

标签: c++ dynamic-arrays

我遇到了一项任务的特定部分问题,要求创建一个能够在Numbers(该类)数组中存储和存储数字的函数。

class Number {
public:
    // Make a number with value 0
    Number();
    // Make a number with value val
    Number(int val);
protected:
    string value;
}

Number::Number() {
    value = "0";
}

Number::Number(int val) {
    value = to_string(val);
}

/*
* Ask user how many numbers they want entered and store the numbers in an array of Numbers.
* Set length parameter to # of numbers entered and return the array pointer to the caller.
*/

Number* getNumbersFromUser(int& length) {
    cout << "How many number would you like to enter?";
    cin >> length;
    Number *numbers = new Number[length];
    for (int i = 0; i < length; i++) {
        cout << "Enter the number value ";
        cin >> numbers[i];
    }
}

int main() {
    int length;
    Number* numbers = getNumbersFromUser(length);
    reverseAllNumbers(numbers, length);
    cout << "All the numbers in reverse are:" << endl;
    for (int i = 0; i < length; i++) {
    numbers[i].print();
    }
    delete[] numbers;
    cout<<endl;

似乎特别要求我使用动态数组,但我不明白我如何让用户输入Number类型的东西,因为编译器说这是不允许的。请忽略reverseAllNumbers功能,我相信我已经找到了。

编辑:我知道我的代码有很多奇怪的东西。字符串的使用以及使用数组而不是向量的必要性都是我赋值的约束。

2 个答案:

答案 0 :(得分:0)

您可以为operator>>课程实施全局Numbers,例如:

std::istream& operator>>(std::istream &strm, Number &n)
{
    int value;
    strm >> value; // or however you need to read the value...
    n = Number(value);
    return strm;
}

或者:

class Number {
    //...
    friend std::istream& operator>>(std::istream &strm, Number &n);
};

std::istream& operator>>(std::istream &strm, Number &n)
{
    strm >> n.value; // or however you need to read the value...
    return strm;
}

通常在覆盖全局流操作符时,应该实现成员方法来处理实际的流,然后在全局运算符中调用这些方法。这允许班级决定如何最好地自己流式传输:

class Number {
    //...
    void readFrom(std::istream &strm);
};

void Number::readFrom(std::istream &strm)
{
    strm >> value; // or however you need to read the value...
}

std::istream& operator>>(std::istream &strm, Number &n)
{
    n.readFrom(strm);
    return strm;
}

如果您不允许定义自定义operator>>,您仍然可以使用readFrom()方法,至少:

for (int i = 0; i < length; i++) {
    std::cout << "Enter the number value ";
    numbers[i].readFrom(std::cin);
}

答案 1 :(得分:-2)

您可能必须在函数number的末尾返回getNumbersFromUser以避免内存泄漏。 其次,行cin >> number[i]表示您正在输入Number类型的变量,这是不允许的。它只允许原始数据类型(int,char double等)或某些内置对象(如字符串)。要在您自己定义的数据类型中获取输入,您必须重载流提取运算符>>,或者您可以编写一个成员函数,该函数接受类数据成员中的输入并调用该函数。例如,如果您的功能类似于

void Number::takeInput () {
      cin >> val; 
}

现在进入功能并写number[i].takeInput()而不是cin >> number[i]