print'owanie obiektu innej klasy

0

Witam,

Mam następujący problem. Zadeklarowałem i zdefiniowałem klasy w osobnych plikach. Zrobiłem konstruktory ale mam problem z napisaniem metody print() dla klasy Kolor. Nie wiem jak wyświetlić nazwę czyli Pole typu Tstring będące inną klasą.

Klasa Kolor (deklaracja):

#pragma once
#include <iostream>
#include "TString.h"

using namespace std;

class Kolor 
{
	int R,G,B;
	Tstring nazwa;
public:
	
	Kolor();
	Kolor(Tstring);
	Kolor(Tstring, int a, int s, int d);
	Kolor(int x, int y, int z);
	~Kolor();

	void print()
	{                            <b>??????????????????????</b>
	};

};

Klasa kolor - .cpp

#include "kolor.h"


Kolor::Kolor()
{
	cout << "konstruktor bezargumentowy Kolor" << endl;
}

Kolor::Kolor(Tstring p)
{
 nazwa=p;

 cout << "konstruktor Tstring - argumentowy Kolor" << endl;
}

Kolor::Kolor(Tstring p, int a, int s, int d)
{
    nazwa=p;

    R=a;
	G=s;
	B=d;
	cout << "kontruktor 4 - argumentowy Kolor" << endl;
}

Kolor::Kolor(int x, int y, int z)
{
	R=x;
	G=y;
	B=z;
	cout << "kontruktor 3 - argumentowy Kolor" << endl;
}

Kolor::~Kolor()
{
	cout << "destruktor Kolor" << endl;
};

a Tstring wyglada tak - .h

#pragma once

#include <iostream>
using namespace std;


class Tstring
{
	char *str;
	int len;

public:
	Tstring();
	Tstring(char *);
	Tstring(char, int);
	~Tstring();
	void print()
{
	cout << "zawartosc pola str :" << str << endl;
	
	}; 
};

i .cpp

#include "TString.h"



Tstring::Tstring(){str = 0; len = 0;
cout << "Konstruktor bezargumentowy Tstring"<< endl;}

Tstring::Tstring(char * A)
{
	len=strlen(A);
	str = new char[len+1];
	strcpy(str,A);
	cout << "Konstruktor char* - argumentowy Tstring"<< endl;
}

Tstring::Tstring(char A, int l)
{
	len=l;
	str = new char[len+1];
	for(int i=0;i<len;i++)
	str[i]=A;
	str[len]=0;
	cout << "Konstruktor char, int argumentowy Tstring"<< endl;
}

Tstring::~Tstring()
{   if(str)
	delete []str;
    cout << "destruktor Tstring"<< endl;
}

jak napisać metodę print() w klasie Kolor by wyświetlała RGB i nazwę?

z góry dzięki za pomoc

0

Łatwiej byłoby użyć po prostu string. Jeżeli chcesz się bawić tym co masz to musisz do klasy Tstring dodać metodę która zwróci ci albo kopię albo referencję/wskaźnik do zawartości (zależnie od potrzeby/ochrony danych), a następnie użyć tej metody w metodzie print() w klasie Kolor. Z tego co widzę raczej z tym problemu nie będziesz miał/a więc zostawiam to tobie.

0
venomxxl napisał(a)

Łatwiej byłoby użyć po prostu string. Jeżeli chcesz się bawić tym co masz to musisz do klasy Tstring dodać metodę która zwróci ci albo kopię albo referencję do zawartości, a następnie użyć tej metody w metodzie print() w klasie Kolor. Z tego co widzę raczej z tym problemu nie będziesz miał/a więc zostawiam to tobie.

szczerze mówiąc nie bardzo rozumiem;) możesz zrobić jakiś bardziej szczegółowy zarys tego?

0

Na przykład:

class Tstring{
...
public:
...
    char * getContents(); // Zwróci kopię/wskaźnik do zawartości
};

class Kolor{
...
    Tstring str;
public:
...
    void print();
};

void Kolor::print(){
    std::cout << "Nazwa: " << str.getContents() << std::endl;
    // Wyświetlenie RGB
}
0
venomxxl napisał(a)

Na przykład:

class Tstring{
...
public:
...
    char * getContents(); // Zwróci kopię/wskaźnik do zawartości
}

