Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c++ classes

4.8K
08 марта 2007 года
sealmu
53 / / 28.02.2007
Как сделать на c++ что бы 2 класса из разных файлов видели друг друга?

если делаю так :



##################### File 1 #########################
//consol.cpp
#include <iostream>
#include "inh.cpp"

using namespace std;

class bb;

class aa : public bb
{
public:
int n;

aa() {n=1;}
void aac();
bb *pbb;
void prnaa();
};



void aa::aac() {pbb = new bb(); }
void aa:: prnaa() {cout << "in aa : " << n << endl;}


void main()
{
aa aaa;
aaa.aac();
aaa.pbb->bbc(&aaa);

aaa.pbb->paa->prnaa();
aaa.pbb->paa->n = 5;
aaa.pbb->paa->prnaa();

cin.get();
}


##################### File 2 #########################

//inh.cpp
#include "consol.cpp"

class bb
{
public:
int n2;

bb() {n2=2;}
void bbc(aa *paa2);
aa *paa;
void prnbb();
//~bb();
};

void bb::bbc(aa *paa2) {paa = paa2; }
void bb:: prnbb() {cout << "in bb : " << n2 << endl;}

то получаю ошибку : too many include files:depth=1024



но а если те же 2 класса без includes в одном файле, тогда работает.
361
08 марта 2007 года
Odissey_
661 / / 19.09.2006
Для начала почитать что нибудь про язык с++. пройдись по ссылкам , выбери что нибудь подходящее для себя.

А по поводу вопроса. Есть такое понятие как заголовочный файл (header), в нем содержится описание, иногда и часть кода. Создай такие для своих классов.
//consol.hpp
Код:
#ifndef _MY_SUPER_CLASS_
#define _MY_SUPER_CLASS_
class bb;

class aa : public bb
{
public:
int n;

aa() {n=1;}
void aac();
bb *pbb;
void prnaa();
};
#endif

