2015-06-16 2 views
-1

У меня возникают проблемы с определенной частью задания, требующей создать функцию, которая будет принимать и хранить числа в массиве 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, я полагаю, что у меня это получилось.

EDIT: Я понимаю, что с моим кодом много чего-то странного. Использование строки и необходимость использования массива вместо вектора - все ограничения, которые были помещены в мое назначение.

+0

Почему ты сохраняя число как 'std :: string'? Вы пытаетесь реализовать какой-то класс с большим целым числом для обработки значений, превышающих 64 бит? Если нет, тогда вы должны использовать 'int',' long long int' или '__int64' вместо' std :: string'. –

+0

Это были ограничения, заданные для назначения, которые я использую для строки. Я понимаю, что с этим ограничением было бы намного легче. –

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

Уступка специально спросила, что я использую массив. Я ценю помощь, но может ли быть другой метод? Использование глобального оператора - это тема, которая еще не охвачена. –

+0

Если задание * требует * необработанного массива, то пусть будет так. Но это не меняет того, что я сказал о реализации пользовательского 'operator >>' для вашего класса для обработки потоковой передачи. Если вы еще не включили перегрузку оператора, вы все равно можете использовать метод readFrom(), который я показал: 'numbers [i] .readFrom (cin);' –

-2

Возможно, вам придется вернуть number в конце функции getNumbersFromUser, чтобы избежать утечки памяти. Во-вторых, строка cin >> number[i] означает, что вы принимаете входные данные в переменной типа Number, которая не допускается. Это разрешено только для примитивных типов данных (int, char double и т. Д.) Или некоторых встроенных объектов, таких как строки. Чтобы принять ввод в свой собственный тип данных, вам придется перегружать оператор извлечения потока >> или вы можете написать функцию-член, которая принимает входные данные в члене данных класса и вызывает эту функцию. Например, если ваша функция как

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

Теперь идите в функции и писать number[i].takeInput() вместо cin >> number[i].

Смежные вопросы