Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zewnętrzna funkcja aktualizująca vector za pomocą algorytmu transform()

Ostatnio zmodyfikowano 2012-05-24 12:33
Autor Wiadomość
kamil1338
Temat założony przez niniejszego użytkownika
[C++] Zewnętrzna funkcja aktualizująca vector za pomocą algorytmu transform()
» 2012-05-19 14:28:19
Witam, mam problem z skompilowaniem programu. Wszystko działa jak należy jeśli funkcja aktualizacja_populacji() znajduje się w tym samym pliku co int main(). Oto program:
C/C++
#include <iostream>
#include <ctime>
#include <algorithm>
#include <iterator>
#include <vector>
#include <fstream>
#include <functional>
#include "aktualizuj_populacje.h"
using namespace std;

class Town {
    string nazwa;
    int population;
    int altitude;
    enum { RAINY, SNOWY, CLOUDY, CLEAR } weather;
public:
    Town & operator =( const Town & t ) {
        if( & t != this ) {
            nazwa = t.nazwa;
            population = t.population;
            altitude = t.altitude;
            weather = t.weather;
        }
        return * this;
    }
    void SetPopulation( int i ) {
        population = i;
    }
    int GetPopulation() const {
        return population;
    }
    Town( const Town & t )
        : nazwa( t.nazwa )
        , population( t.population )
        , altitude( t.altitude )
        , weather( t.weather )
    { }
    Town( string n, int p, int a, int w )
        : nazwa( n )
        , population( p )
        , altitude( a )
    {
        if( !( w >= 0 && w <= 3 ) )
             exit( 0 );
       
        if( w == 0 )
             weather = RAINY;
       
        if( w == 1 )
             weather = SNOWY;
       
        if( w == 2 )
             weather = CLOUDY;
       
        if( w == 3 )
             weather = CLEAR;
       
    }
    friend ostream & operator <<( ostream & os, const Town & t ) {
        os << "Miejscowosc: " << t.nazwa << endl
        << "Liczba mieszkancow: " << t.population << endl
        << "Wyskokosc: " << t.altitude << " m.n.p.m" << endl;
        if( t.weather == RAINY )
             os << "Pogoda: deszczowa" << endl;
       
        if( t.weather == SNOWY )
             os << "Pogoda: snieg" << endl;
       
        if( t.weather == CLOUDY )
             os << "Pogoda: zachmurzenie" << endl;
       
        if( t.weather == CLEAR )
             os << "Pogoda: czyste niebo" << endl;
       
        os << "__________________________________" << endl;
        return os;
    }
};

class Generator_Town {
    string alfabet;
    int przedzial_g1, przedzial_g2;
    //=======
    string nazwa;
    int populacja;
    int wysokosc;
    int pogoda;
public:
    Generator_Town()
        : alfabet( "abcdefghijklmnoprstuwyz" )
        , przedzial_g1( 0 )
        , przedzial_g2( 0 )
        , nazwa( "" )
        , populacja( 0 )
        , wysokosc( 0 )
        , pogoda( 0 )
    { }
    Town operator ()() {
        while( true ) {
            przedzial_g1 = rand() % 23;
            przedzial_g2 = rand() % 23;
            next_permutation( alfabet.begin(), alfabet.end() );
            if( przedzial_g1 < przedzial_g2 && przedzial_g2 > przedzial_g1 + 5 ) {
                nazwa = alfabet.substr( przedzial_g1, przedzial_g2 );
                break;
            }
        }
        while( true ) {
            populacja = rand() % 1000000;
            if( populacja > 99 )
                 break;
           
        }
        wysokosc = rand() % 2501;
        pogoda = rand() % 4;
        return Town( nazwa, populacja, wysokosc, pogoda );
    }
};

int main() {
    ofstream out( "Towns.txt" );
    srand( time( NULL ) );
    vector < Town > v;
    generate_n( back_inserter( v ), 50, Generator_Town() );
    transform( v.begin(), v.end(), ostream_iterator < Town >( out, "\n" ), aktualizuj_populacje() );
}

Oto biblioteka aktualizuj_populacje.h:
C/C++
#ifndef AKTUALIZUJ_POPULACJE_H
#define AKTUALIZUJ_POPULACJE_H
struct aktualizuj_populacje {
    Town operator ()( Town & t ) {
        t.SetPopulation( t.GetPopulation() * 110 / 100 );
        return t;
    }
};
#endif //AKTUALIZUJ_POPULACJE_H

Błędy:

8 D:\c++\tom2\roz_06\27\27.cpp In file included from D:\c++\tom2\roz_06\27\27.cpp
4 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h ISO C++ forbids declaration of `Town' with no type
4 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h expected `;' before "operator"
8 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h expected `;' before '}' token
 C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h In function `_OutputIterator std::transform(_InputIterator, _InputIterator, _OutputIterator, _UnaryOperation) [with _InputIterator = __gnu_cxx::__normal_iterator<Town*, std::vector<Town, std::allocator<Town> > >, _OutputIterator = std::ostream_iterator<Town, char, std::char_traits<char> >, _UnaryOperation = aktualizuj_populacje]':
100 D:\c++\tom2\roz_06\27\27.cpp   instantiated from here
789 C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h no match for call to `(aktualizuj_populacje) (Town&)'

Dodam jeszcze, że wstawianie ";" tam gdzie kompilator sobie życzy jest dla mnie bez sensu :). Proszę o pomoc.

P-56988
m4tx
» 2012-05-19 14:31:18
operator ()

Z tego co wiem, to operator wstawia się w nazwie metody, a nie po spacji :P
P-56989
kamil1338
Temat założony przez niniejszego użytkownika
» 2012-05-19 14:37:40
Niestety nie rozumiem, możesz mi w takim razie napisać gotowe rozwiązanie? Czy jest "metoda"?
P-56991
Admixior
» 2012-05-19 22:35:18
Problem: kompilator w tym nagłówku nie wie co to jest "Town". Definicja tej klasy jest w main.cpp ale ona jest nieznana w aktualizuj_populacje.h.
Kompilując ten plik kompilator nigdzie wcześniej nie widział

Rozwiązanie:
Definicje klasy Town bez funkcji wrzuć do oddzielnego pliku np.: Town.h.
Do wszystkich następnych plików gdzie używasz Town dorzucaj "#include "Town.h" (czyli do aktualizuj populacje.h i main.cpp)
P-57016
kamil1338
Temat założony przez niniejszego użytkownika
» 2012-05-24 12:33:19
Nie było mnie jakiś czas. Dziękuję za odpowiedz.
P-57275
« 1 »
  Strona 1 z 1