class Kolor{
...
    Tstring str;
public:
...
    void print();
}

void Kolor::print(){
    std::cout << "Nazwa: " << str.getContents() << std::endl;
    // Wyświetlenie RGB
}

hmm zrobilem tak i następujące błędy wyszły...

error LNK2019: unresolved external symbol "public: char * __thiscall Tstring::getContents(void)" (?getContents@Tstring@@QAEPADXZ) referenced in function "public: void __thiscall Kolor::print(void)" (?print@Kolor@@QAEXXZ)

fatal error LNK1120: 1 unresolved externals
</cpp>
0
error LNK2019: unresolved external symbol "public: char * __thiscall Tstring::getContents(void)" (?getContents@Tstring@@QAEPADXZ) referenced in function "public: void __thiscall Kolor::print(void)" (?print@Kolor@@QAEXXZ)

fatal error LNK1120: 1 unresolved externals

Bo nie podałem ci definicji metody Tstring::getContents(). Zostawiłem to tobie, bo nie moja rola podać ci pełny kod. :P

Jeżeli dalej nie rozumiesz, musisz sam wypełnić:

char * Tstring::getContents(){
    // Przygotowanie i zwrócenie kopii zawartości lub zwrócenie wskaźnika do zawartości
}
0

Jeżeli dalej nie rozumiesz, musisz sam wypełnić:

char * Tstring::getContents(){
    // Przygotowanie i zwrócenie kopii zawartości lub zwrócenie wskaźnika do zawartości
}

</quote>

mam tak:

class Tstring
{   
	 
	char *str;
	int len;

public:
	Tstring();
	Tstring(char *);
	Tstring(char, int);
	
	char * getContents()
	{   
		nazwa=*str;
		return nazwa;
	};

Kolor:

 class Kolor 
{
	int R,G,B;
	Tstring nazwa;
public:
	
	Kolor();
	Kolor(Tstring);
	Kolor(Tstring, int a, int s, int d);
	Kolor(int x, int y, int z);
	~Kolor();

	void print()
	{cout << "zawartosc pola R,G,B :" << R << G << B << endl;
	 cout << "Nazwa: " << nazwa.getContents() <<endl;
	};

};

i dalej psińco:|

0
class Tstring{   
	 
	char *str;
	int len;

public:
	Tstring();
	Tstring(char *);
	Tstring(char, int);
	
	char * getContents()
	{   
		return str;
        }
};

Wyjaśnić? Myślę, że to jasne.</quote>

0
venomxxl napisał(a)
class Tstring{   
	 
	char *str;
	int len;

public:
	Tstring();
	Tstring(char *);
	Tstring(char, int);
	
	char * getContents()
	{   
		return str;
        }
};

Wyjaśnić? Myślę, że to jasne.
</quote>

ok ok ja rozumiem co się dzieje:) niemniej jednak nie wiem jak to potem przypisać pod pole nazwa by z niego wyswietlac

sorry, za takie pewnie banalne pytania ale jestem poki co zielony w klasach

0

niemniej jednak nie wiem jak to potem przypisać pod pole nazwa by z niego wyswietlac

Może trochę jaśniej?
Wydaje mi się, że chodzi ci o to żeby zmienić nazwę koloru bez potrzeby tworzenia nowego obiektu Tstring:

class Tstring{
    ...
public:
    ...
    void setContents(char * s); // Zapisuje całą zawartość łańcucha s
    void setContents(char * s, int l); // Zapisuje l znaków z łańcucha s
    void setContents(char c, int n); // Zapisuje n znaków c
};

Tak jak wcześniej musisz sam zapisać definicje owych metod. Nie musisz używać ani drugiej ani trzeciej metody ale widząc konstruktory dodałem tą wersję.

0

nie nie:) po prostu, mam elegancko zwrócony ten wskaznik, ale wyświetlanie mam zrobic w oparciu o pole " Tstring nazwa". Czyli musze przypisać jakoś owy wskaźnik pod to pole?

0
bekslesz napisał(a)

nie nie:) po prostu, mam elegancko zwrócony ten wskaznik, ale wyświetlanie mam zrobic w oparciu o pole " Tstring nazwa". Czyli musze przypisać jakoś owy wskaźnik pod to pole?

