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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на класс внутри класса, Компилятор говорит что это не указатель 
:(
    Опции темы
NiCketT
  Дата 21.5.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Собственно есть вот-такие классы
Код

    class Country;

    class City{
     private:
        static unsigned k; //количество стран (типов монет)
        unsigned* coins; //массив монет (по id country)
        Country* countr; //указатель на страну
     public:
        City(unsigned coins_count); //выделяется память для списка монет
        ~City();
        bool tst(); //проверка на полноту
        void setCountry(coins::Country* country) {//countr=country;
            std::string m=country->GetName();
        //std::cout<<"set country "<<m<<std::endl;
        };
        unsigned getMoney(unsigned i) {return coins[i];};
        void AddMoney(unsigned wher, int how_many);
    };
    
    class Country{
    private:
        std::string name;
        unsigned id; //номер страны
        unsigned k_city; //количество городов
        static unsigned coutrys_count; //количество стран
        City* *citys; //массив указателей на города
        bool full; //полная страна
    public:
        Country(std::string nam, /*количество городов*/unsigned n);
        Country(const Country &m); //конструктор копии для правильного впихивания в вектор
        void AddCity(City* m); //добавить адрес города
        void AddMoney(int count); //добавление своих монет, на все свои города
        std::string GetName() {return name;};
        bool is_full() {return full;}; //полная ли страна
        bool tst(); //принудительное тестирование страны (всех городжов) на полность
        
        friend bool operator>(const Country &c1, const Country &c2);
        friend bool operator<(const Country &c1, const Country &c2); //для правильной сортировки внутри вектора
        ~Country() {delete[] citys;};
    };

Компилятор матерится на строку std::string m=country->GetName();, говорит что     use of undefined type 'coins::Country' и left of '->GetName' must point to class/struct/union/generic type.  smile 
Самое интересное что при написании кода подсказки с методами класса таки всплывают, да и код приведенный ниже работает  smile 
Код

#include <iostream.h>
#include <stdlib.h>

class B;

class A {
  public:
  B* c;
  void set(B* m) {c=m;};
};

class B {
  public:
  A* c;
  int b;
  int get() {cout<<b<<endl;};
};

int main()
{
      B b;
      b.b=4;
      A a;
      a.set(&b);
      cout<<a.c->b<<endl;
      a.c->get();

      system("PAUSE");
      return 0;
}

Че за фигня? Полная версия кода в архиве.  smile 


Это сообщение отредактировал(а) NiCketT - 21.5.2008, 20:34

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  coins.zip 16,40 Kb
PM MAIL   Вверх
Rififi
Дата 21.5.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



void setCountry(coins::Country* country)
в чём глубинный смысл этой записи?
PM MAIL   Вверх
NiCketT
Дата 21.5.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rififi @ 21.5.2008,  20:38)
void setCountry(coins::Country* country)
в чём глубинный смысл этой записи?

устанавливает обратную ссылку на город
PM MAIL   Вверх
Lazin
Дата 21.5.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

        void setCountry(Country* country) 
       {
            countr=country;
        };


а если так?
PM MAIL Skype GTalk   Вверх
maxim1000
Дата 21.5.2008, 20:55 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NiCketT @  21.5.2008,  20:27 Найти цитируемый пост)
std::string m=country->GetName();

для компиляции (или хотя бы определения корректности) этой строки уже нужна информация о том, что есть, а чего нет в классе Country
поэтому этот метод должен быть определён после описания класса Country


--------------------
qqq
PM WWW   Вверх
jonie
Дата 21.5.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



 void setCountry(coins::Country* country) 
на что намекал Rififi


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
NiCketT
Дата 21.5.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(maxim1000 @ 21.5.2008,  20:55)
Цитата(NiCketT @  21.5.2008,  20:27 Найти цитируемый пост)
std::string m=country->GetName();

для компиляции (или хотя бы определения корректности) этой строки уже нужна информация о том, что есть, а чего нет в классе Country
поэтому этот метод должен быть определён после описания класса Country

спасибо  smile 
PM MAIL   Вверх
math64
Дата 22.5.2008, 08:13 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxim1000 @  21.5.2008,  20:55 Найти цитируемый пост)
для компиляции (или хотя бы определения корректности) этой строки уже нужна информация о том, что есть, а чего нет в классе Countryпоэтому этот метод должен быть определён после описания класса Country

Компиляция классов идёт в два прохода (второй проход по внутреннему представлению), поэтому при компиляции метода setCountry() эта информация уже будет. Проблема в том, что  coins - это (видимо) namespace и поле в классе City. Нужно переименовать либо namespace, либо поле класса.
PM   Вверх
NiCketT
  Дата 22.5.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно еще пару вопросов?

1. Как правильно удалять память?
У меня выделение памяти идет строкой if (map[x][y]) tmpmatrix[x][y]=new unsigned[k]; (матрица указателей), а удаление if (tmpmatrix[x][y]) delete[] tmpmatrix[x][y];. Вот как раз при удалении и вылетает.

Код

