Błąd kompilacji, niezdefiniowany identyfikator

0

Czesc, cwicze sobie w wakacje c++. Mam taka klase:

Plik .h:

#pragma once
#include<iostream>
using namespace std;
#include <string>

class zespolone
{
private:
	double re;
	double im;
	string nazwa;
public:
		//KONSTRUKTORY
	/*explicit*/ zespolone(double rr=0, double ii=0, string nn = "Anonim"); //explicit zeby konstruktor nie byl uzywany jako konwerter
	zespolone(const zespolone& zrodlo); //konstruktor kopiujacy

		//DESTRUKTOR
	~zespolone(void);
	
		//OPERATORY
	zespolone& operator=(const zespolone& zrodlo) //operator przypisania //& - dzieki niemu przypisanie kaskadowe (a+b+c...+n)
	{
		//sprawdzenie czy to nie to samo
		if(this==&zrodlo) return *this;

		re = zrodlo.re;
		im= zrodlo.im;

		cout<<"W akcji byl operator przypisania"<<endl;
		return *this; 
	}
//operatory konwersji
	operator double() //konwersja operatorowa na double
	{
		cout<<"W akcji byl operator konwersji double"<<endl;
		return re;
	}
	
	operator int() //konwersja operatorowa na intiger
	{
		cout<<"W akcji byl operator konwersji int"<<endl;
		return (int)re;
	}

			//FUNKCJE
	void pokaz() //wypisuje dane liczby zespolonej na ekran
	{
		cout<<nazwa<<", czesc rzeczywista: "<<re<<", czesc urojona: "<<im<<endl;
	}

	void NowaNazwa(string nowa) //zmienia nazwe danej liczby zespolonej
	{
		nazwa = nowa;
	}

zespolone dodaj(zespolone pierwsza, zespolone druga);

}; 

**Plik .cpp: **

#include "StdAfx.h"
#include "zespolone.h"


zespolone::zespolone(double rr, double ii, string nn): re(rr), im(ii), nazwa(nn)
{
	cout<<endl<<"uzyto konstruktora z dwoma argumentami domniemanymi"<<endl;
}

zespolone::zespolone(const zespolone& zrodlo)
{
	nazwa = zrodlo.nazwa;
	re = zrodlo.re;
	im = zrodlo.im;
	cout<<endl<<"Uzyto konstruktora kopiujacego"<<endl;
}

zespolone::~zespolone(void)
{
	cout<<endl<<"Do akcji wkroczyl destruktor"<<endl;
}

zespolone zespolone::dodaj(zespolone pierwsza, zespolone druga)
{
	zespolone rezultat(0,0,"rezultat");
	rezultat.re = pierwsza.re + druga.re;
	rezultat.im = pierwsza.im + druga.im;
	return rezultat;
}

Probuje uzyc funkcji dodaj w mainie i wyskakuje mi ze:

1)error C3861: 'dodaj':identifer not found
2)IntelliSense: identifer "dodaj" is undefinded

Czemu to nie dziala?

0

Pokaż, ten main. Patrząc na sygnaturę tej metody to najprawdopodobniej źle ją wywołujesz.

0
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "zespolone.h"

zespolone wynik, dana1(2.4), dana2(3.6, 9.1), dana3(5.2, 3.0, "Kapitan");

int _tmain(int argc, _TCHAR* argv[])
{
	wynik.NowaNazwa("Wynik");
	dana2.NowaNazwa("Dana2");
	
	cout<<"Co mamy na poczatku: "<<endl;
		wynik.pokaz();
		dana1.pokaz();
		dana2.pokaz();
		dana3.pokaz();
		cout<<endl;
	cout<<"Dodajemy 3 i dana1...."<<endl;
	wynik= dodaj(dana1, zespolone(3));
	wynik.pokaz();
		cout<<endl;
		system("pause");
		system("cls");

	system("pause");
	return 0;
}
  • używaj tagów ````, tytułuj poprawnie wątki - msm *
0

wpisywalem tez: wynik = dodaj(dana1,dana2);
dalej blad. w zasadzie chcialem to zrobic zeby konwersjami dzialalo mna przyklad takie cos: wynik = dodaj(dana1, 6.7);

0

"dodaj" to jest funkcja globalna? ;>

0

dodaj jest niestatyczną metodą klasy i z tego powodu MUSI być wywoływana na rzecz obiektu tej klasy.
Czyli musi być obiekt.dodaj(arg1, arg2);. Co od razu pokazuje, że taka konstrukcja tej funkcji nie ma sensu.
Powinno to wyglądać tak obiekt.dodaj(arg); jako argument liczba, którą dodajesz, a obiekt to liczba do której dodajesz i ona też ma się zmienić i przechować wynik.

0

mam taki konstruktor/konstruktor konwertujacy:
deklaracja w pliku .h:
zespolone(double rr=0, double ii=0, string nn = "Anonim");

definicja w .cpp:
zespolone::zespolone(double rr, double ii, string nn): re(rr), im(ii), nazwa(nn)
{
cout<<endl<<"uzyto konstruktora z dwoma argumentami domniemanymi"<<endl;
}

co zrobic, zeby ten operator(jego cialo umiescilem w pliku .h):
zespolone operator+(const zespolone& zrodlo) //operator dodawania
{
zespolone rezultat;
rezultat.re = re + zrodlo.re;
rezultat.im = im + zrodlo.im;
cout<<"W akcji byl operator dodawania"<<endl;
return rezultat;
}

pozwalal na takie dzialanie:
zespolone dana, wynik;
wynik = dana + 3; (chodzi o to zeby konstrukto automatycznie sie wywolal i zamienil liczbe 3 na obiekt klasy zespolona).

0

Musisz usunąć operator rzutowania na double i rzutowania na int. Dodając zespolone + int kompilator nie wie czy zamienić zespolone na int czy int na zespolone.

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