【问题标题】:String array in C++ not working properly?C ++中的字符串数组无法正常工作?
【发布时间】:2010-02-27 17:56:53
【问题描述】:

我正在开发一个类程序,该程序接收从 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,因为我现在只是想让类编译无错误。

编辑澄清:

前两个错误在第一个数组上,后两个错误在第二个数组上,最后两个错误在非数组字符串上。

【问题讨论】:

    标签: c++ arrays string


    【解决方案1】:

    错误信息说明了一切:

    只有静态常量整数数据成员可以在类中初始化

    你不能做你想做的事,你必须将声明和初始化分开,并将初始化移动到构造函数,或者使用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"};
    

    对于另一个数组也是如此。

    【讨论】:

    • 有点困惑...你说在构造函数中初始化?我以前从未这样做过,也不熟悉它的工作原理,请您解释一下吗?
    • 其他注意,该错误仅在两个非数组字符串上,前四个错误针对两个数组(每个数组两个错误)
    • 修补后看起来像是在课外阅读。有点奇怪,如果您不介意向我发送有关其工作原理的消息,我将不胜感激,再次感谢您的帮助!
    • @Jeff:数据必须在类之外定义,因为类声明进入头文件。数据应该在源文件中,而不是头文件中。数据应该以一个且只有一个“目标文件”结束。如果它在标题中,它最终可能会被复制到每个目标文件中,从而浪费大量空间。函数也是一样。在一个类中定义的所有函数都是自动“内联”的,您最终可以在一个大型项目中获得其目标代码的多个副本。
    【解决方案2】:

    我会让你的数组成为const char* 的数组。然后使用std::string 构建您的结果字符串。 C++ 字符串类几乎接受所有操作的 char*。

    "this is a string" 这样的字符串字面量 const char*。没有必要把它变成一个字符串。

    哦,是的,正如另一个答案所说,您必须在类定义之外定义数组的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2012-05-04
      • 2017-01-22
      • 1970-01-01
      • 2014-05-31
      • 2017-03-15
      • 1970-01-01
      相关资源
      最近更新 更多