Строковый массив в C ++ не работает должным образом? - PullRequest
2 голосов
/ 27 февраля 2010

Я работаю над программой для класса, которая принимает число от 0 до 9999 и выплевывает значение слова (т. Е. 13 будет отображаться как "тринадцать" и т. Д.) массив по какой-то причине.

Вот класс на данный момент:

#include<iostream>
#include<string>

using namespace std;

class Numbers
{
    private:

        int number;

        string lessThan20[ ] = {"zero", "one", "two", "three", "four", "five", 
            "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
            "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
        string incrementsOfTen[ ] = {"twenty", "thirty", "fourty", "fifty", "sixty",
            "seventy", "eighty", "ninety"};
        string hundred = "hundred";
        string thousand = "thousand";

    public:
        Numbers(int newNumber)
        {
            setNumber(newNumber);
        }

        void setNumber(int newNumber)
        {
            if(newNumber < 0 || newNumber > 9999)
            {
                cout << "Number cannot be negative or larger than 9999, defaulted to zero." << endl;
                number = 0;
            }
            else
            {
                number = newNumber;
            }
        }

        int getNumber()
        {
            return number;
        }
};

Моя проблема связана с двумя строковыми массивами, я получаю эти ошибки от моего компилятора:

1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(19) : error C2059: syntax error : '{'
1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(19) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(22) : error C2059: syntax error : '{'
1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(22) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(24) : error C2864: 'Numbers::hundred' : only static const integral data members can be initialized within a class
1>f:\college work\csis 297\assignment 4\chapter 11-1\chapter 11-1\11-1.cpp(25) : error C2864: 'Numbers::thousand' : only static const integral data members can be initialized within a class

Я уверен, что если я потрачу больше времени на строки с одной переменной, я смогу это выяснить, но большую часть часа я потратил на поиск того, что я делаю неправильно на двух массивах, на любые советы Информация будет оценена.

Заранее спасибо.

PS: Нет, main пока нет, еще не дошел, у моей программы сейчас пустое main, так как я сейчас просто пытаюсь сделать так, чтобы класс без ошибок компилировался.

РЕДАКТИРОВАТЬ для уточнения:

Первые две ошибки относятся к первому массиву, вторые две ошибки - ко второму массиву, а последние две ошибки - к строкам, не относящимся к массиву.

Ответы [ 2 ]

5 голосов
/ 27 февраля 2010

В сообщении об ошибке сказано все:

внутри класса могут быть инициализированы только статические интегральные члены-данные

Вы не можете делать то, что хотите, вы должны разделить объявление и инициализацию и переместить инициализацию либо в конструктор, либо использовать static const, и поместить инициализацию вне класса. Это предпочтительно, так как значения на самом деле не меняются или зависят от экземпляра:

class Numbers
{
    private:
        static const string lessThan20[];
        // …
};

string const Numbers::lessThan20[ ] = {"zero", "one", "two", "three", "four", "five", 
            "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
            "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};

И аналогично для другого массива.

1 голос
/ 27 февраля 2010

Я бы сделал ваши массивы массивами const char*. Затем используйте std::string для построения ваших строк результатов. Строковый класс C ++ принимает char * почти для каждой операции.

Строковый литерал типа "this is a string" равен a const char*. Нет необходимости превращать его в строку.

И да, как говорится в другом ответе, вы должны определить значения ваших массивов вне определения класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...