Что бы твой класс не переопределялся в других файлах, куда ты его инклудишь, обрами его директивами
#ifndef _MY_SUPER_CLASS_
#define _MY_SUPER_CLASS_
сам класс
#endif
Это даст тебе гарантию того что обявление его будет единожды в программном коде, и нигде более не повторится. Почитай про директивы тоже.
Старайся не инклудить без особой надобности твои файлы с кодом (расширение с++), а инклудь именно файлы описания (header`ы).

Да! И научись уже использовать расширенный режим на форуме, и в частности теги CODE у тебя же уже 2 сообщения, такое оформление радует как тебя так и глаз читателей.
ИМХО в студенты.
4.8K
08 марта 2007 года
sealmu
53 / / 28.02.2007
А почему :
#ifndef _MY_SUPER_CLASS_
#define _MY_SUPER_CLASS_
надо писать в header файле,
а не в cpp?
какая разница?

нельзя ли сам include как то обрамить?
4.8K
08 марта 2007 года
sealmu
53 / / 28.02.2007
Цитата:

#ifndef _MY_SUPER_CLASS_
#define _MY_SUPER_CLASS_
class bb;

class aa : public bb
{
public:
int n;

aa() {n=1;}
void aac();
bb *pbb;
void prnaa();
};
#endif



пишет что bb ему не известен

4.8K
08 марта 2007 года
sealmu
53 / / 28.02.2007
[FONT=Arial]Буду очень благодарен если кто то сможет мне дать полный измененый рабочий пример этих 2 файлов[/FONT]
361
08 марта 2007 года
Odissey_
661 / / 19.09.2006
Хорошо =). Я смотрю чуство юмора у тебя не страдает.
//console.cpp
Код:
#ifndef _MY_CLASS_AB_
#define _MY_CLASS_AB_
#include <iostream>

using namespace std;

class aa;

class bb
{
public:
int n2;

bb() {n2=2;}
void bbc(aa *paa2);
aa *paa;
void prnbb();
//~bb();
};

class aa : public bb
{
public:
int n;

aa() {n=1;}
void aac();
bb *pbb;
void prnaa();
};
#endif


// inh.cpp
Код:
#include "console.cpp"
void bb::bbc(aa *paa2) {paa = paa2; }
void bb:: prnbb() {cout << "in bb : " << n2 << endl;}

void aa::aac() {pbb = new bb(); }
void aa:: prnaa() {cout << "in aa : " << n << endl;}


int main()
{
aa aaa;
aaa.aac();
aaa.pbb->bbc(&aaa);

aaa.pbb->paa->prnaa();
aaa.pbb->paa->n = 5;
aaa.pbb->paa->prnaa();

cin.get();

return 0;
}


Батенька, читайте классику. Страуструп о заголовочных файлах.
4.8K
08 марта 2007 года
sealmu
53 / / 28.02.2007
Конечно спасибо!
Но в этом то и проблема : aa и bb не в одном а в разных файлах.
aa в console, bb в inh (не вместе в одном)
361
09 марта 2007 года
Odissey_
661 / / 19.09.2006
//console.cpp
Код:
#ifndef _MY_CLASS_B_
#define _MY_CLASS_B_
#include <iostream>

using namespace std;

class aa;

class bb
{
public:
int n2;

bb() {n2=2;}
void bbc(aa *paa2);
aa *paa;
void prnbb();
//~bb();
};

void bb::bbc(aa *paa2) {paa = paa2; }
void bb:: prnbb() {cout << "in bb : " << n2 << endl;}

#endif


//inh.cpp
Код:
#include "console.cpp"

class aa : public bb
{
public:
int n;

aa() {n=1;}
void aac();
bb *pbb;
void prnaa();
};


void aa::aac() {pbb = new bb(); }
void aa:: prnaa() {cout << "in aa : " << n << endl;}


int main()
{
aa aaa;
aaa.aac();
aaa.pbb->bbc(&aaa);

aaa.pbb->paa->prnaa();
aaa.pbb->paa->n = 5;
aaa.pbb->paa->prnaa();

cin.get();

return 0;
}


[COLOR="Red"]Данная реализация, как и предыдущие, хоть и компилируется, но является в корне неверным решением проблемы. Уважаемые люди, способные случайно прочитать этот пост, не вопринимайте это решение всерьез и не пытайтесь повторить, это опасно для для общей структуры программы.[/COLOR]
4.8K
09 марта 2007 года
sealmu
53 / / 28.02.2007
А какая реализация будет являться правильной?
4.8K
09 марта 2007 года
sealmu
53 / / 28.02.2007
Спасибо!
И все же меня интересует несколько инное решение :
мне надо что б каждый из 2 классов "понимал" тип другого класса (что бы в теле каждого из классов можно бы было использовать тип другого класса). Например есть 2 формы[A,B] и надо что б по событию из тела каждой из форм, с помощью pointer'а на другую форму можно бы было к ней обратиться.
Спасибо!
Надо что бы классы A и B были не в одном а в разных файлах
361
09 марта 2007 года
Odissey_
661 / / 19.09.2006
Та реализация, в которой обявления, подключаемые в другие файлы, не тянут за собой код. Та реализация, которая не плодит кашу код-объявления кода.
Вообще читай ссылку.
4.8K
09 марта 2007 года
sealmu
53 / / 28.02.2007
А? чего?:confused:
4.8K
09 марта 2007 года
sealmu
53 / / 28.02.2007
Уточнение
9
09 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Забанить бы тебя насовсем, шутник хренов. Да уж больно у нас модеры гуманные... Ты языки-то хоть различаешь?
4.8K
09 марта 2007 года
sealmu
53 / / 28.02.2007
А че я? Зачем ругаться? Не меня надо банить,...
4.8K
10 марта 2007 года
sealmu
53 / / 28.02.2007
Выдает ошибку : use of undefined type 'B'
А как же сделать?

/////////////////////////////////// File1.h //////////////////////////////////////////////
#ifndef __FILE_1_H__
#define __FILE_1_H__
#include <iostream>

class B;

class A
{
public:
A() {std::cout << "A created" << std::endl;}
B* m_bPtr;
void setb(B* bb) {m_bPtr = bb;}
void prna() {std::cout << "A prn" << std::endl;}
void cira() {for (int j=0;j<10;j++) for (long i=0;i<100000;i++) m_bPtr->prnb();}
};

#endif



/////////////////////////////////// File2.h //////////////////////////////////////////////
#ifndef __FILE_2_H__
#define __FILE_2_H__
#include <iostream>

class A;

class B
{
public:
B() {std::cout << "B created" << std::endl;}
A* m_aPtr;
void seta(A* aa) {m_aPtr = aa;}
void prnb() {std::cout << "B prn" << std::endl;}
void cirb() {for (int j=0;j<10;j++) for (long i=0;i<100000;i++) m_aPtr->prna() ;}
};

#endif



/////////////////////////////////// mymain.cpp //////////////////////////////////////////
#include "File1.h"
#include "File2.h"

void main()
{
A *a1 = new A;
B *b1 = new B;
b1->seta(a1);
a1->setb(b1);
//a1->m_bPtr->m_aPtr->prna();
a1->cira();
b1->cirb();

std::cin.get();
}
63
10 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: sealmu
А че я? Зачем ругаться? Не меня надо банить,...


Поясню:
1) Прочитай правила постинга в раздел студентам, и в частности, про теги [ code] [ /code] (без пробела в скобках).
2) Выбери язык, С++ или С#, и прочитай по нему, хоть по основам, книгу, благо ссылок полно в прилепленной теме раздела. А тот код, что ты тут выше приложил, советую перенести в юмор:).
[color=red]Предлагаю модератору закрыть тему.[/color]

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог