我不能将字符串放在开关中,也不能放在类中的数组中

时间:2010-06-17 16:57:58

标签: c++ class object

好的,我在我看来制作了一个非常大的文件,所以我想将它分成几个文件以获得更清晰的代码。所以我有我的主.cpp文件和两个持有我的类的头文件。好吧头文件没有字符串,它很容易不会让步。我在我的.cpp文件中调用库,甚至在我的头文件中尝试过。

我遇到的另一个问题是使用字符串来使开关起作用,原因是如果我在开关中使用整数,如果用户输入一个字母字符,程序进入无限循环。

string choice;

switch (choice)
{

  case "1" : 
  //... 
  break;
  case "2" : 
  //... 
  break;
}

我最后一个问题是当我在一个错误的情况下创建一个对象时。说对象的交叉初始化。

string choice;

switch (choice)
{

  case "1" : 
  Class object; 
  break;
  case "2" : 
  //... 
  break;
}

以下是我遇到的标题问题。 ///main.cpp////

#include <iostream>
#include <string>
#include "customer.h"

//// customer.h ////

class Customer
{

string name;      
string meal;
// method

public:
int Choose_cCustomer()
{
 int a;   
 a = rand () % (10 - 1 + 1) + 1;
 return a;   


};

编译器代码:'string'没有命名类型;

4 个答案:

答案 0 :(得分:7)

  

“string”未命名类型

在头文件的顶部添加#include <string>,因为它在头文件中使用,必须先包含它。由于stringstd命名空间中定义,因此您应该使用std::string name;声明它。

在cpp文件中,您可以使用using namespace std;快捷方式,但最佳做法是始终引用限定名称(“限定名称”包括命名空间 - 例如std::string或{{ 1}})。

  

我做不到std::vector

这是正确的,开关是为“整数值”保留的。或者可以视为整数的值(例如字符)。见(http://www.cprogramming.com/tutorial/lesson5.html

  

我做不到switch(string)

这是正确的。 case 1: Class object;不能直接在其中声明变量。但是,有一个快速的解决方法:

case

如果确实想要比较字符串,则应链接case 1: { // Notice the added braces, to create a 'scope' for which to define object. Class object; // ... use object as normal ... break; } 语句。

答案 1 :(得分:0)

不,你做不到 - 所以不要这样做 - 改用if-ladder。交换机只能在整数类型上执行,并且即使在那时也经常被过度使用,恕我直言。

您的第三个问题是因为案例没有创建范围:

#include <string>
using namespace std;

int main() {
    int n = 0;
    switch( n ) {
        case 0: 
           string s1;

        case 1: 
           string s2;

    }
}

如果n的值为1,则跳过s2的创建,这在C ++中是非法的。您需要自己设置范围:

int main() {
    int n = 0;
    switch( n ) {
        case 0: {
           string s1;
        }
        case 1: {
           string s2;
        }
    }
}

但我应该说,我认为任何包含多个陈述,加上可能是休息的情况都是不好的做法。

答案 2 :(得分:0)

switch语句仅适用于整数值。积分值包括char但排除指针,"1"等文字的类型为const char *

相反,请使用'1'等。 '1'int,其中包含字符值“1”。单引号,而不是双引号。

为了做到这一点,您必须启用choice[0]而不是choice,因为您必须获得char

答案 3 :(得分:0)

关于编译器错误,您需要放行

#include <string>
在customer.h中

。在包含customer.h之前将它放在main.cpp中只能在编译main.cpp时工作,即便如此,只有提供的customer.h不会被前面的头部间接包含。编译customer.cpp时,它将失败。

修改

正如@Mike Seymour指出你需要在任何地方使用std::string或在包含字符串标题后添加使用声明using std::string。我得到了你的代码工作的印象,直到你把它分成不同的文件,所以我假设你已经在main.cpp中进一步使用了使用声明。