Przedefiniowanie operatorow

Przedefiniowanie operatorow
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Witam ,

Mam drobny problem , napisałem kalkulator na duzych liczbach , takich które nie mieszczą sie w normalny zakres np 100! ,ten kalkulator działą bez zarzutu ale zajmijmy sie dodawaniem jest to funkcja która pobiera 2 stringi i zwraca string wynikowy , definicja jest w pliku dodawanie.cpp ,jest tez plik dodawanie.h z deklaracja , posiadalem plik main.cpp gdzie miałem switcha by user mógł wybierać operacje ale postanowiłem przedefiniować operatory np operator dodawania , wiec usunełem main.cpp i stworzyłem main1.cpp , mam także pliki DuzaLiczba.h i DużaLiczba.cpp próbuje przedefinować operatory za pomocą funkcji dodawania , przeczytałem że mozną zrobić to przez metode klasy wiec do klasy dodałem deklaracje funkcji dodawania , na dole udostępniam kod . Mam pytanie czy wgl dobrze sie za to zabrałem , funkcja dodawania dziala dobrze ale nie mogę jej prawidłowy przedefiniować ciągle są problemy w chwili obecnej

Kopiuj
C:\Users\Damianek\Desktop\Próba_definiowania_operatorow\x000x\main1.o	main1.cpp:(.text+0xe2): undefined reference to `DuzaLiczba::operator+(DuzaLiczba const&) const' 

Czy ma ktoś pomysł?

Plik main1cpp

Kopiuj
	 DuzaLiczba liczba1;


  DuzaLiczba liczba3("1234567890087554545454656543");
    DuzaLiczba liczba2("999999999999999999999999999999");
    
  
  l2 = l2+l3;
  
	
	
system("pause");
return 0;
}
 

plik DuzaLiczba.h

Kopiuj
 class DuzaLiczba{
	 string wartosc;
     
   public:
     
        DuzaLiczba();
     
       DuzaLiczba(string value) 
             
       {wartosc=value;
        }
        string dodawanie(string liczba1, string liczba2);
        DuzaLiczba operator+(const DuzaLiczba&) ;
	 
	
};

Plik DuzaLiczba.cpp

Kopiuj
 DuzaLiczba::DuzaLiczba()
{
   wartosc="0";
}


inline DuzaLiczba DuzaLiczba::operator+(const DuzaLiczba& n)  {
     return dodawanie(wartosc,n.wartosc);
     }
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
DuzaLiczba operator+(const DuzaLiczba&)const;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Po poprawieniu na const jak napisales mam blad

Kopiuj
 17	35	Duza_liczba.cpp	[Error] passing 'const DuzaLiczba' as 'this' argument of 'std::string DuzaLiczba::dodawanie(std::string, std::string)' discards qualifiers [-fpermissive]

i podkresla linijke DuzaLiczba DuzaLiczba:: operator+(const DuzaLiczba& n)const {
dodawanie(wartosc,n.wartosc); <---------- tutaj bład
}

Kopiuj

Jakby argumenty byly niepoprawne

Poszukałem że to moze byc poblem ze wywoluje nie const metode/funkcje w funkcji const ale dodanie const do funkcji dodawania nic nie zmienilo...
edytowany 1x, ostatnio: murek1993
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Kopiuj
static string dodawanie(string liczba1, string liczba2);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Niestety dodanie słowa static albo const przy deklaracji i definicji dodawania nic nie dalo...ten sam bład

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Więc podaj cały kod.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:21
0
Kopiuj
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class DuzaLiczba
{
	   string wartosc;

	   string dodawanie(string liczba1, string liczba2) const { return "WYNIK"; } 
       //tutaj trzeba zmienić na faktyczne dodawanie na stringach
 
   public:
	   DuzaLiczba():wartosc("0") { }
 
       DuzaLiczba(string value):wartosc(value) { }

	   DuzaLiczba operator+(const DuzaLiczba& n) const { return DuzaLiczba(dodawanie(wartosc, n.wartosc)); }

	   friend ostream & operator<< (ostream &out, const DuzaLiczba &n) { out << n.wartosc << endl; return out;}
};


int main()
{
	DuzaLiczba liczba3("1234567890087554545454656543");
    DuzaLiczba liczba2("999999999999999999999999999999");
 
	liczba2 = liczba2+liczba3;

	cout << liczba2;
 
	return 0;
}
edytowany 8x, ostatnio: mateusz2813
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Pewnie czytasz odpowiedzi na kilku forach i jednocześnie stosujesz.
1.

Kopiuj
string dodawanie(string liczba1, string liczba2) const { return "WYNIK"; }
  • skompiluje się i będzie działać ale to bubel projektowy
Kopiuj
static string dodawanie(string liczba1, string liczba2) const { return "WYNIK"; }
  • kolizja klauzul, nie może być jednocześnie static i const
Kopiuj
static string dodawanie(string liczba1, string liczba2) { return "WYNIK"; }
  • poprawne rozwiązanie, jedynie warto wrzucić do sekcji private

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M2
Faktycznie, masz rację. Umknęło mi, że dodawanie(string, string) nie działa na żadnym obiekcie DuzaLiczba, więc najlepiej static. ;)
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Dobrze wiec pozmieniałem tak jak kod powyzej uzyłem static jak sami zasugerowaliscie , nie rozumiem tylko o co chodzilo

Kopiuj
//tutaj trzeba zmienić na faktyczne dodawanie na stringach 

w te miejsce nie wklejałem definicji dodawania tam jest tylko deklaracja mam includa na plik dodawanie.h a faktyczna definicja jest w pliku dodawanie.cpp wiec powinno dzialac , po tych zmianach mam taki blad Duza_liczba.o Duza_liczba.cpp:(.text+0xc0): undefined reference to `DuzaLiczba::dodawanie(std::string, std::string)'

