2014-09-12 3 views
-4

main.cpp:Простая программа ввода врезается

#include "Login.h" 

int main() { 
    Login(); 
} 

Login.h:

#ifndef LOGIN_H 
#define LOGIN_H 
#include <string> 
#include <iostream> 

using namespace std; 


class Login 
{ 
public: 
    Login(); 
    string getInput() { 
     return input; 
    } 
    void setInput (string x) { 
     x=input; 
    } 
private: 
    string input; 
}; 

#endif 

Login.cpp:

#include "Login.h" 

Login::Login() 
{ 
    Login lo; 
    lo.setInput("hello"); 
    cout << lo.getInput(); 
}; 

Я просто научиться программировать и я m пытается сделать простую программу для отображения ввода, но для использования класса и объекта для этого, поэтому я могу узнать, как и в конечном итоге сделать программу, которая начинается с логин (следовательно, все имена «login»).
Когда я запускаю это, он просто падает, и я понятия не имею, почему, или как я буду искать решение для этого онлайн, потому что я не знаю даже отдаленно, в чем проблема.

Мой вопрос двоякий:
1. Почему это просто сбой?
2. Как я могу установить параметр в lo.setInput для ввода пользователем? (CIN)

+7

Вы создаете объект 'Login' в своем конструкторе' Login'. Это бесконечный цикл. – Galik

+0

Ха-ха никогда не думает, парни жаль, что я только что понял, что забыл круглую скобку после функции. Спасибо за помощь! Я был очень смущен, но теперь понимаю, что мне вообще не нужен конструктор. –

+1

Вы полностью изменили вопрос, и теперь ответы не имеют никакого смысла! Все еще крушение? Потому что это в заголовке вопроса. – Galik

ответ

2

Для 1 ,

Login::Login() 
{ 
    Login lo; // here 

Рекурсивный вызов конструктора входа бесконечно. Когда Login lo, вызывается конструктор Login::Login. это новый объект Войти и повторить ...

Вероятно, вы хотите:

Login::Login() 
{ 
    setInput("hello"); 
    cout << getInput(); 
} 

Для 2, просто получить вход и звонить с него.

string str; 
getline(cin, str); 
setInput(str); 

Кроме того, C++ слишком сложно для новичков учиться в первую очередь. Я рекомендую вам начать с другого более простого языка, такого как C, python и т. Д.

0

Проблема заключается в том, что ваш конструктор рекурсивно вызывает себя, когда он создает в своем теле локального объекта lo

Login::Login() 
{ 
    Login lo; 
    lo.setInput("hello"); 
    cout << lo.getInput(); 
}; 

Изменить это следующим образом

Login::Login() 
{ 
    setInput("hello"); 
    cout << getInput(); 
}; 

Хотя было бы лучше определите его как (или чтобы компилятор сам определил его)

Login::Login() {} 

и в основной, чтобы написать

Login lo; 

lo.setInput("hello"); 
cout << lo.getInput(); 

функция также setInput недействителен

void setInput (string x) { 
    x=input; 
} 

Там должно быть

void setInput (string x) { 
    input = x; 
} 

Класс может быть определен как

class Login 
{ 
public: 
    Login() = default; 
    Login(const std::string &s) : input(s) {} 

    std::string getInput() const { return input; } 

    void setInput(const std::string &s) { input = s; } 

private: 
    std::string input; 
}; 
0

Вы можете создать экземпляр класса Login и использовать его методы:

int main(void) 
{ 
    Login my_login; 
    cout << my_login.getInput(); 
    return 0; 
} 

Другая возможность заключается в том, чтобы создать static методы в Login класса. Это по сути будет как группировка функций и переменных в одном пакете:

class Login 
{ 
    public: 
    static std::string getLoginText(void) 
    { 
     std::string text; 
     cout << "Enter login ID: "; 
     cin >> text; 
     return text; 
    } 
}; 

int main(void) 
{ 
    std::string login_text; 
    login_text = Login::getLoginText(); 
    cout << "Person " << login_text << " is logged in\n"; 
    return 0; 
} 

Ваш оригинальный main программа путает, хотите ли вы, чтобы создать временный экземпляр класса Login, или вызвать функцию с именем Login. Вышеупомянутые методы делают ваш код более читаемым, явно указывая ваши намерения, а не полагаясь на нетрадиционные методы.

+0

I думаю, что в моем исходном файле была некорректная установка, потому что независимо от того, что я изменил код, он по-прежнему просто прекратился немедленно. Я создал другой файл, используя то, что вы мне дали, но я хочу иметь возможность создать функцию и поместить это определение в другой файл .cpp (чтобы сделать основной очиститель). –

+0

Я обновил код, чтобы отразить изменения, которые я сделал, но у меня все еще есть проблемы. –

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