Проблема C ++ с extern - неопределенная ссылка

main.cpp:

bool lgstatus;
User currentUser;
//...
int main(){ //... }

loginwindow.cpp:

void LoginWindow::on_cmdCreate_clicked()
{
  extern bool lgstatus;
  extern User currentUser;
  //...
  currentUser.setMail(ui->txtAccountMail->text().toStdString());
  currentUser.setName(ui->txtAccountName->text().toStdString());
  currentUser.setPassword(ui->txtAccountPassword->text().toStdString());
  //...
  lgstatus = true;
}

Мой класс User имеет 3 функции. Каждый из них принимает в качестве аргумента строку. Я не знаю что не так. Компилятор не жалуется, если я изменю lgstatus, но мой currenUser.

Класс :

class User
{
public:
    User();
    User(const std::string &name, const std::string &password);
    User(const std::string &name, const std::string &password, const std::string &mail);

    void setName(const std::string &name);
    void setMail(const std::string &mail);
    void setPassword(const std::string &password);

private:
    std::string user_name;
    std::string user_password;
    std::string user_mail;
};

Функции "set" просто передают свой аргумент user_name и т. Д. Я не думаю, что было бы необходимо их также показывать.

Ошибки:

  • неопределенная ссылка на 'User :: setMail (std :: string const &)'

  • неопределенная ссылка на 'User :: setName (std :: string const &)'

  • неопределенная ссылка на `User :: setPassword (std :: string const &) '

Что я сделал не так?


person Davlog    schedule 05.06.2013    source источник
comment
Вы компилируете и связываете User.cpp (или любой другой файл, содержащий реализацию класса User) вместе с другими исходными файлами?   -  person    schedule 05.06.2013
comment
У вас есть включаемый файл, чтобы показать полное определение класса User?   -  person unxnut    schedule 05.06.2013
comment
Вам нужно показать определение вашего класса User. С помощью простых методов набора вы, вероятно, захотите определить inline, и у вас, вероятно, есть только объявления методов.   -  person Scott Jones    schedule 05.06.2013
comment
Как вы связываете свою программу?   -  person Amadeus    schedule 05.06.2013
comment
Но не в вопросе выше. Если вы добавили немного больше кода, мы могли бы подтвердить, была ли проблема #include или проблема с компоновщиком.   -  person Michael Dorgan    schedule 05.06.2013
comment
Дело не в том, чтобы включить users.h в оба файла. Вам нужно скомпилировать все файлы исходного кода сразу (g ++ main.cpp user.cpp login.cpp ...) из-за компоновщика.   -  person bartimar    schedule 05.06.2013
comment
Да, это делает для меня создатель QT.   -  person Davlog    schedule 05.06.2013
comment
Я удалил extern и создал экземпляр этого класса только внутри моего loginwindow.cpp. Он все еще жалуется на неопределенную ссылку.   -  person Davlog    schedule 05.06.2013
comment
Вы ссылаетесь на файл, в котором определены функции? Потому что вы обязательно должны показать их вашему компилятору и компоновщику.   -  person celtschk    schedule 06.06.2013


Ответы (1)


Скорее всего, вы неправильно используете #include в своем loginwindow.cpp. В результате компилятор никогда не находит правильные функции.

person It'sPete    schedule 06.06.2013