2015-10-19 2 views
0

У меня есть 3 класса под названием Starter, пицца и десерт, который принимает переменное число строк входов, когда объект создается как,инстанцирование нового объекта в CPP

//pizza takes 2 inputs 
Pizza p("margarita","large size"); 

//starter takes 3 inputs 
Starter s("ribs","bbq sauce","small size"); 

Но я хочу, чтобы создать новый объект используя функцию add(), которая берет строку и сопоставляет ее с классом для создания нового объекта. Например,

add(string type) 
{ 
    if(type == "Pizza") 
    { 
    Pizza *p = new Pizza(); 
    } 

    else if(type == "Starter ") 
    { 
    Starter *p = new Starter(); 
    } 
} 

Теперь, мой вопрос заключается в том, как я могу внести вклад в классы по-дружески? Другими словами, я думал, что пользователь может записывать все входы класса в одну строку и не использовать cin для каждого входа.

Скажем, мы получаем пиццу, то, что я не хочу,

cout<<"What type of pizza"; 
cin>>*input* <<endl; 
cout<<"What size"; 
cin>>*input* <<endl; 

Я хочу, чтобы написать все входы в одну линию, как,

вход «Маргариту», «большой»

+0

Хотите ли вы принимать входные данные точно из stdin? Не из файлов или что-то еще? – maxteneff

+0

это будет простой синтаксический анализ. с использованием 'getline()' – Minato

+0

на данный момент я использую getline для получения каждого входа отдельно, могу ли я получить два входа вместе, используя один getline()? @MubashirHanif –

ответ

1

Кредит для @MuratKarakus. только расширяя свой ответ, чтобы поддержать этот тип входа "margarita","large"

// Read complete string. 
// Eg. margarita large 
string order; 
getline(cin, order); 

std::replace(order.begin(), order.end(), ',', ' '); // this'll replace all ',' with space 

// It automatically parses string based on space 
istringstream is(order); 
string meal, size; 
is >> meal; 
is >> size;  

-------- обновление

код ниже, чтобы поддержать ввод как "1/2 margarita 1/2 bbq delux", "large"

// Read complete string. 
// Eg. margarita large 
string order; 
getline(cin, order); 
std::replace(order.begin(), order.end(), ' ', '-'); // this'll replace all space with '-' 
std::replace(order.begin(), order.end(), ',', ' '); // this'll replace all ',' with space 
// It automatically parses string based on space 
istringstream is(order); 
string meal, size; 
is >> meal; 
std::replace(meal.begin(), meal.end(), '-', ' '); // this'll replace all '-' with space 

is >> size;  
+0

Код работал, но в вашей замене, все равно, чтобы избавиться от пространства? Поскольку я также хотел бы использовать такие материалы, как «1/2 margarita 1/2 bbq delux», «большой» @MubashirHanif –

+0

@SafwanUllKarim и для полного решения, вы должны дать мне полный формат входного пользователя. для ввода '" 1/2 margarita 1/2 bbq delux "," large "' like this, вы можете сделать wana do dome thing line 2 way, заменяя сначала 'replace 'все пробелы известным символом .. скажем, '. или -', затем используйте потоки, чтобы вернуть части ввода и проанализировать их соответственно. Я обновляю свой ответ, чтобы поддержать ваш текущий спецификатор ввода. – Minato

+0

Еще раз спасибо! вы большая помощь @MubashirHanif –

2
// Read complete string. 
// Eg. margarita large 
string order; 
getline(cin, order); 

// It automatically parses string based on space 
istringstream is(order); 
string meal, size; 
is >> meal; 
is >> size; 
Смежные вопросы