Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt4] ошибка при создании экземпляра класса 
:(
    Опции темы
gordmiand
Дата 22.2.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



создал новое gui- приложение и добавил в него новый класс...подключаю их хидеры (mainwindow.h и klass.h) друг к другу и в mainwindow.h просто пытаюсь создать экземпляр класса klass2:
Код

 Klass2 *kl;

выдаются ошибки: "ISO C++ forbids declaration of 'Klass2' with no type"
                               "expected ';' before '*' token"
см. приложенный архив приложения...
подскажите в чем тут дело и как это исправить? 

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Gproj.rar 157,04 Kb
PM MAIL   Вверх
andrew_121
Дата 22.2.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(gordmiand @  22.2.2010,  19:44 Найти цитируемый пост)
ISO C++ forbids declaration of 'Klass2' with no type

говорит о том, что компилятор не знает кто такой 'Klass2'

Это сообщение отредактировал(а) andrew_121 - 22.2.2010, 20:34


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
gordmiand
Дата 22.2.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



но почему не знает? я же в mainwindow.h подключаю соответствующий хидер (klass2.h), в котором и объявлен данный Klass2-класс...
PM MAIL   Вверх
andrew_121
Дата 22.2.2010, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(gordmiand @  22.2.2010,  20:57 Найти цитируемый пост)
но почему не знает?

а потому что, из klass2.h нужно убрать "#include "mainwindow.h""



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Madonna
Дата 22.2.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Forbidden love...
*


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

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



Цитата(gordmiand @  22.2.2010,  18:57 Найти цитируемый пост)
подключаю соответствующий хидер (klass2.h)

ещё надо объявить класс
Код

#include "klass2.h"

klass2;


--------------------
Best regards, Madonna
PM   Вверх
SABROG
Дата 22.2.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Madonna @ 22.2.2010,  21:25)
Цитата(gordmiand @  22.2.2010,  18:57 Найти цитируемый пост)
подключаю соответствующий хидер (klass2.h)

ещё надо объявить класс
Код

#include "klass2.h"

klass2;

Если имеется ввиду Forward Declaration, тогда так:

Код

#include "klass2.h"

class Klass2;


Но обязательным условием этого является использование указателя на объект, а не самого объекта.


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


Forbidden love...
*


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

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



опечатка...
У него там указатель на объект)
--------------------
Best regards, Madonna
PM   Вверх
SABROG
Дата 23.2.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Madonna @ 22.2.2010,  23:53)
опечатка...
У него там указатель на объект)

Эта фраза вводит в заблуждение:

Цитата

в mainwindow.h просто пытаюсь создать экземпляр класса klass2:


Экземпляр класса и указатель на экземпляр класса разные вещи. Будет весело, если следующим постом автора будет ошибка об Access Violation / Segmentation Fault.


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


Опытный
**


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

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



andrew_121:  подключать "mainwindow.h"" в klass2.h нужно, так как в Klass2 тоже хотелось бы использовать функции класса MainWindow...
верный ответ дал SABROG - по поводу объявления класса: class Klass2; спасибо за ответ, но хотелось бы знать а зачем это? в том же билдере или делфях достаточно было бы инклуда соответствующего хидера... 

PM MAIL   Вверх
SABROG
Дата 23.2.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(gordmiand @ 23.2.2010,  15:07)
но хотелось бы знать а зачем это? в том же билдере или делфях достаточно было бы инклуда соответствующего хидера...

Когда я использовал Borland Builder C++, то мне также приходилось использовать forward declaration. Возможно в паскале это как-то иначе разруливается.

А нужно по двум причинам:
- решить проблему зацикливания, если класс A содержит класс B, а класс B содержит класс A.
- говорит компилятору не искать полное описание типа, если он итак знает размер указателя, а связывание произвести уже в файле реализации (.cpp), когда переменная будет использоваться. Может сократить тем самым время компиляции, а также делает хедер автономным файлом, который может использоваться в качестве интерфейса к классу без необходимости таскать всю реализацию типов за собой. Пример .lib/.a (файлы библиотек) + .h файлы. Связывание произойдет в момент линковки.

