Russian Qt Forum
Ноябрь 23, 2024, 20:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объект одного класса внутри другого! Проблема!  (Прочитано 5671 раз)
nestoleh
Гость
« : Март 25, 2012, 03:22 »

Здравствуйте! Пишу програму и внезапно столкнулся с такой проблемой: есть два класса, один - главного окна (виджет), второй лично мой, его обьект используется для стека. Что бы все работало, нужно объект этого второго класса создать внутри первого, но компилятор ругается и название второго класса не определяется как тип! Вот фрагменты кода:

Код:
// моя структура
struct forSt
{
    int first;
    int next;
    int gl;
};
// мой класс для стека
class myStack
{
private:
    int num, size;
    forSt* p;
public:
    myStack();
    ~myStack();
    void Push(int,int,int);
    forSt Get(void);
};

// главный класс

class dsWidg : public QWidget
{
    Q_OBJECT
public:
    explicit dsWidg(QWidget *parent = 0);
    ~dsWidg();
    void paintCanvas();
    int graphMat[100][100];
    void APG(int, int,int);
    void getRes(int, int);

private:
    Ui::dsWidg *ui;
    wgt *WGT;

    ///////////////////
    // вот тут пытаюсь создать объект и стурктуру
    myStack *st;
    forSt myStr;


    int kol,inf;
    int D[100][100];
    int first,last,rest;
    int reb[100][2];
    int closeR[100][3];
    int result[100][2];
    int n, numR;

public slots:
    void okClick();
    void matrClick();
    void grClick();
    void randClick();
    void propClick();
};



Ругается компилятор вот так:

..\DS_7_first\/dswidg.h:46: error: ISO C++ forbids declaration of 'myStack' with no type
..\DS_7_first\/dswidg.h:46: error: expected ';' before '*' token
..\DS_7_first\/dswidg.h:47: error: 'forSt' does not name a type

первые два на строчку
    myStack *st;
третий на
    forSt myStr;

Кто знает, в чем проблема??
« Последнее редактирование: Март 25, 2012, 11:09 от nestoleh » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 25, 2012, 03:54 »

и на какую строчку твой коспилятор ругается? может он ещё и сообщение об ошибке какое-то выдаёт? что-то мои телепатические способности ночью барахлят.

у метода forSt Get(void); возвращаемый тип случайно должен быть не forSt *? или там поле класса должно иметь тип forSt вместо forSt *?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nestoleh
Гость
« Ответ #2 : Март 25, 2012, 11:12 »

Извините, сонный был, не заметил что сообщения компилятора не скинул! Уже добавил в первый пост...
Немного не понял вопрос про forSt Get(void); вот ее код:

Код:
forSt myStack::Get(void)
{
    forSt rez;
    rez.first=0;
    rez.next=0;
    rez.gl=0;
    if (num>0)
    {
        rez=p[--num];
    }
    else
    {
        rez.first=-1;
        rez.next=-1;
        rez.gl=-1;
    }
    return rez;
}
Записан
mutineer
Гость
« Ответ #3 : Март 25, 2012, 13:01 »

Вот это все, что ты выкинул в первый пост, оно в одном файле живет? и если живет в разных, то сделал ли ты инкулды?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Март 25, 2012, 14:06 »

Немного не понял вопрос про forSt Get(void);
как правило, методы с названием get* подразумевают возвращение поля класса, но видно в твоём случае нужно что-то другое
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nestoleh
Гость
« Ответ #5 : Март 25, 2012, 14:16 »

Немного не понял вопрос про forSt Get(void);
как правило, методы с названием get* подразумевают возвращение поля класса, но видно в твоём случае нужно что-то другое

Живет в разных, но инклуды естественно подключены!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Март 25, 2012, 14:21 »

ошибки компилятора говорят об обратном. инклуды точно находятся в dswidg.h [перед объявлением класса]?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nestoleh
Гость
« Ответ #7 : Март 25, 2012, 15:01 »

Вот так выглядит dswidg.h
Код:
#ifndef DSWIDG_H
#define DSWIDG_H

#include <QWidget>
#include <QPainter>
#include "mystack.h"

namespace Ui
{
    class dsWidg;
}



class wgt : public QWidget
{
    Q_OBJECT
public:
    wgt(QWidget * parent = 0);
    void setKol(int k, int a[][100]);
protected:
    void paintEvent(QPaintEvent *);
    int kol;
    int st[100][2];
    int a[100][100];
};



class dsWidg : public QWidget
{
    Q_OBJECT


public:
    explicit dsWidg(QWidget *parent = 0);
    ~dsWidg();
    void paintCanvas();
    int graphMat[100][100];
    void APG(int, int,int);
    void getRes(int, int);

private:
    Ui::dsWidg *ui;
    wgt *WGT;
    myStack *st;
    forSt myStr;


    int kol,inf;
    int D[100][100];
    int first,last,rest;
    ///////////////
    int reb[100][2];
    int closeR[100][3];
    int result[100][2];
    int n, numR;

public slots:
    void okClick();
    void matrClick();
    void grClick();
    void randClick();
    void propClick();
};


#endif // DSWIDG_H

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Март 25, 2012, 15:13 »

вроде выглядит нормально. выкладывай свой проект (или минимальный компилируемый с ошибкой).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 25, 2012, 15:16 »

Вероятно ifdef (стражи включения в инклудах) блокируют друг друга. Нужно в одном использовать предварительное описание
Записан
nestoleh
Гость
« Ответ #10 : Март 25, 2012, 16:31 »

С вопросом так и не разобрался, поэтому создал стек как набор функций и переменных внутри базового класса, не самое изящное решение, но по скорости работы не уступает и ошибок не выдает! Проект могу выложить конечно, но он уже подредактирован и там все что не работало удалено Грустный! Всем спасибо что так оперативно откликнулись!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 22.