Przedefiniowanie operatorow

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

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

	 DuzaLiczba liczba1;


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

plik DuzaLiczba.h

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

Plik DuzaLiczba.cpp

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


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

Po poprawieniu na const jak napisales mam blad

 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
}


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...
0
static string dodawanie(string liczba1, string liczba2);
0

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

0

Więc podaj cały kod.

0
#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;
}
1

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

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

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

//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)'

  dopisalem static w pliku dodawanie.h , dodawanie.cpp i DuzaLiczba.h  , bład wyglada jakby nie widzial kompilator dodawania
0

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

0

czego dokladnie kod chcesz? podalem własciwie wszystko

0

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

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?

0

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

0

Szukajac rozwiazania zmienile troche strukture a mianowicie

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

Powstał bład

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

oraz kolejny

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

który dotyczy deklaracji w pliku h

DuzaLiczba operator+(const DuzaLiczba&)const; 
0

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

1

Deklaracja:

DuzaLiczba operator+(const DuzaLiczba&)const; 

Implementacja:

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

nie można pominąć przy implementacji.

0

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

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

[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] 
0

@murek1993, czy jeżeli napiszesz:

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

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

0
_13th_Dragon napisał(a):

@murek1993, czy jeżeli napiszesz:

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

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:

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

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

0

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

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

argumentowy konstruktor u mnie to

  DuzaLiczba(string value):wartosc(value) { } 
1

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

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

0
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)'

  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

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.

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

#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;
}


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"

  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

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

 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

 #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

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

 #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

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

dodawanie.h

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

a bład to-->

 main1.o	main1.cpp:(.text+0xe2): undefined reference to `DuzaLiczba::operator+(DuzaLiczba&)'
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

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

dodawanie.cpp

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

DuzaLiczba.h

#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; }
  };
0

Twoj zapis nic nie zmienil widze ze glownie zmieniles/skasowales

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&)'

  znalazlem jeszcze cos takiego  http://4programmers.net/Forum/C_i_C++/143484-C++_undefined_reference_to_template_friend
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1