Kopiuj
  dopisalem static w pliku dodawanie.h , dodawanie.cpp i DuzaLiczba.h  , bład wyglada jakby nie widzial kompilator dodawania
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Podaj kod lub pytaj do wróżbitów.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

czego dokladnie kod chcesz? podalem własciwie wszystko

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

kompilator twierdzi że nie masz (undefined reference) DuzaLiczba::dodawanie(std::string, std::string) więc pokaż jak i gdzie masz.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Czy ma jakieś znaczenie że dodawanie jest w innym pliku niz DuzaLiczba.cpp ? Ten bład wynika jakby dodawanie nie bylo widoczne w danym miejscu czy dodawanie powinno być funkcją zaprzyjazniona?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Przecież zaznaczyłeś jako statyczną, takową powinna zostać przy definicji.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Szukajac rozwiazania zmienile troche strukture a mianowicie

Kopiuj
DuzaLiczba DuzaLiczba:: operator+(const DuzaLiczba& n)  {
     this->wartosc = dodawanie(this -> wartosc,n.wartosc) ;
       return *this;
     }
 

Powstał bład

Kopiuj
Duza_liczba.cpp	[Error] prototype for 'DuzaLiczba DuzaLiczba::operator+(const DuzaLiczba&)' does not match any in class 'DuzaLiczba' 

oraz kolejny

Kopiuj
Duza_liczba.h	[Error] candidate is: DuzaLiczba DuzaLiczba::operator+(const DuzaLiczba&) const 

który dotyczy deklaracji w pliku h

Kopiuj
DuzaLiczba operator+(const DuzaLiczba&)const; 
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

I którego słowa w tym komunikacie nie rozumiesz?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:21
1

Deklaracja:

Kopiuj
DuzaLiczba operator+(const DuzaLiczba&)const; 

Implementacja:

Kopiuj
DuzaLiczba DuzaLiczba::operator+(const DuzaLiczba& n) { ... }
Kopiuj
const

nie można pominąć przy implementacji.

edytowany 3x, ostatnio: mateusz2813
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Jest dokładnie mateusz2813 tak jak napisałeś ,jesli do implementacji dopisze const w taki sposob

Kopiuj
DuzaLiczba DuzaLiczba:: operator+(const DuzaLiczba& n)const  {
     this->wartosc = dodawanie(this -> wartosc,n.wartosc) ;  <--- tutaj bład
       return *this; } 

to wtedy wystepuje długi bład