http://www.parashift.com/c++-faq-lite/misc....html#faq-39.12


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


Новичок



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

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



Здравствуйте. В QT я новичёк. Мне надо сделать простое приложение без графики чисто для обработки 2-х файлов. Дело вот в чём: пытаюсь создать класс, но выдаётся ошибка одна и 2 предупреждения:

предупреждение 1 D:/qt/yt/DataUF.cpp:1: In file included from DataUF.cpp:1,
предупреждение 2 D:/qt/yt/main.cpp:6: from main.cpp:6:

ошибка D:/qt/yt/DataUF.h:11: error: expected class-name before '{' token

поясните пожалуйста, что за ошибка с предупреждениями?
файл класс.h
Код

#ifndef DATAUF_H
#define DATAUF_H

#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QObject>

class DataUf;
class DataUF : public QObject, public AnotherClass
{
public:
    DataUF(QString);
    void print_t(QTextStream &);
int number;
int year;
int month;
int day;
int hours;
int minutes;
int seconds;
float Uhp;


private:
QString str;
};

#endif // DATAUF_H


файл класс.cpp
Код

#include "DataUF.h"

DataUF::DataUF(QString line)
{
  QStringList fields;
  bool ok;
  fields = line.split("\t");

  str = fields.at(0);
  number = str.toInt(&ok,10);
  str = fields.at(1);
  year = str.toInt(&ok,10);
  str = fields.at(2);
  month = str.toInt(&ok,10);
  str = fields.at(3);
  day = str.toInt(&ok,10);
  str = fields.at(4);
  hours = str.toInt(&ok,10);
  str = fields.at(5);
  minutes = str.toInt(&ok,10);
  str = fields.at(6);
  seconds = str.toInt(&ok,10);
  str = fields.at(7);
  Uhp = str.toFloat(&ok);

}

void DataUF::print_t(QTextStream &File1)
{
   File1 <<  number << endl <<
 year << endl <<
 month << endl <<
 day << endl <<
 hours << endl <<
 minutes << endl <<
 seconds << endl <<
 Uhp << endl;
}



файл main.cpp
Код


#include <QtCore/QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QString>
#include "DataUF.cpp"

QChar str[200];

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    QFile file("UF_2007_11_28_704001.txt");
     if (!file.open(QFile::ReadOnly |QFile::WriteOnly))
     {
        return 0;
     }
     QFile file1("new_copy.txt");
     if (!file1.open(QFile::ReadOnly | QFile::WriteOnly))
     {
       return 0;
     }

     QTextStream out1(&file1);
     QTextStream in(&file);
     QString str=0, line;
     QStringList fields;
     int j=0;

     line = in.readLine();

     DataUF T(line);
     T.print_t(out1);

    return 0; //a.exec()
}


PM MAIL   Вверх
pilotnet
Дата 19.1.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в файле main.cpp 
замени
#include "DataUF.cpp"
на 
#include "DataUF.h"
PM MAIL   Вверх
SABROG
Дата 19.1.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Код

str = fields.at(0);
number = str.toInt(&ok,10);
str = fields.at(1);
year = str.toInt(&ok,10);
str = fields.at(2);
month = str.toInt(&ok,10);
str = fields.at(3);
day = str.toInt(&ok,10);
str = fields.at(4);
hours = str.toInt(&ok,10);
str = fields.at(5);
minutes = str.toInt(&ok,10);
str = fields.at(6);
seconds = str.toInt(&ok,10);
str = fields.at(7);
Uhp = str.toFloat(&ok);
...
void DataUF::print_t(QTextStream &File1)
{
   File1 <<  number << endl <<
 year << endl <<
 month << endl <<
 day << endl <<
 hours << endl <<
 minutes << endl <<
 seconds << endl <<
 Uhp << endl;
}




При таком коде проще будет заменить символ табуляции '\t' на перевод строки в файле

Это сообщение отредактировал(а) SABROG - 19.1.2011, 15:54


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

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

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


 




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


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

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