Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt4] правильно обьявить static - функию 
V
    Опции темы
pycha
Дата 12.7.2009, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



драствуйте . Прога состоит из 5 файлов. 3 cpp и 2 заглавочных. Чтобы было понятно вот код.

main.cpp
Код

#include "analiz.h"

#include <QtGui>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

     MainWindow w;
    w.show(); 

    return app.exec();

}


analiz.h
Код

#ifndef ANALIZ_H
#define ANALIZ_H

#include <QtGui>
#include "ui_analiz.h"



class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

public slots:
    void analizB();
};

#endif // ANALIZ_H


analiz.cpp
Код

#include <QtGui>
#include "analiz.h"
#include "analize.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setupUi(this);

    connect(analizButton,SIGNAL(pressed()),this,SLOT(analizB()));
}

void MainWindow::analizB()
{
    QString vivod = Analize::analize(lineEdit->text());
    textBrowser->setText(vivod);
}


analize.h
Код


#ifndef ANALIZE_H_
#define ANALIZE_H_

#include <QtGui>

class Analize
{
public:
    static QString  analize(QString vvod);
};

#endif /* ANALIZE_H_ */


analize.cpp
Код

#include <QtGui>
#include "analize.h"

QString Analize::analize(QString vvod)
{
    return vvod;
}



в файле analiz.cpp при попытке вызвать функцию static QString Analize::analize(QString) 
Код

QString vivod = Analize::analize(lineEdit->text());


выдает ошибку 
Цитата

undefined reference to `Analize::analize(QString)'

но почему же? ведь она же должна быть доступна во всех файлах програмы если у нее стоит "static". я понять немогу, может подскажете что не так
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
SABROG
Дата 12.7.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(pycha @  12.7.2009,  02:06 Найти цитируемый пост)
но почему же? ведь она же должна быть доступна во всех файлах програмы если у нее стоит "static". я понять немогу, может подскажете что не так 

static = private для модулей файлов. Тебе нужен extern в модуле где ты её объявляешь и static там где ты её будешь использовать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 12.7.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



Цитата(SABROG @  12.7.2009,  12:04 Найти цитируемый пост)
static = private для модулей файлов. Тебе нужен extern в модуле где ты её объявляешь и static там где ты её будешь использовать

у него там static метод класса
PM MAIL Skype GTalk   Вверх
pycha
Дата 12.7.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



я чет не пойму как надо правильно, сделал так: добавил extern в analize.h (там где обьявляется функция), 
Цитата

public:
    extern QString  analize(QString vvod);
 


и добавил еще одно обьявление функции там где они будут использоватся : analiz.cpp 
Код

#include <QtGui>
#include "analiz.h"
#include "analize.h"

static QString Analize::analize(QString vvod);


в результате опять куча ошибок
Цитата

Description    Resource    Path    Location    Type
cannot call member function `QString Analize::analize(QString)' without object    analiz.cpp    analiz    19    C/C++ Problem
cannot declare member function `QString Analize::analize(QString)' to have static linkage    analiz.cpp    analiz    5    C/C++ Problem
declaration of `QString Analize::analize(QString)' outside of class is not definition    analiz.cpp    analiz    5    C/C++ Problem
make: *** [debug] Error 2    analiz  0    C/C++ Problem
make[1]: *** [debug/analiz.o] Error 1    analiz  0    C/C++ Problem
storage class specified for field `analize'    analize.h    analiz    11    C/C++ Problem


 что я не так понял?

Это сообщение отредактировал(а) pycha - 12.7.2009, 12:26
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
pycha
Дата 12.7.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



вот что в книге - учебнике (Стивен Прата) по этому поводу:
Цитата

возможно также обьявление статических функций-элементов (слово static должно присутствовать в обьявлении, но не в определении функции, если последнее помещается отдельно). Это имеет два важных следствия.
   Первое- это то, что статическая функция-элемент не должна вызываетися обьектом. В действительности она даже не получает в свое распоряжение указатель this. Если статическая функция-элемент обьявлена в общедоступной части, то она может вызыватся при помощи имени класса и оператора определения диапазона доступа. Она может вызвана следующим образом класс::функция(); 

что собственно я и сделал, но оно почемуто не работает. компилятор у мя - еклипс. MinGW. 
Кто что посоветует?
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
Lazin
Дата 12.7.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



pycha, код выглядит нормальным, попробуй разместить все в одном файле
Код

#ifndef ANALIZ_H
#define ANALIZ_H
#include <QtGui>
#include "ui_analiz.h"

class Analize
{
public:
    static QString  analize(QString vvod);
};

class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
public slots:
    void analizB();
};
#endif // ANALIZ_H

дело точно не в синтаксисе
PM MAIL Skype GTalk   Вверх
KL7
Дата 12.7.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



у меня такой код откомпилился (убрал зависимость от ui, поскольку им не обладаю  smile )
Analiz.cpp
Код

#include <QtGui>
#include "analiz.h"
#include "analize.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    analizB();
//    setupUi(this);
//    connect(analizButton,SIGNAL(pressed()),this,SLOT(analizB()));
}
void MainWindow::analizB()
{
    QString vivod = Analize::analize("qwe");
  //  textBrowser->setText(vivod);
}


Analiz.h
Код

#ifndef ANALIZ_H
#define ANALIZ_H
#include <QtGui>
//#include "ui_analiz.h"
class MainWindow : public QMainWindow//, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
public slots:
    void analizB();
};
#endif // ANALIZ_H


Analize.cpp
Код

#include <QtGui>
#include "analize.h"
QString Analize::analize(QString vvod) {
    return vvod;
}


Analize.h
Код

#ifndef ANALIZE_H_
#define ANALIZE_H_
#include <QtGui>
class Analize {
public:
    static QString analize(QString vvod);
};
#endif /* ANALIZE_H_ */


main.cpp
Код

#include "analiz.h"
#include <QtGui>
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;
    return app.exec();
}


Фактически статик-функция вызывается без проблем в конструкторе MainWindow...
Про static и exern в плане компоновки - ето думаю другой вопрос... Тут же мы подключаем analize.h и спокойно пользуемся как классом, так и его статик-функциями... smile 

Мое упрощение кода не должно было повлиять на ситуацию, хотя ошибку Вы ведь не сами придумали... Даже не знаю в чем дело... 
PM MAIL ICQ   Вверх
pycha
Дата 12.7.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



мне надо чтобы оно было использовано в отдельных файлах , потомучто исходники analize.h analize.cpp я буду использовать в нескольких прогах, и конешно нехотелось бы просто копировать из исходников одной програмы все определение класа, а делать более цивилизовано, а оно чета ругается. Странно , ведь если брать стандатртные кутешные , например QString::number(int); то оно отлично работает, а вот почему из моего не хочет подключать? 

вообщем тут чтото нелады с подключением файлов к проекту, заметил что в файлах analize.h analize.cpp если сделать ее ошибку , то ее компилятор просто не видит, они неподключены к проекту во время линковки. Хотя они находятся в той же папке, и если нажать на ctrl и клацнуть мышкой на QString vivod = Analize::analize(lineEdit->text()); то оно перейдет к обьявлению функции. Если соединить класы в одном файле то все работает отлично

Добавлено через 1 минуту и 11 секунд
как их надо правильно добавить к проекту?
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
KL7
  Дата 12.7.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(pycha @  12.7.2009,  15:10 Найти цитируемый пост)
мне надо чтобы оно было использовано в отдельных файлах

так у меня вроде в разных файлах... или я Вас не так понял?


Цитата(pycha @  12.7.2009,  15:10 Найти цитируемый пост)
как их надо правильно добавить к проекту? 

все зависит от того, какой проект =) 
eclipse, vs, cmd? 
я в консоли запустил свой батник (qmake -project, qmake -makefile, make release)... и Ваш проект собрался и запустился...
c eclipse уже подружился, но с ним что-то небольшое собирать - мороки больше...
PM MAIL ICQ   Вверх
pycha
Дата 12.7.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



Цитата(KL7 @  12.7.2009,  16:24 Найти цитируемый пост)
так у меня вроде в разных файлах... или я Вас не так понял?

все так, только у меня analize.h analize.cpp не компилятся вместе с проектом 
Цитата(KL7 @  12.7.2009,  16:24 Найти цитируемый пост)
все зависит от того, какой проект =) 


Цитата(pycha @  12.7.2009,  13:41 Найти цитируемый пост)
компилятор у мя - еклипс. MinGW. 

все делаю в еклипсе. 
проект создаю file>new>qt gui project

Это сообщение отредактировал(а) pycha - 13.7.2009, 02:14
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
KL7
Дата 13.7.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(pycha @  12.7.2009,  16:55 Найти цитируемый пост)
все делаю в еклипсе. 
проект создаю file>new>qt gui project

была бы студия - можно было бы попробовать пересобрать проект... там косяки часто случаются...
в стабильность eclipse я пока верю... но говорят она идеально работает только для Java-ы...
если не разобрался - давай может все существенные файлы из проекта (включая ui) - попробую у себя собрать =)
PM MAIL ICQ   Вверх
dix75
Дата 13.7.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



pycha
Все правильно  с кодом.
Почему у тебя файлы не в проекте?


--------------------
save your mind
PM MAIL   Вверх
pycha
Дата 13.7.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



кстати нащет пересоздания проекта, эта вещь меня тоже уже задолбала. Тут как оно работает, сперва выдает эту ошибку, потом при попытке перекомпилить выдает месаджбокс "application Launcher" "Launch failed. Binary not found." Иногда даже бывают случаи что каспер выкидывает сообщение что файл analize.exe пытаются перезаписать, (тогда еще ошибок нету) , как только это я разрешаю, то вылетают те ошибки. Но это только иногда. Чтобы перекомпилить вообщем надо удалять проект и содавать его опять, при этом если убрать вызов функции, то оно скомпилится норм. 
зы Там сначало оговорился, analize.h подключается к проекту и участвует при компиляции, а вот analize.cpp нет. Хотя они все какбе в проекте.

Добавлено через 4 минуты и 14 секунд
вот, в последних используемых файлах в эклипсе видно что все файлы пренадлежат проекту

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  __________.JPG 6,07 Kb
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
pycha
Дата 13.7.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



блин, я подумал и все функции забросил в analize.h . В результате получил такое
Цитата

Description    Path    Location    Resource    Type
make: *** [debug] Error 2  0    analiz    C/C++ Problem
make[1]: *** [debug\analiz.exe] Error 1  0    analiz    C/C++ Problem

 
они пропадают если файл не подключать, у меня уже руки опускаются
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
Любитель
Дата 13.7.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



.pro файл можешь показать?


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.