Kopiuj
[Error] passing 'const string {aka const std::basic_string<char>}' as 'this' argument of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(std::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' discards qualifiers [-fpermissive] 
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

@murek1993, czy jeżeli napiszesz:

Kopiuj
int a=3,b=4;
a+b;

to wartość a zmieni się na 7 ? Właśnie to próbujesz zrobić.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0
_13th_Dragon napisał(a):

@murek1993, czy jeżeli napiszesz:

Kopiuj
int a=3,b=4;
a+b;

to wartość a zmieni się na 7 ? Właśnie to próbujesz zrobić.

nie zmieni sie , ale przecież u mnie wynik dodawania chce wpisac gdzies

M1
a gdy nawet nigdzie nie wpisze i nic nie zwrócę przez return to jak zawsze jest uza_liczba.o Duza_liczba.cpp:(.text+0xc0): undefined reference to `DuzaLiczba::dodawanie(std::string, std::string)'
M2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:21
0

Dopisanie const przy nazwie metody mówi, że ta metoda nie modyfikuje obiektu klasy, na którym zostanie wywołana. U Ciebie obiekt ten jest modyfikowany, więc ta metoda nie może być opatrzona modyfikatorem const. Możesz skasować const (o ile nie pociągnie to za sobą żadnych poważnych zmian) albo zmienić kod na:

Kopiuj
DuzaLiczba DuzaLiczba::operator+(const DuzaLiczba& n) const
{
      return DuzaLiczba( dodawanie(wartosc, n.wartosc) );
} 

oczywiście, o ile w klasie jest konstruktor jednoparametrowy.

edytowany 5x, ostatnio: mateusz2813
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

przy usunieciu const to kompilator sygnalizuje ze jest potrzebny , a przy Twoim kodzie wystepuje bład

Kopiuj
Duza_liczba.o	Duza_liczba.cpp:(.text+0xc0): undefined reference to `DuzaLiczba::dodawanie(std::string, std::string)' 

argumentowy konstruktor u mnie to

Kopiuj
  DuzaLiczba(string value):wartosc(value) { } 
M2
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 4 lata
  • Postów:21
1

Pokaż deklarację funkcji dodawanie i nagłówek jej implementacji.

Właściwie to nie bardzo rozumiem problem: http://ideone.com/1pxgk3

edytowany 3x, ostatnio: mateusz2813
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0
Kopiuj
static string dodawanie(string& liczba1, string& liczba2){

bład Duza_liczba.o Duza_liczba.cpp:(.text+0xc0): undefined reference to `DuzaLiczba::dodawanie(std::string, std::string)'

Kopiuj
  wydaje mi sie ze kompilator nie widzi definicji dodawania w pliku DuzaLiczba.cpp bo rzeczywiście tam jej nie ma , ona jest w innym pliku dodawania.cpp wiec zeby nie powielac kodu i kod był uporządkowany stosuje <code class="cpp">#include "dodawanie.h" 

Jednak kompilator jakby nie widzal

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

@murek1993, programowanie metodą prób i błędów z góry skazane na porażkę, już poszedłeś na trzeci krąg gonienia się w piętkę.
Weź przeczytaj jakiś kurs.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Witajcie, czesciowo rozwiazałem moj problem tzn zastanawialem sie czy wgl mozna uzywac funkcji dodawania jako składowe klasy DuzaLiczba gdzie definicja jest pliku dodawania.cpp deklaracja w dodawanie.h i deklaracja dodawania jako metody klasy w pliku DuzaLiczba.h w pliku DuzaLiczba.cpp jest tylko

Kopiuj
#include "dodawanie.h" 

Chciałem to sprawdzic wiec skompilowałem byle jaki program dzialajacy z uczelni który był w 1 pliku i zawierał min 1 metode np taki #include <iostream>
using namespace std;

class Vector {
double x, y, z;

public:
void set(double xx=0, double yy=0, double zz=0);
double dot_product(const Vector& w);
};

void Vector::set(double xx, double yy, double zz) {
x = xx;
y = yy;
z = zz;
}
double Vector::dot_product(const Vector& w) {
return xw.x + yw.y + z*w.z;
}

int main() {
Vector w1, w2;
w1.set(1, 1, 2);
w2.set(1,-1, 2);
cout << "w1*w2 = " << w1.dot_product(w2) << endl;
}

Kopiuj

rozdzieliłem go na pliki Vector.cpp Vector.h a metode 
```cpp
set 

wrzuciłem pliku funkcja.cpp deklaracje do funkcja.h w pliku funkcja.cpp dodałem #include "Vector.h"

Kopiuj
  plik funkcja.cpp wygladał tak <code class="cpp">#include "Vector.h"  
void Vector::set(double xx, double yy, double zz) {
    x = xx;
    y = yy;
    z = zz;
}
 

skorzystałem z porad mateusz2813 http://ideone.com/1pxgk3 czyli dodałem w pliku funkcja.cpp operatory zakresu do Vector

Kopiuj
void Vector::set(double xx, double yy, double zz) 

wcześniej tego nie było tak jak było tego includa do vector.h . Skompilowałem i działa tak samo jak przedtem ,czyli przed rozdzieleniem na pliki , skoro tam działało to i u mnie powinno wiec także skorzystałem z tych porad w swoim kodzie ale ze ciągle jakieś problemy były z const

Kopiuj
 albo <code class="cpp">static 

to zostały usuniete te słowa kluczowe i z funkcji dodawania i przy przedefiniowaniu operatora+ i odziwo skompilowało sie i wyswietliło poprawny wynik ;-) . Jednak sprawdziłem w źrodłach ze te słowa kluczowe są potrzebne wiec dalej próbuje to uruchomić i mam 1 bład. Obecnie moje nagłowki i pliki wygladaja tak
main

Kopiuj
 #include "Duza_liczba.h"



int main(int argc, char** argv)
{
	 DuzaLiczba liczba1;


  DuzaLiczba liczba3("11");
    DuzaLiczba liczba2("11");
    
   
  liczba1 = liczba2+liczba3;
  cout<<liczba1<<endl;
  
	
	
						system("pause");
						return 0;
} 

DuzaLiczba.h

Kopiuj
class DuzaLiczba{

	 string wartosc;
     static string dodawanie(  const string& liczba1,  const string& liczba2);
   public:
 
        DuzaLiczba();
    
           
      DuzaLiczba(string value):wartosc(value) { }
      
      
        DuzaLiczba operator+( const DuzaLiczba& ) const;
        
        friend ostream & operator<< (ostream &out, const DuzaLiczba &n) { out << n.wartosc << endl; return out;}
	 


	
}; 

DuzaLiczba.cpp

Kopiuj
 #include "Duza_liczba.h"
#include "dodawanie.h"

using namespace std;


 DuzaLiczba::DuzaLiczba():wartosc("0") { }


DuzaLiczba DuzaLiczba:: operator+(const DuzaLiczba& n)  const{
  
      return DuzaLiczba( dodawanie(wartosc, n.wartosc) );
  
     }

dodawanie.cpp naglowek funkcji

Kopiuj
string DuzaLiczba::dodawanie( const string& liczba1,  const string& liczba2) {} 

dodawanie.h

Kopiuj
 static string dodawanie(const  string& liczba1, const string& liczba2);

a bład to-->

Kopiuj
 main1.o	main1.cpp:(.text+0xe2): undefined reference to `DuzaLiczba::operator+(DuzaLiczba&)'
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Masz w głowie (odnośnie C++) kompletny miszmasz, mylisz metody z funkcjami.
Jeżeli jakiś debil ograniczył ci wolność wskazując że funkcja dodawanie ma być w pliku dodawanie.h to:
dodawanie.h

Kopiuj
#include <string.h>
string dodawanie(const  string &a,const string &b);

dodawanie.cpp

Kopiuj
#include "dodawanie.h"
string dodawanie(const  string &a,const string &b) { return a+b; } // jak na razie zwyczajnie sklei

DuzaLiczba.h

Kopiuj
#include "dodawanie.h"

class DuzaLiczba
  {
   string value;
   public:
   DuzaLiczba(const string &value=string("")):value(value) {}
   DuzaLiczba operator+(const DuzaLiczba &n) const { return DuzaLiczba(dodawanie(value,n.value)); }
   friend ostream &operator<<(ostream &out,const DuzaLiczba &n) { return out<<n.value; }
  };

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Twoj zapis nic nie zmienil widze ze glownie zmieniles/skasowales

Kopiuj
string DuzaLiczba::dodawanie( const string& liczba1,  const string& liczba2) 

oprócz poprzedniego błedu wystapil kolejny Duza_liczba.o Duza_liczba.cpp:(.text+0xa0): undefined reference to `DuzaLiczba::dodawanie(std::string const&, std::string const&)'

Kopiuj
  znalazlem jeszcze cos takiego  http://4programmers.net/Forum/C_i_C++/143484-C++_undefined_reference_to_template_friend
edytowany 2x, ostatnio: murek1993
M1
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:52
0

Witam,

Dziekuje wam mateusz2813 **** _13th_Dragon za pomoc wasze rady byly bardo przydatne , problem był jednak w kodzie moich operacji ale bez waszej pomocy nie dałbym rady.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.