Dostęp do pola prywatnego innej klasy z klasy specjalizowanej

0

Mam 2 klasy, jedna specjalizowana. W klasie specjalizowanej Class_second chciałbym użyć pola prywatnego server z klasy Class_first natomiast otrzymuję :
error : ‘Class_second’ was not declared in this scope
pomimo iż załączyłem odpowiednie nagłówki. Nie chcę tworzyć nowego obiektu, tylko uzyskać dostęp do pola klasy już istniejącego obiektu.

class Class_first {
    friend class Class_second<Message>;

    Class_first() : server(create_conn(ip, port){

    }

    ...

private:
    unique_ptr<Server> server;

};

Jako, że jest to wskaźnik to próbuję uzyskać dostęp w sposób przedstawiony poniżej.

template<>
class Class_second<Message> {
public:

    void foo(Message) {
        Class_first.server.get();
        ...
    }
};
0
  1. Nic z tego nie będzie dopóki nie zrozumiesz jaka jest różnica między klasą a obiektem. Klasą może być "Krzesło". Obiektem jest "Krzesło które masz pod tyłkiem". Serwerem jesteś ty. Rozumiesz chyba że ty siedzisz tylko na krześle które masz pod tyłkiem a nie na krześle jako pewnym typie obiektów? Jak pójdę do ikei i znajdę tam krzesło bo najpewniej nie będziesz na nim siedział, mimo że siedzisz na innym krześle...
  2. friend to zło
  3. Możesz zrobić metodę która zwraca referencje do servera, ale w ogóle tym tego nie polecał. Twoje Class_first powinno po prostu udostępniać metody maskujące serwer. Niech Class_second w ogóle nie wie że tam jest jakis server i jak ta cała komunilacja działa.
0
Shalom napisał(a):
  1. friend to zło

Zawsze spotykałem się z tym stwierdzeniem, ale że piszę w javie w której nie ma czegoś takiego to nigdy nie odczułem tego na sobie. Mam jednak pytanie odnośnie tego. Zakładając że mam jakąś klasę biznesową i 1 metodę publiczną wywoływaną z zewnątrz. W samej metodzie rozbijam zadanie na np. 4 prywatne które wykonują jakieś odrębne części, które jednak z zewnątrz jednostkowo nie są użyteczne czyli nie ma sensu robić je publicznymi. I teraz pisząc test do tej klasy, żeby przetestować osobno metody prywatne, muszę dostarczyć prawidłowych danych do 3 metod i testowych do 1. Gdybym mógł wymusić z testu widoczność w pełni klasy testowanej to mógłbym po prostu testować metody pojedynczo i byłoby git. Jak się do tego odniesiesz? Moje podejście jest złe? Czy może dla tego jednego przypadku friend by nie zaszkodził? Jeżeli to pierwsze, to proszę o szersze wyjaśnienie :). Jest to pytanie na które już jakiś czas szukam odpowiedzi i nie mogę znaleźć odpowiedniego podejścia.

1

Ja bym po prostu napisał testy dla tej publicznej metody. To jak ona jest zaimplementowana (tj. czy jest rozbita na 10 metod prywatnych, czy używa wewnątrz całej hierarchii klas) z poziomu reszty systemu (jak i testów) niezbyt powinno Cię interesować. Inna sprawa, jeśli te metody prywatne są na tyle duże, że wypadałoby je przetestować to należy się zastanowić czy one nie powinny by być metody publicznymi, w jakiejś innej klasie.

0
n0name_l napisał(a):

Ja bym po prostu napisał testy dla tej publicznej metody. To jak ona jest zaimplementowana (tj. czy jest rozbita na 10 metod prywatnych, czy używa wewnątrz całej hierarchii klas) z poziomu reszty systemu (jak i testów) niezbyt powinno Cię interesować. Inna sprawa, jeśli te metody prywatne są na tyle duże, że wypadałoby je przetestować to należy się zastanowić czy one nie powinny by być metody publicznymi, w jakiejś innej klasie.

Właśnie mam takie podejście jak pierwsze o którym wspomniałeś, czyli wystawiam na zewnątrz tylko to co jest potrzebne. Oczywiście najlepszą opcją jest udawanie że nie wie się co jest w środku i testowanie tylko wg. założeń. Ale mimo to, niektóre klasy są zależne od innych więc część środka trzeba mockować, a skoro już to robimy to tak czy siak grzebiemy w środku, a to czasem jest przydatne. Jeżeli klasa rozbija test na 4 osobne metody prywatne, a przy zmianach w trakcie rozwoju aplikacji zmieni się tylko 1 metoda, to poprawiamy testy tylko do tej zmienionej.

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