void GlobalMap::Turn(){
    std::cout<<"create tmp matrix "<<SIZE<<std::endl;
    unsigned* tmpmatrix[SIZE][SIZE]={}; //временная матрица указателей на список монет
    std::cout<<((bool)tmpmatrix[0][0])<<std::endl;
    for(int x=0; x<SIZE; x++)
        for (int y=0; y<SIZE; y++)
            if (map[x][y]) tmpmatrix[x][y]=new unsigned[k]; //инициализация соседей на временной матрице при условии существования города

    std::cout<<"read data"<<endl;
    //читаем инфу в временную матрицу
    for(int x=0; x<SIZE; x++)
      for (int y=0; y<SIZE; y++)
        if (map[x][y]){
          std::cout<<" city["<<x<<", "<<y<<']'<<std::endl;
          for (unsigned i=1; i<=k; i++){ //тип монет                    {
                int pmoney=map[x][y]->getMoney(i);
                pmoney/=1000; //количество перебрасываевымых монет
            
                if (x!=0 && map[x-1][y]){
                    tmpmatrix[x-1][y][i]+=pmoney; //левый сосед
                    map[x][y]->AddMoney(i, -pmoney);
                };
                if (x!=SIZE && map[x+1][y]){
                    tmpmatrix[x+1][y][i]+=pmoney; //правый сосед
                    map[x][y]->AddMoney(i, -pmoney);
                };
                if (y!=0 && map[x][y-1]){
                    tmpmatrix[x][y-1][i]+=pmoney; //верхний сосед
                    map[x][y]->AddMoney(i, -pmoney);
                };
                if (y!=SIZE && map[x][y+1]){
                    tmpmatrix[x][y+1][i]+=pmoney; //нижний сосед
                    map[x][y]->AddMoney(i, -pmoney);
                };
          };
        };
        std::cout<<"readd money"<<endl;
        //"одновременное" добавление денег
        for(int x=0; x<SIZE; x++)
          for (int y=0; y<SIZE; y++)
            if (map[x][y])
              for (unsigned z=1; z<=k; z++)
                map[x][y]->AddMoney(z, tmpmatrix[x][y][z]);
        
        std::cout<<"clean matrix ";
        //очищаем массив
        for(int x=0; x<SIZE; x++)
          for (int y=0; y<SIZE; y++)
            if (tmpmatrix[x][y]) delete[] tmpmatrix[x][y];
        std::cout<<"ok"<<endl;
    };


2. Какими методами(конструкторами, операторами) должен обладать класс чтоб он правильно сортировался внутри вектора? Уменя сортировка не проходит :-(
PM MAIL   Вверх
jonie
Дата 22.5.2008, 10:09 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата

1. Как правильно удалять память?
руками выдернуть планку)
Код

unsigned* tmpmatrix[SIZE][SIZE];
tmpmatrix[0][0] = new unsigned[SOMEVALUE];
delete[] tmpmatrix[0][0];
это вполне рабочий код.

просто вот это не очень хороший код:
Код

for (unsigned z=1; z<=k; z++)
                map[x][y]->AddMoney(z, tmpmatrix[x][y][z]);
ты вылетаешь за границы того что выделил, вот heap поди и портится. выделил ты всего K-1 элементов, а обращаешься в K=ому.

Цитата

2. Какими методами(конструкторами, операторами) должен обладать класс чтоб он правильно сортировался внутри вектора? Уменя сортировка не проходит :-(
конструктор копирования, operator>, oprator<, operator= (хороший тон). подробнее можно почитать, например в книге  Джосьютис Н. C++: Стандартная библиотека или Леен Аммерааль.STL для программистов на C++)



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
NiCketT
  Дата 22.5.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Непойму еще одну весчь. Есть код
Код

City* GlobalMap::AddCity(int x, int y)
{
    cout<<"Add city to map"<<endl;
    map[x][y]=new City(k);
    cout<<"Add city to map ok"<<endl;
    return map[x][y]; //возвращаем указатель
};

и
Код

City::City(unsigned coins_count){
    k=coins_count;
    coins=new unsigned[k];//={};
    cout<<" create city"<<endl;
    for (int i=0; i<k; i++) coins[i]=0;
    cout<<" clean city"<<endl;
};


Соттветственно если строка cout<<" clean city"<<endl; то после нее должна выполнятся cout<<"Add city to map ok"<<endl;, так же?
Но почему в результе сразу после вывода clean city вылетает окно с ошиькой????  smile 

+ к тому же не работает ниодин деструктор (я их пока закоментировал чтоб не мешали) и сортировка вектора (тож закоментировано). С чем это все связано?

Прикол еще в том, что прога уже однажды выдавала правильные результаты для первого набора. На второй не переходила из-за какихто ошибок в деструкторе, только я так и не понял из-за каких. Вообщем помню что потом гдет добавил какую-то строчку и она начала чудить вот-такое  smile 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  coins2.zip 16,74 Kb
PM MAIL   Вверх
NiCketT
  Дата 23.5.2008, 00:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С вопросом конструкторов разобрался. Осталось:
1. Решить проблемы с нерабочими деструктороми.
2. Узнать почему не сортируется вектор.
3. Выяснить почему выполняется только первый тест из набора (наверное из-за нерабочего деструктора)

Будут идеи?  smile 

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  coins.zip 4,96 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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