Szablony klas

0

Witajcie, czytałem dużo na waszej stronie jak również na innych stronach na temat szablonów klas. Jednak mam problem.
Chcę stworzyć sobie klasę z szablonem i ma być w niej tablica wskaźników, tutaj pokaże wam jak chciałem to zrobić :

 
template <typename T>
class A 
{
private:
T kara;
public:
A **tab;
}

I teraz nie wiem co dalej gdy próbuje stworzyć tablicę nie widzę zmiennej kara czyli

[cpp]
tab = new A *[1];
for(int i= 0; i < 1; i++)
{
tab = new A;
tab[i]-> tu powinienem mieć dostęp do kara , ale go nie mam
}

I to cały mój problem.

1

to się w ogóle kompiluje?
strasznie dziwny twór, lepiej opisz problem, a nie to co chcesz wyciągnąć w kodzie;

0

Po pierwsze to o czym wspomniał @gośćabc. Po drugie nie masz dostępu do zmiennej prywatnej poza klasą i funkcjami/klasami z nią zaprzyjaźnionymi.

0

Muszę stworzyć klasę z użyciem szablonów, w niej chcę mieć tablicę wskaźników. Szablon ma działać tak że zmienna w private ma być typu T , chce później użyć tego w taki sposób że może być to typ int lub double.

0

No wiadomo , że nie mam do nich dostępu ale jeśli tworzę w polu public jakąś metodę to w niej mam dostęp, a przez szablon nie mam i dlatego tu piszę

0

Tyle to idzie odczytać z twojego kodu. Powiedz lepiej co ta klasa ma robić.

lshadown napisał(a):

No wiadomo , że nie mam do nich dostępu ale jeśli tworzę w polu public jakąś metodę to w niej mam dostęp, a przez szablon nie mam i dlatego tu piszę

Wtf?
Abstrahując od sensowności twojego kodu, mijasz się z prawdą:

template <typename T>
class A
{
private:
  T kara;

public:
  A **tab;

  void foo()
  {
    tab = new A<T> *[1];
    tab[0] = new A<T>;
    std::cout << tab[0]->kara; // to ma tylko udowodnić, że mamy dostęp do tego pola...
  }
};
0

Zważając na porę roku, ten kod najpewniej ma dać koledze jakieś zaliczenie. Anyway

lshadown napisał(a):

No wiadomo , że nie mam do nich dostępu ale jeśli tworzę w polu public jakąś metodę to w niej mam dostęp, a przez szablon nie mam i dlatego tu piszę

Dzieje się tak, gdyż metoda będącą składową klasy ma dostęp do jej prywatnych pól, nie ważne czy to szablon czy nie. Twój kod nie działa między innymi dlatego, że nie przeciążyłeś operatora -> dla swojej klasy i dlatego kompilator nie wie co miałeś na myśli używając go.

0

z racji tego, że słabo mi jak widzę ** i w ogóle raw pointer to zrobiłem Ci przykład na std::vector<std::unique_ptr<T>>, powinno to rozwiać Twoje wątpliwości

#include <iostream>
#include <memory>
#include <vector>
#include <string>

template<typename T>
class A
{
public:
	void insertElement(T const& e) { tab.emplace_back(std::make_unique<T>(e)); }

	void print();

private:
	std::vector<std::unique_ptr<T>> tab;
};

template<typename T>
void A<T>::print()
{
	for(auto const& e : tab) {
		std::cout << *e << " ";
	}
}

int main()
{
	std::cout << "ints\n";
	A<int> ints;
	ints.insertElement(2);
	ints.insertElement(3);
	ints.insertElement(-7);
	ints.print();

	std::cout << "\nstrings\n";
	A<std::string> strings;
	strings.insertElement("abc");
	strings.insertElement("def");
	strings.insertElement("ghi");
	strings.print();

	std::cout << "\ndoubles\n";
	A<double> doubles;
	doubles.insertElement(-70.9);
	doubles.insertElement(14.3);
	doubles.insertElement(-1);
	doubles.print();

	return 0;
}

http://melpon.org/wandbox/permlink/CrKU0XQzt0czDTTy

0
satirev napisał(a):

Tyle to idzie odczytać z twojego kodu. Powiedz lepiej co ta klasa ma robić.

lshadown napisał(a):

No wiadomo , że nie mam do nich dostępu ale jeśli tworzę w polu public jakąś metodę to w niej mam dostęp, a przez szablon nie mam i dlatego tu piszę

Wtf?
Abstrahując od sensowności twojego kodu, mijasz się z prawdą:

template <typename T>
class A
{
private:
  T kara;

public:
  A **tab;

  void foo()
  {
    tab = new A<T> *[1];
    tab[0] = new A<T>;
    std::cout << tab[0]->kara; // to ma tylko udowodnić, że mamy dostęp do tego pola...
  }
};

Dokładnie mi o to chodziło , tylko widzisz w tym problem że nie mam dostępu. Twierdzisz że mam przeciążyć operator -> , kurde czyli co jak korzystam z szablonów to muszę przeciążać operatory, bo gdy ich nie używam normalnie wszystko ładnie śmiga.

0

Nope. Ja nic nie mówiłem o potrzebie przeciążania operatora ->. Problem polega na tym, że ty chcesz jednocześnie mieć pole prywatne i dodatkowo mieć do niego publiczny dostęp. Moja rada to...zdecyduj się (bardzo brzydkie rozwiązanie - zdefiniuj getter).

0

Powiem inaczej, chcę mieć dostęp z tablicy do tego typu T i czy to jest możliwe ?

0

No przecież napisałem ci w moim, pierwszym poście, że do zmiennej prywatnej ma dostęp tylko klasa i funkcje/klasy zaprzyjaźnione z tą klasą (pomijam hack na dostęp do private z każdego miejsca). Masz wskaźnik na wskaźnik do klasy, która ma pole prywatne. Dostęp publiczny do tego wskaźnika nie przekłada się na publiczny dostęp do pól prywatnych tej klasy.

0

Chodzi o to , że ja nie mam dostępu do tej zmiennej
, gdy robię tab[0]-> nie mam nic a chcę ją ustawić na jakąś wartość.

0

to zależy, gdzie zrobisz wywołanie, jak zrobisz to w funkcji klasy to będziesz miał dostęp, już to było tłumaczone, poczytaj o zakresie dostępu pól klasy/struktury i potem wróc tutaj

0

Kurde piszesz po to aby pisać czy pomóc już 2 raz piszę że robię to w metodzie KLASY, więc powinienem mieć dostęp a go nie mam dla tego pisze tutaj .

0

Tak wygląda fragment mojego kodu gdzie chcę się dostać do zmiennej

 
class Kary  : public Wypozyczalnia 
{	
private:
	T kara;
public:
	Kary **tab;
	operator->()
	{

	}
	void foo()
	{
		tab = new Kary<T> *[1];
		tab[0] = new Kary < T > ;
		tab[0]->

	}
1

Już chyba rozumiem w czym rzecz....
Zapewne piszesz w Visual Studio i Intellisense nie wyrabia przy nawet tak prostych szablonach i przypuszczalnie nie podpowiada pól/metod tej klasy.

0

No chyba coś w ten deseń , bo nie podpowiada mi w cale .

0

to jest jakaś herezja, próbujesz na siłę zastosować jakieś niesamowite rozwiązanie, klasa Kary która nie jest templatem ma trzymać tablicę wskaźników na obiekt typu tej klasy (który już jest templatem) i jeszcze ma na nich pracować

ja się poddaję

edit:

w 2 poście napisałem, że próbujesz wymusić jakiś callstack nie patrząc na to, że to jest w ogóle nieprawidłowe podejście

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