Szablony klas

Odpowiedz Nowy wątek
2015-01-25 20:49
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.

Pozostało 580 znaków

2015-01-25 20:55
1

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

Pozostało 580 znaków

2015-01-25 20:58
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.

Pozostało 580 znaków

2015-01-25 20:59
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.

Pozostało 580 znaków

2015-01-25 21:05
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ę

Pozostało 580 znaków

2015-01-25 21:08
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...
  }
};
edytowany 2x, ostatnio: satirev, 2015-01-25 21:22

Pozostało 580 znaków

2015-01-25 21:20
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.

Pozostało 580 znaków

2015-01-25 21:20
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

Pozostało 580 znaków

2015-01-25 21:25
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.

Pozostało 580 znaków

2015-01-25 21:30
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).

Pozostało 580 znaków

2015-01-25 21:33
0

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

chodzi Ci o find? podajesz wartość i chcesz wiedzieć, że ona tam jest (zmodyfikować ją?), no bo dostęp masz bo przecież tablica "posiada" ten obiekt - gośćabc 2015-01-25 21:36

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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