Klasy - dodawanie wyrazow poprzez operator

0

Witam,

Mam do zrobienia program. Na on polegać na tym, że zapisujemy do tablicy jakiś wyraz, potem kolejny wyraz i następnie operatorem+ łączymy ze sobą te wyrazy zapisując je do jednej tablicy. Kod programu wygląda tak:

#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

class Cnapis
{
	public:
	char wyraz[100];
	Cnapis();
	Cnapis(char wyraz[100]);
	Cnapis(const Cnapis &x);
	Cnapis operator+(const Cnapis &x);
	friend istream& operator>>(istream& str, Cnapis &x);
	friend ostream& operator<<(ostream& str, const Cnapis &x);
};

Cnapis::Cnapis()
{
	char wyraz[100] = {};
}

Cnapis::Cnapis(const Cnapis &x)
{
    wyraz[100] = x.wyraz[100];
}

Cnapis Cnapis::operator+(const Cnapis &x)
{
	Cnapis napis;
	napis=strcpy(wyraz,x.wyraz);
	return napis;
}


ostream& operator<<(ostream& str, const Cnapis &x)
{
	cout<<"Napis: "<<x.wyraz<<endl;
	return str;
}

istream& operator>>(istream& str, Cnapis &x)
{
	cout<<"Podaj wyraz"<<endl;
	cin>>x.wyraz;
	return str;
}

int main()
{
	Cnapis A;
	Cnapis B;
	Cnapis C;
	cin>>A;
	cin>>B;
	C=A+B;
	cout<<C;
	system("pause");
	return 0;
} 

Nie wiem zupełnie co jest tutaj źle. Wyrzuca mi dwa błędy:

  1. Error 2 error LNK1120: 1 unresolved externals
  2. Error 1 error LNK2019: unresolved external symbol "public: __thiscall Cnapis::Cnapis(char * const)" (??0Cnapis@@QAE@QAD@Z) referenced in function "public: class Cnapis __thiscall Cnapis::operator+(class Cnapis const &)" (??HCnapis@@QAE?AV0@ABV0@@Z)
0

1)Tak wyrazów nie skopiujesz

wyraz[100] = x.wyraz[100];

użyj strcpy.

2)Nie zdefiniowałeś jednego z konstruktorów.

3)To też jest źle:

napis=strcpy(wyraz,x.wyraz);

Powinno być raczej:

strcpy(napis.wyraz,wyraz);
strcat(napis.wyraz,x.wyraz);
0

class cnapis:public std::string{}; ale to by było chyba oszukiwanie (albo nawet typedef std::string cnapis).

0
 #include <stdio.h>
#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

class Cnapis
{
	public:
	char wyraz[100];
	Cnapis();
	Cnapis(char wyraz[100]);
	Cnapis(const Cnapis &x);
	Cnapis operator+(const Cnapis &x);
	Cnapis& operator=(Cnapis B);
	friend istream& operator>>(istream& str, Cnapis &x);
	friend ostream& operator<<(ostream& str, const Cnapis &x);
};

Cnapis::Cnapis()
{
	char wyraz[100];
	wyraz[0]=0;
}

Cnapis::Cnapis(const Cnapis &x)
{
    wyraz[100] = x.wyraz[100];
}

Cnapis Cnapis::operator+(const Cnapis &x)
{
	Cnapis napis;
	strcpy(napis.wyraz,wyraz);
	strcat(napis.wyraz,x.wyraz);
	return napis;
}


ostream& operator<<(ostream& str, const Cnapis &x)
{
	cout<<"Napis: "<<x.wyraz<<endl;
	return str;
}

istream& operator>>(istream& str, Cnapis &x)
{
	cout<<"Podaj wyraz"<<endl;
	cin>>x.wyraz;
	return str;
}

Cnapis& Cnapis::operator=(Cnapis B)
{
	strcpy(wyraz,B.wyraz);
	return *this;
}


int main()
{
	Cnapis A;
	Cnapis B;
	Cnapis C;
	cin>>A;
	cin>>B;
	C=A+B;
	cout<<C;
	system("pause");
	return 0;
}

Ten program działa u mojego kolegi, który używa Deva, a u mnie na Visualu nie działa, wie ktoś o co z tym chodzi?
Gdy go odpalam to jako wynik daje mi jakieś krzaczki, masę krzaczków wyświetla.

0

To jest jakiś kosmos :p To, że u kolegi zadziałało to czysty przypadek.
Pomyśl co się dzieje w konstruktorze bezargumentowym i co się dzieje w konstruktorze kopiującym - całość obu jest błędna i pozbawiona sensu. Dodatkowo kopiujący może w każdej chwili spowodować segfault'a.

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