使用 Class 指针创建动态数组

Creating a dynamic array with Class Pointers

我在作业的特定部分遇到问题,要求创建一个函数,该函数将数字存储在数字数组(class)中。

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;

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

编辑:我知道我的代码有很多奇怪的地方。使用字符串和使用数组而不是向量的必要性都是对我的作业的限制。

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

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

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

您可以为您的 Numbers class 实施全局 operator>>,例如:

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 决定如何最好地流式传输自己:

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