Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

C++, błędy przy kompilacji

cezar89 26 Mar 2009 00:03 2670 9
  • #1
    cezar89
    Level 11  
    Witam

    Mam taki problem, przy kompilacji pokazują mi się błądy:
    3x [Linker error] undefined reference to `liczba::liczba(int, int)'
    [Linker error] undefined reference to `liczba::operator*(liczba)'

    korzystam z DevC++

    mam trzy pliki:

    proba.cpp <-główny plik
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include "liczba.h"
    
    int main()
    {
       int s=3,d=4,a1=2,a2=5,r,t;
       liczba pierwsza(s,d);
       liczba druga(a1,a2);
       liczba nowa(r,t);
       nowa=pierwsza*druga;
       cout << nowa;
       cin >> s;
    }
    


    liczba.cpp
    <-
    plik z funkcjami
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include "liczba.h"
    using namespace std;
    liczba liczba::operator+(liczba b)
    {
    	liczba wynik;
    	char tab[10],tab2[10];
    	int x,y,i,z,k,o,l=0,h;
    	for(i=0,y=10;i<wykladnik;i++,y*=y);
    	x=czynnik*y;
    	for(i=0,y=10;i<b.wykladnik;i++,y*=y);
    	z=b.czynnik*y;
    	k=x+y;
    	
    	sprintf(tab,"%d",k);
    	h=strlen(tab);
    	i=0;
    	while(tab[h]=='0')
    	{
    		l++;
    		h--;
    	}
        for(i=0;i<h;i++) tab2[i]=tab[i];
            
            
        
        o=atoi(tab2);
        
    	
    	
    	return wynik;
    }
    
    liczba liczba::operator*(liczba b)
    {
    	liczba wynik;
    	wynik.czynnik=czynnik*b.czynnik;
    	wynik.wykladnik=czynnik+b.czynnik;
    	return wynik;
    }
    	
    liczba liczba::operator/(liczba b)
    {
    	liczba wynik;
    	wynik.czynnik=czynnik/b.czynnik;
    	wynik.wykladnik=czynnik-b.czynnik;
    	return wynik;
    }
    liczba::liczba(int a, int b)
    {
    	czynnik=a;
    	wykladnik=b;
    }
    
    

    liczba.h <- plik nagłówkowy
    #include <iostream>
    
    using namespace std;
    
    class liczba
    {
    	int czynnik;
    	int wykladnik;
    	public:
    	void wypisz();
    	liczba operator+(liczba b);
    	liczba operator/(liczba b);
    	liczba operator*(liczba b);
    	friend ostream & operator<<(ostream &druk, liczba &x)
    {
    	druk << x.czynnik <<"\n";
    	druk << x.wykladnik <<"\n";
    	return druk;
    }
    };
    


    Nie mam pojęcie czemu te błędy mi się pokazują, może mi ktoś pomoc?


    Pozdrawiam

    Kod proszę umieszczać w znacznikach code - krzychoocpp
  • #2
    mykhaylo
    Level 14  
    Na pierwszy rzut oka, nie podałeś w pliku *.h definicja konstruktora dwuparametrowego. Najlepiej podaj wszystkie typy konstruktorów które będziesz używać i zaimplementuj je. Powinno być ok.
  • #3
    cezar89
    Level 11  
    teraz liczba.h wygląda tak:

    #include <iostream>
    
    using namespace std;
    
    class liczba
    {
    	int czynnik;
    	int wykladnik;
    	public:
    	void wypisz();
    	liczba operator+(liczba b);
    	liczba operator/(liczba b);
    	liczba operator*(liczba b);
    	friend ostream & operator<<(ostream &druk, liczba &x)
    {
    	druk << x.czynnik <<"\n";
    	druk << x.wykladnik <<"\n";
    	return druk;
    }
    	
    	liczba(int a, int b);
    };


    i błędy te samo co poprzednio, bo ta deklaracja było ale ją wcięło przy kopiowaniu. Ja w tym kodzie błędu nie widzę, ma ktoś jakiś pomysł?
  • #4
    kaktus_c++
    Level 18  
    wystarczy czytać uważnie informacje wyrzucane po kompilacji:
    no matching function for call to `liczba::liczba()'
    candidates are: liczba::liczba(const liczba&) , liczba::liczba(int, int)
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include "liczba.h"
    using namespace std;
    liczba liczba::operator+(liczba b)
    {
       liczba wynik(0,0);
       char tab[10],tab2[10];
       int x,y,i,z,k,o,l=0,h;
       for(i=0,y=10;i<wykladnik;i++,y*=y);
       x=czynnik*y;
       for(i=0,y=10;i<b.wykladnik;i++,y*=y);
       z=b.czynnik*y;
       k=x+y;
       sprintf(tab,"%d",k);
       h=strlen(tab);
       i=0;
       while(tab[h]=='0')
       {
          l++;
          h--;
       }
        for(i=0;i<h;i++) tab2[i]=tab[i];
        o=atoi(tab2);
       return wynik;
    }
    
    liczba liczba::operator*(liczba b)
    {
       liczba wynik(0,0);
       wynik.czynnik=czynnik*b.czynnik;
       wynik.wykladnik=czynnik+b.czynnik;
       return wynik;
    }
    
    liczba liczba::operator/(liczba b)
    {
       liczba wynik(0,0);
       wynik.czynnik=czynnik/b.czynnik;
       wynik.wykladnik=czynnik-b.czynnik;
       return wynik;
    }
    liczba::liczba(int a, int b)
    {
       czynnik=a;
       wykladnik=b;
    }

    program teraz działa , co nieznaczy jednak że ma sens :D .
    Oczywiście brakuje tu jeszcze jednego konstruktora liczba::liczba(void);
  • #5
    cezar89
    Level 11  
    kaktus dodałem co było trzeba i nadal to samo, 2x [Linker error] undefined reference to `liczba::liczba(int, int)'

    może dla ścisłości dam jeszcze raz kody:

    proba.cpp <-główny plik
    #include "liczba.h"
    
    int main()
    {
       int s=3,d=4,a1=2,a2=5,r,t;
       liczba pierwsza(s,d);
       liczba druga(a1,a2);
    }



    liczba.cpp
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include "liczba.h"
    using namespace std;
    liczba liczba::operator+(liczba b)
    {
       liczba wynik(0,0);
       char tab[10],tab2[10];
       int x,y,i,z,k,o,l=0,h;
       for(i=0,y=10;i<wykladnik;i++,y*=y);
       x=czynnik*y;
       for(i=0,y=10;i<b.wykladnik;i++,y*=y);
       z=b.czynnik*y;
       k=x+y;
       sprintf(tab,"%d",k);
       h=strlen(tab);
       i=0;
       while(tab[h]=='0')
       {
          l++;
          h--;
       }
        for(i=0;i<h;i++) tab2[i]=tab[i];
        o=atoi(tab2);
       return wynik;
    }
    
    liczba liczba::operator*(liczba b)
    {
       liczba wynik(0,0);
       wynik.czynnik=czynnik*b.czynnik;
       wynik.wykladnik=czynnik+b.czynnik;
       return wynik;
    }
    
    liczba liczba::operator/(liczba b)
    {
       liczba wynik(0,0);
       wynik.czynnik=czynnik/b.czynnik;
       wynik.wykladnik=czynnik-b.czynnik;
       return wynik;
    }
    liczba::liczba(int a, int b)
    {
       czynnik=a;
       wykladnik=b;
    }



    liczba.h
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    class liczba
    {
    	int czynnik;
    	int wykladnik;
    	public:
    	void wypisz();
    	liczba operator+(liczba b);
    	liczba operator/(liczba b);
    	liczba operator*(liczba b);
    	friend ostream & operator<<(ostream &druk, liczba &x)
    {
    	druk << x.czynnik <<"\n";
    	druk << x.wykladnik <<"\n";
    	return druk;
    }
    	
    	liczba(int a, int b);
        liczba(void);
    
    };


    Sory za taką natrętność, jak ktoś widzi jakieś niedopatrzenie to proszę o radę


    Pozdrawiam
  • #6
    gucio22b
    Level 15  
    A spróbuj skompilować program na innym kompilatorze.... różne ustawienia mają kompilatory... wybierz np visual C++ 6.
  • #7
    kaktus_c++
    Level 18  
    ja używam wx-devcpp , wersja jakoś nie mogę dopatrzeć się która. Zapewniam że program działa.
    Czy wszystkie te pliki dodałeś do projektu?
  • #8
    cezar89
    Level 11  
    kompilowałem jeszcze na gcc i mam taki komunikat: Undefined first referenced
    symbol in file
    liczba::liczba(int, int) /var/tmp//ccxL6YzQ.o
    ld: fatal: Symbol referencing errors.

    Dodano po 16 [minuty]:

    kaktus_c++ wrote:
    Zapewniam że program działa.
    Potwierdzam :)

    kaktus_c++ wrote:
    Czy wszystkie te pliki dodałeś do projektu?
    aż wstyd się przyznać ale to był klucz do sukcesu


    Pozdrawiam
  • #9
    michalekopalek
    Level 10  
    chlopaki działa ! dziekuje bardzo ! pozdrawiam
  • #10
    Dr.Vee
    VIP Meritorious for electroda.pl
    U mnie (g++ 4.3.3) działa.

    Pozdrawiam,
    Dr.Vee