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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объект в качестве параметра static функции, другого класса 
V
    Опции темы
maxi91m
  Дата 20.4.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Даже не знаю как точно назвать тему, толком не пойму почему не компилируется

У меня есть 3 класса в TTextLink перегружены операции выделения и удаления памяти(new, delete)
из-за этого псевдо сборщика мусора получается какая то каша из классов, что даже я сам толком не понимаю что там толком.
TTextLink - звено "текста", для  данного текста реализовано, что то вроде сборщика мусора
Код


#include "TTextMem.h"
#include <iostream>
#include <string.h>


using namespace System;
using namespace std;
class TText;
class TTextLink 
{
    static TTextMem Mem;
public:
    int tab_l;
    TTextLink* pNext;
    TTextLink* pDown;
    string str;
    TTextLink(){pNext=pDown = NULL; tab_l = 0;}
    void* operator new(size_t size);
    void operator delete(void* p);
    static void InitMem(int size = 100);
    static void CleanerMem(const TText &txt);
    bool IsAtom();
    friend class TText;

};
void TTextLink::operator delete(void *p)
{
    TTextLink* pLink = (TTextLink*)p;
    pLink->pNext = Mem.pFree;
    Mem.pFree = pLink;
}
void TTextLink::InitMem(int size)
{
    Mem.pFirst = (TTextLink*)new char[size*sizeof(TTextLink*)]; // Никак не вспомню что за махинации производим с char
    //char = 1байт Mem.pFirst = new TTextLink[size] ????????????// Наверное это из-за перегруженного new!!!
    Mem.pFree = Mem.pFirst;
    Mem.pLast = Mem.pFirst +(size-1);
    TTextLink* pLink = Mem.pFirst;
    for(int i=0;i<size-1; i++,pLink++)
        pLink->pNext=pLink+1;
    pLink->pNext = NULL;//туда указывает последнее звено списка памяти
}
void TTextLink::CleanerMem(const TText &txt)
{

    for(txt.Reset();!txt.IsEnd();txt.GoNext())
        txt.SetLine("$€"+txt.GetLine());
    TTextLink* pLink = Mem.pFree;
    while(pLink != NULL)
        pLink->str="$€";
    //собственно осталось теперь только собрать мусор(не пусты и не используемые звенья) нет ссылок
    for(pLink = Mem.pFirst;pLink != Mem.pLast; pLink++)
    {
        if(strstr(pLink->str.c_str(),"$€"))
        {
            string temp;
            temp = pLink->str.substr(2,pLink->str.length());
            pLink->str = temp;
        }
        else delete pLink;
    }


Класс управления памятью который как нам нужен для того что бы зарание выделенные звенья соеденить в линейный список и помечать какие свободные какие нет

Код

#include "TTextLink.h"
/*
_______________________________
|     |      |     |     |     |    |    |     |    |    |
|  * |  *  |  * |     |     |    |    |     |    |    |
-------------------------------------------------
  ^                 ^                                 ^
  pFirst        pFree                       pLast
Даннй список стоим из тех же зевеньев TTextLink
*/
class TText;
class TTextLink;
class TTextMem 
{
TTextLink* pFirst, *pFree, *pLast;
friend class TTextLink; // когда калсс TTextLink состоит только из отркрытых полей и методов 
                        // тогда может делать его дружественным лишнее?????
};


Класс Text
Код

#include "TTextLink.h"
#include <list>
#include <stack>
#include <string.h>


using namespace System;
using namespace std;
stack<TTextLink* ,list<TTextLink*> > _stack,_stackI;     //Узнать для чего второй параметор, понятно что список но что дальше?
                                                 //Стек для указателей при обходе списка

class TText
{
public:
    TTextLink* pFirst;
    TTextLink* pCurrent;
    TText( ){pFirst = NULL; pCurrent = NULL;}
    void GoNextLine( );
    void GoDownLine( );
    void GoPrevLine( );
    void GoPrevSect( );
    void SetLine(string line){pCurrent->str = line;}
    string GetLine(){return string(pCurrent->str);}
    void Reset();
    int  IsEnd(){return !_stackI.empty();}
    void GoNext();
    void InsNextLine( string line );
    void InsDownLine( string line );
    void InsNextSect( string line );
    void InsDownSect( string line );
    void DelLine();
    void DelSect();

};

И вот такая куча ошибок, где я не пойму почему для него TText не является типом
Код

1>TextR.cpp
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2027: use of undefined type 'TText'
1>        e:\proglab\lang_c\textr\textr\TTextMem.h(14) : see declaration of 'TText'
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2228: left of '.Reset' must have class/struct/union
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2027: use of undefined type 'TText'
1>        e:\proglab\lang_c\textr\textr\TTextMem.h(14) : see declaration of 'TText'
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2228: left of '.IsEnd' must have class/struct/union
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2027: use of undefined type 'TText'
1>        e:\proglab\lang_c\textr\textr\TTextMem.h(14) : see declaration of 'TText'
1>e:\proglab\lang_c\textr\textr\TTextLink.h(63) : error C2228: left of '.GoNext' must have class/struct/union
1>e:\proglab\lang_c\textr\textr\TTextLink.h(64) : error C2027: use of undefined type 'TText'
1>        e:\proglab\lang_c\textr\textr\TTextMem.h(14) : see declaration of 'TText'
1>e:\proglab\lang_c\textr\textr\TTextLink.h(64) : error C2228: left of '.SetLine' must have class/struct/union
1>e:\proglab\lang_c\textr\textr\TTextLink.h(64) : error C2027: use of undefined type 'TText'
1>        e:\proglab\lang_c\textr\textr\TTextMem.h(14) : see declaration of 'TText'
1>e:\proglab\lang_c\textr\textr\TTextLink.h(64) : error C2228: left of '.GetLine' must have class/struct/union


 smile 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TextR.rar 18,36 Kb
--------------------
PM MAIL ICQ   Вверх
vinick
Дата 21.4.2010, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вынеси реализацию методов из файла  TTextLink.h в cpp-файл и в нем сделай include "TText.h". Предварительное объявление не дает права вызывать методы этого класса, т.к. компилятору о них еще ничего не известно.

PM MAIL ICQ Jabber   Вверх
maxi91m
Дата 21.4.2010, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Теперь вот что получилось

Код

#ifndef TTEXTLINK_H_
#define TTEXTLINK_H_


#include <iostream>
#include <string.h>

using namespace std;

class TText;
class TTextLink;
class TTextMem 
{
    TTextLink* pFirst, *pFree, *pLast;
    friend class TTextLink;
};
class TTextLink 
{
    static TTextMem Mem;
public:
    int tab_l;
    TTextLink* pNext;
    TTextLink* pDown;
    string str;
    TTextLink(){pNext=pDown = NULL; tab_l = 0;}
    void* operator new(size_t size);
    void operator delete(void* p);
    static void InitMem(int size = 100);
    static void CleanerMem(TText &txt);
    bool IsAtom();
    friend class TText;

};

#endif

Код


#ifndef TTEXT_H_
#define TTEXT_H_
#include "TTextLink.h"
#include <list>
#include <stack>
#include <string.h>

using namespace System;
using namespace std;

class TText;                                                 

class TText
{
public:
    TTextLink* pFirst;
    TTextLink* pCurrent;
    stack<TTextLink* ,list<TTextLink*> > _stack,_stackI;  
    TText( ){pFirst = NULL; pCurrent = NULL;}
    void GoNextLine( );
    void GoDownLine( );
    void GoPrevLine( );
    void GoPrevSect( );
    void SetLine(string line){pCurrent->str = line;}
    string GetLine(){return string(pCurrent->str);}
    void Reset();
    int  IsEnd(){return !_stackI.empty();}
    void GoNext();
    void InsNextLine( string line );
    void InsDownLine( string line );
    void InsNextSect( string line );
    void InsDownSect( string line );
    void DelLine();
    void DelSect();

};


Код

#include "stdafx.h"
#include "TTextLink.h"
#include "TText.h"
bool TTextLink::IsAtom()
{
    if( pNext )return false; 
    else
        if( pDown ) return true;
}
void* TTextLink::operator new(size_t size)
{
    TTextLink* pLink = Mem.pFree;
    if(Mem.pFree != NULL)
        Mem.pFree = Mem.pFree->pNext;
    return pLink;
}
void TTextLink::operator delete(void *p)
{
    TTextLink* pLink = (TTextLink*)p;
    pLink->pNext = Mem.pFree; 
    Mem.pFree = pLink;
}
void TTextLink::InitMem(int size)
{
    Mem.pFirst = (TTextLink*)new char[size*sizeof(TTextLink*)]; 
    //char = 1байт Mem.pFirst = new TTextLink[size] ????????????// Наверное это из-за перегруженного new!!!
    Mem.pFree = Mem.pFirst;
    Mem.pLast = Mem.pFirst +(size-1);
    TTextLink* pLink = Mem.pFirst;
    for(int i=0;i<size-1; i++,pLink++)
        pLink->pNext=pLink+1;
    pLink->pNext = NULL;//туда указывает последнее звено списка памяти
}

void TTextLink::CleanerMem(TText &txt)
{

    for(txt.Reset();!txt.IsEnd();txt.GoNext())
    //    txt.SetLine("$€"+txt.GetLine());
    TTextLink* pLink = Mem.pFree;
    while(pLink != NULL) 
        pLink->str="$€";
    //собственно осталось теперь только собрать мусор(не пусты и не используемые звенья) нет ссылок
    for(pLink = Mem.pFirst;pLink != Mem.pLast; pLink++)
    {
        if(strstr(pLink->str.c_str(),"$€"))
        {
            string temp;
            temp = pLink->str.substr(2,pLink->str.length());
            pLink->str = temp;
        }
        else delete pLink;
    }
}


Выходит странная ошибка
Код

1>------ Build started: Project: TextR, Configuration: Debug Win32 ------
1>Compiling...
1>TText.cpp
1>TTextLink.cpp
1>.\TTextLink.cpp(41) : error C2065: 'pLink' : undeclared identifier
1>.\TTextLink.cpp(41) : fatal error C1903: unable to recover from previous error(s); stopping compilation

 smile 

Это сообщение отредактировал(а) maxi91m - 21.4.2010, 08:01
--------------------
PM MAIL ICQ   Вверх
maxi91m
Дата 21.4.2010, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нечайно нажал 2 раз

Это сообщение отредактировал(а) maxi91m - 21.4.2010, 08:00
--------------------
PM MAIL ICQ   Вверх
xvr
Дата 21.4.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(maxi91m @  21.4.2010,  07:58 Найти цитируемый пост)
Выходит странная ошибка
Нормальная ошибка. У тебя объявление pLink (строка 40) попало в тело цикла (строка 38). Соотвественно за пределами цикла его не видно


PM MAIL   Вверх
maxi91m
Дата 21.4.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Воя я слепой, закоментил строчку которая вызывала ошибку и сделал еще ошибку. 
 smile 
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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