Я не могу поместить строку в переключатель или массив в классе - PullRequest
0 голосов
/ 17 июня 2010

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


};

код компилятора: «строка» не называет тип;

Ответы [ 4 ]

7 голосов
/ 17 июня 2010

"строка" не называет тип

Добавьте #include <string> вверху заголовочного файла, так как он используется в заголовочном файле, он должен быть включен первым. Поскольку string определено в пространстве имен std, вы должны объявить его с помощью std::string name;.

В файле cpp вы можете ярлык с помощью using namespace std;, но рекомендуется всегда ссылаться на квалифицированное имя («квалифицированное имя» включает пространство имен - например, std::string или std::vector).

Я не могу сделать switch(string)

Это верно, переключатели зарезервированы для «интегральных значений». Или значения, которые можно рассматривать как целые (например, символы). Смотри (http://www.cprogramming.com/tutorial/lesson5.html)

Я не могу сделать 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;
}

Если вы действительно хотите сравнить строки, вы должны объединить if () { } else if () { } else { } операторов.

0 голосов
/ 17 июня 2010

Что касается ошибки компилятора, вам нужно поставить строку

#include <string>

в customer.h.Помещение в main.cpp перед включением customer.h будет работать только при компиляции main.cpp, и даже тогда только при условии, что customer.h не будет косвенно включен в более ранний заголовок.Когда вы компилируете customer.cpp, он не будет работать.

Редактировать:

Как отмечает @Mike Seymour, вам нужно везде использовать std::string или добавитьиспользуя объявление using std::string после включения заголовка строки.У меня сложилось впечатление, что ваш код работал до тех пор, пока вы не разбили его на разные файлы, поэтому я предполагаю, что вы уже определили объявление использования в main.cpp.

0 голосов
/ 17 июня 2010
Оператор

A switch работает только с целыми значениями. Интегральные значения включают char, но исключают указатели, а тип литерала, например "1", равен const char *.

Вместо этого используйте '1' и т.п. '1' - это int, который содержит значение символа «1». Одинарные кавычки, а не двойные.

Чтобы сделать это, вам нужно будет включить choice[0] вместо choice, поскольку вы должны получить char.

0 голосов
/ 17 июня 2010

Нет, вы не можете этого сделать - поэтому не делайте этого - используйте вместо этого лестницу if.переключение может быть выполнено только для целочисленных типов, и часто даже тогда используется слишком часто, IMHO.

Ваша третья проблема заключается в том, что случаи не создают область действия:

#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;
        }
    }
}

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

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