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).

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