2013-11-08 3 views
0

Мне интересно, почему это не признает, что вектор пуст и снабжен вектором pStack с двойным запуском? Объект программы просто просто поставить вектор стека с 50 в первый раз, когда он пуст. Затем, как только он будет отправлен с начальной суммой, он должен вычесть с помощью пользовательского ввода (ставка). Тогда, так как его вектор переносит старую сумму во второй раз, поэтому ее можно вычесть с помощью пользовательского ввода ставки снова.Почему не пустой вектор?

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 


class Bet 
{ 
public: 
    void set_stack(double n); 
    void set_bet(double n); 
    double analyze(); 
    double get_stack(); 
    double get_bet(); 

private: 
    double pCount; 
    double bet; 
}; 

double Bet::analyze() 
{ 
    double p = pCount; 
    double b = bet; 
    double z = p - b; 
    return z; 
} 

void Bet::set_bet(double n) 
{ 
    bet = z; 
} 

double Bet::get_bet() 
{ 
    return bet; 
} 

void Bet::set_stack(double n) 
{ 
    pCount = n; 
} 

double Bet::get_stack() 
{ 
    return pCount; 
} 


double start = 50; // Start needs to go inside of pStack 
double bbet; 
vector<double> pStack(1); 


int main() 
{ 
    bool con = true; 
    while(con){ 
     if(pStack.empty()){ 
     pStack.push_back(start); // pStack should be supplied with start when empty 
     } 

     double adjst = pStack[0]; 

     Bet rr; 
     rr.set_stack(adjst); 
     pStack.clear(); 
     cout << "Enter min 1 Bet: "; 
     cin >> bbet; 
     rr.set_bet(bbet); 

     double aStack = rr.analyze(); 
     pStack.push_back(aStack); 
     rr.set_stack(aStack); 
     double newStack = rr.get_stack(); 

     cout << "Stack: " << newStack << endl; 
     cout << "Bet: " << bbet << endl; 
    } 

    system("pause"); 
    return 0; 
} 
+3

Отсутствие отступов делает его более трудным, чем это необходимо, чтобы прочитать код. –

+4

Вы явно создаете непустой вектор, а затем спрашиваете людей, почему он не пуст ... Почему вы использовали этот '(1)' в качестве инициализатора для вашего 'pStack'? – AnT

ответ

3

Вы используете конструктор заполнения. Эта строка инициализирует вектор для 1 элемента по умолчанию.

vector<double> pStack(1); 

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

vector<double> pStack; 
+3

«Вы также можете использовать пустую скобку, но они избыточны». Это не было бы излишним; Это было бы неправильно. Он объявит функцию, называемую 'pStack', которая вернула' vector ' и не приняла никаких параметров. Правильное объявление точно так же, как и у вас. – WhozCraig

+0

В качестве альтернативы используйте конструктор заполнения с начальным значением: 'vector pStack (1, start);' –

+0

Интересный Тристан. Никогда не знал, что существует такая вещь, как конструктор заполнения для вектора. –

4
vector<double> pStack(1); 

Вы инициализирует свой вектор с его имея начальный размер 1, поэтому ваш pStack.empty() проверка возвращает false.

Сделайте это вместо этого, чтобы его исходное состояние было пустым.

vector<double> pStack; 

Кроме того, удалите empty() чек и поднять ваш push_back за пределами цикла.

bool con = true; 
pStack.push_back(start); 

while(con){ 
    ... 

Возможно, вы также захотите пересмотреть свое использование глобальных переменных. Насколько я вижу, вы можете просто положить start, bbet и pStack внутри main().

+0

Спасибо, но теперь он говорит, что векторный индекс выходит за пределы диапазона –

+0

@RoadRash, тогда вы логично используете свой стек с самого начала. Этот ответ правилен при правильном объявлении пустого начального стека, и вы должны изучить, как вы используете свой стек для возможного нерассмотренного условия ожидания. – WhozCraig

+0

Спасибо, действительно помог мне. –

2

Когда вы определяете вектор pStack, вы используете конструктор, который принимает целое число, которое представляет количество элементов для выделения.

vector<double> pStack(1); 

В результате ваш вектор будет иметь 1 инициализированный по умолчанию элемент.

Чтобы создать пустой вектор это сделать:

vector<double> pStack; 
+0

«Количество элементов для распределения» обычно означает емкость, а не размер.Этот ctor фактически создает элементы. Я думаю, вы должны это прояснить. – Antimony

Смежные вопросы