使用 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);
}
我在作业的特定部分遇到问题,要求创建一个函数,该函数将数字存储在数字数组(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);
}