Russian Qt Forum

Qt => Общие вопросы => Тема начата: nestoleh от Март 25, 2012, 03:22



Название: Объект одного класса внутри другого! Проблема!
Отправлено: 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;

Кто знает, в чем проблема??


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: kambala от Март 25, 2012, 03:54
и на какую строчку твой коспилятор ругается? может он ещё и сообщение об ошибке какое-то выдаёт? что-то мои телепатические способности ночью барахлят.

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


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: nestoleh от Март 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;
}


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: mutineer от Март 25, 2012, 13:01
Вот это все, что ты выкинул в первый пост, оно в одном файле живет? и если живет в разных, то сделал ли ты инкулды?


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: kambala от Март 25, 2012, 14:06
Немного не понял вопрос про forSt Get(void);
как правило, методы с названием get* подразумевают возвращение поля класса, но видно в твоём случае нужно что-то другое


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: nestoleh от Март 25, 2012, 14:16
Немного не понял вопрос про forSt Get(void);
как правило, методы с названием get* подразумевают возвращение поля класса, но видно в твоём случае нужно что-то другое

Живет в разных, но инклуды естественно подключены!


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: kambala от Март 25, 2012, 14:21
ошибки компилятора говорят об обратном. инклуды точно находятся в dswidg.h [перед объявлением класса]?


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: nestoleh от Март 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



Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: kambala от Март 25, 2012, 15:13
вроде выглядит нормально. выкладывай свой проект (или минимальный компилируемый с ошибкой).


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: Igors от Март 25, 2012, 15:16
Вероятно ifdef (стражи включения в инклудах) блокируют друг друга. Нужно в одном использовать предварительное описание


Название: Re: Объект одного класса внутри другого! Проблема!
Отправлено: nestoleh от Март 25, 2012, 16:31
С вопросом так и не разобрался, поэтому создал стек как набор функций и переменных внутри базового класса, не самое изящное решение, но по скорости работы не уступает и ошибок не выдает! Проект могу выложить конечно, но он уже подредактирован и там все что не работало удалено :(! Всем спасибо что так оперативно откликнулись!