Nie rozumiem. Wyświetlanie masz oparte o pole Tstring nazwa. Używając nazwa.getContents() otrzymujesz wskaźnik do pola char * str w Tstring nazwa. Pisząc std::cout << nazwa.getContents() wpisujesz do standardowego wyjścia dane pod adresem char * str który znajduje się w obiekcie klasy Tstring.

0
venomxxl napisał(a)
bekslesz napisał(a)

nie nie:) po prostu, mam elegancko zwrócony ten wskaznik, ale wyświetlanie mam zrobic w oparciu o pole " Tstring nazwa". Czyli musze przypisać jakoś owy wskaźnik pod to pole?

Nie rozumiem. Wyświetlanie masz oparte o pole Tstring nazwa. Używając nazwa.getContents() otrzymujesz wskaźnik do pola char * str w Tstring nazwa. Pisząc std::cout << nazwa.getContents() wpisujesz do standardowego wyjścia dane pod adresem char * str który znajduje się w obiekcie klasy Tstring.

ok czyli ja w takim razie nie rozumiem:)

0
bekslesz napisał(a)
venomxxl napisał(a)
bekslesz napisał(a)

nie nie:) po prostu, mam elegancko zwrócony ten wskaznik, ale wyświetlanie mam zrobic w oparciu o pole " Tstring nazwa". Czyli musze przypisać jakoś owy wskaźnik pod to pole?

Nie rozumiem. Wyświetlanie masz oparte o pole Tstring nazwa. Używając nazwa.getContents() otrzymujesz wskaźnik do pola char * str w Tstring nazwa. Pisząc std::cout << nazwa.getContents() wpisujesz do standardowego wyjścia dane pod adresem char * str który znajduje się w obiekcie klasy Tstring.

ok czyli ja w takim razie nie rozumiem:)

No to pozostaje ci ponowne przeczytanie artykułu/rozdziału o klasach.

0
venomxxl napisał(a)

No to pozostaje ci ponowne przeczytanie artykułu/rozdziału o klasach.

tak też zrobię, póki co dzięki za pomoc

0
bekslesz napisał(a)
venomxxl napisał(a)

No to pozostaje ci ponowne przeczytanie artykułu/rozdziału o klasach.

pozostaje klopot z konstruktorem

Kolor::Kolor(Tstring p, int a, int s, int d)
{
    //nazwa.getContents();
	R=a;
	G=s;
	B=d;
	cout << "kontruktor 4 - argumentowy Kolor" << endl;
}

co z tym fantem zrobic? zeby dzialalo? jak powinna wygladac cala procedura tworzenia takiego obiektu?

0

Możesz to zrobić tak:

Kolor::Kolor(Tstring s, int r, int g, int b)
{
        nazwa=s;
	R=r;
	G=g;
	B=b;
	cout << "kontruktor 4 - argumentowy Kolor" << endl;
}

Albo tak, gdy zaimplementowałeś Tstring::setContents(char *), o którym wcześniej wspominałem:

Kolor::Kolor(char * s, int r, int g, int b)
{
        nazwa.setContents(s);
	R=r;
	G=g;
	B=b;
	cout << "kontruktor 4 - argumentowy Kolor" << endl;
}

W sumie to nie wiem co było w tym tak trudnego, wystarczyło po prostu przypisać wartość argumentu typu Tstring (oryginalnie Tstring p, u mnie Tstring s) do pola Tstring nazwa. Chyba, że miałeś coś innego na myśli, tylko zadałeś złe pytanie.

0
venomxxl napisał(a)

Możesz to zrobić tak:

Kolor::Kolor(Tstring s, int r, int g, int b)
{
        nazwa=s;
	R=r;
	G=g;
	B=b;
	cout << "kontruktor 4 - argumentowy Kolor" << endl;
}

W sumie to nie wiem co było w tym tak trudnego, wystarczyło po prostu przypisać wartość argumentu typu Tstring (oryginalnie Tstring p, u mnie Tstring s) do pola Tstring nazwa. Chyba, że miałeś coś innego na myśli, tylko zadałeś złe pytanie.

tak to miałem i całość się wysypała. Przynajmniej błędów kompilacji nie było.</cpp>

0

Jeżeli nadal masz ten problem to skontaktuj się ze mną na GG: nr 3719477.

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