Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с подключением зависимых классов. 
:(
    Опции темы
Elfet
  Дата 9.4.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Всем привет!

Пожалуйста, помогите разобраться, как правильно подключить такую структуру классов?
Solver.h
Код

#ifndef Solver_H
#define Solver_H

class Solver
{
public:
    Solver();
    ~Solver(void);
    void Set(const boost::weak_ptr<Solver> &_solver);

    void StartIteration(Model &model);
public:
    ModelFlow modelFlow;
    ModelPlate modelPlate;
};
#endif // Solver_H



Model.h
Код

#ifndef MODEL_H
#define MODEL_H

class Model
{
public:
    Model();
    void SetSolver(const boost::weak_ptr<Solver> & _solver)
    {
        weak_solver = _solver;
    };

protected:
    boost::weak_ptr<Solver> weak_solver;    
};

#endif // MODEL_H



ModelFlow.h/ModelPlate.h
Код

#ifndef MODELFLOW_H
#define MODELFLOW_H

class ModelFlow : public Model
{
public:
    ModelFlow();
};

#endif // MODELFLOW_H



В классе Solver используются два класса Model, и ModelFlow. ModelFlow наследник от Model. В Model же передаётся ссылка на Solver.

Как тут нужно расставить #include-ы? Как могу понять как их правильно расставить. 


--------------------
PM MAIL WWW Skype   Вверх
Alek86
Дата 9.4.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



попробуй в Model.h добавь
Код
#include <boost/week_ptr.hpp>

и
Код
class Solver;


остальные инклуды очевидны


--------------------
user posted image    user posted image
PM MAIL   Вверх
Elfet
Дата 9.4.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Alek86, 
Цитата(Alek86 @  9.4.2010,  15:18 Найти цитируемый пост)
#include <boost/week_ptr.hpp>

Это понятно, опустил в коде, что бы не загромождать.


Цитата(Alek86 @  9.4.2010,  15:18 Найти цитируемый пост)
class Solver;

И ничего не получится. Это у меня работало когда был только Solver и Model и они друг на друга ссылались:
Код

class Model;
class Solver
{
};

Код

class Solver;
class Model
{
};


а теперь выходит что 1 к 3, причём в 3-ке два унаследованы от одного.  smile 


--------------------
PM MAIL WWW Skype   Вверх
azesmcar
Дата 9.4.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



заменить объекты на указатели в классе Solver и включить в следующем порядке.
Код

#ifndef Solver_H
#define Solver_H

class ModelFlow;
class ModelPlate;
class Model;

class Solver
{
public:
    Solver();
    ~Solver(void);
    void Set(const boost::weak_ptr<Solver> &_solver);
    void StartIteration(Model &model);
public:
    ModelFlow* modelFlow;
    ModelPlate* modelPlate;
};
#endif

Код

#ifndef MODEL_H
#define MODEL_H
class Model
{
public:
    Model();
    void SetSolver(const boost::weak_ptr<Solver> & _solver)
    {
        weak_solver = _solver;
    };
protected:
    boost::weak_ptr<Solver> weak_solver;    
};
#endif


Код

#ifndef MODELFLOW_H
#define MODELFLOW_H
class ModelFlow : public Model
{
public:
    ModelFlow();
};
#endif // MODELFLOW_H

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


любитель
****


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

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



Цитата(Elfet @  9.4.2010,  14:13 Найти цитируемый пост)
а теперь выходит что 1 к 3, причём в 3-ке два унаследованы от одного. 

Надо не заучивать, а просто понять что несет в себе declaration.

Код

// model.h
class Solver;

class Model { ... 
 void SetSolver(const boost::weak_ptr<Solver> & _solver);
};

//model_flow.h
#include "model.h"
class ModelFlow : Model { ... 
};


//model_plate.h
#include "model.h"
class ModelPlate : Model { ... 
};

//solver.h
class Solver {

  ModelPlate ..
  ModelFloiw ...
};



Это сообщение отредактировал(а) mes - 9.4.2010, 15:27


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


Эксперт
***


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

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



Цитата(Elfet @  9.4.2010,  15:13 Найти цитируемый пост)
И ничего не получится.

ты хоть попробовал?
все прекрасно получается (ну, если учесть, что ModelPlate у тя нигде даже не объявлен и его закомментить)
если нет - покажи минимальный проект с этим делом, покажу, где у тебя ошибка


--------------------
user posted image    user posted image
PM MAIL   Вверх
Elfet
Дата 9.4.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



azesmcar, не получилось, Model должен знать о Solver, но подключая Model из ModelFlow - он уже больше не видит этот класс

Цитата

In file included from Source/Solvers/Solver.h:8,
from Source\Solvers\/Model.h:7,
from Source\Solvers\Model.cpp:1:
Source/Solvers/ModelFlow.h:8: error: expected class-name before '{' token


И как замена на указатели должна помочь?



mes, в Solver должны быль видны Model, ModelFlow, ModelPlate? так что не покатит smile




Alek86, да, пробовал. ModelPlate - используется.


--------------------
PM MAIL WWW Skype   Вверх
azesmcar
Дата 9.4.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Elfet @  9.4.2010,  15:51 Найти цитируемый пост)
Model должен знать о Solver

ну так включи его, в чем проблема?
Код

model.h включает solver.h
modelflow.h включает model.h

если не работает скинь сюда проект посмотрим что не так.

Добавлено через 3 минуты и 4 секунды
вот, не поленился проверить.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  testFlow.zip 2,91 Kb
PM   Вверх
Elfet
Дата 9.4.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



azesmcar, я включаю его smile Но компилятор ругается. Проект достаточно большой, так что нет возможности выложить, есть SVN, но там нет этого кода который я пытаюсь вставить. Я в принципе всё в первом посте описал.

Можно ли как-то просто объединить несколько классов в разных файлах, так что бы каждый видел каждого?


--------------------
PM MAIL WWW Skype   Вверх
azesmcar
Дата 9.4.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Elfet @  9.4.2010,  15:51 Найти цитируемый пост)
И как замена на указатели должна помочь?

Код

class A;
class B {
   A t; // ошибка!
}


Код

class A;
class B {
   A * t; // ОК
}


Это сообщение отредактировал(а) azesmcar - 9.4.2010, 15:59
PM   Вверх
Alek86
Дата 9.4.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Elfet @  9.4.2010,  15:51 Найти цитируемый пост)
в Solver должны быль видны Model, ModelFlow, ModelPlate?

да


Цитата(Elfet @  9.4.2010,  15:51 Найти цитируемый пост)
Alek86, да, пробовал. ModelPlate - используется.

код в студию! smile

(ModelPlate тут без разницы)


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 9.4.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Elfet @  9.4.2010,  14:58 Найти цитируемый пост)
так что бы каждый видел каждого? 

можно чтоб каждый видел объявление другого, но определения не могут включаться "циркулярно", только линейно.



--------------------
PM MAIL WWW   Вверх
Elfet
Дата 9.4.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



azesmcar, mes, понял, спасибо!  smile 


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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