Obiekt innej klasy jako argument w metodzie zaprzyjaźnionej

0

Witam! Napotkałem na mojej drodze problem. Mianowicie:

Mam 2 klasy:

  1. Wczytująca dane w pliku do dynamicznej tablicy wektorów
  2. klasa abstrakcyjna która ma mieć dostęp do tej tablicy (tablica
    jest atrybutem private)

Chciałem więc zrobić to przez funkcję zaprzyjaźnioną w ramach klasy
abstrakcyjnej:

  1. Plik nagłówkowy

Zawartość pierwszej klasy:

class Dane {
private:
vector<double> * tablica;

public:
friend vector<double> ** ustaw_wskaznik ( Dane obj )

A dalej:

class AlgorytmGrupowania {
vector<double> *( *ptablica); 

vector<double> ** ustaw_wskaznik ( Dane obj )
  1. Plik z funkcjami:
vector<double> ** AlgorytmGrupowania::ustaw_wskaznik ( Dane obj ){
ptablica=obj.tablica;
return ptablica;
} 

W efekcie dostaję nast. komunikat:

error:'AlgorytmGrupowania' has not been declared
error:'Dane' was not declared in this scope
error: expected ',' or ';' before '{' token 

prosiłbym o pomoc ;-)

0
class Dane;

class AlgorytmGrupowania {
vector<double> **ptablica;

vector<double> ** ustaw_wskaznik ( Dane obj );
};

class Dane {
private:
//vector<double> *tablica; //po co dynamiczny wektor, skoro jego zawartość jest dynamiczna ?
vector<double> tablica; //wskaźnik na dynamiczną zawartość można bezpośrednio podmienić metodą 'swap'

public:
friend vector<double> ** AlgorytmGrupowania::ustaw_wskaznik ( Dane obj );
}
0

Wektor jest dynamiczny, gdyż jest to tablica wektorów, której dlugości generalnie nie znam (plik jest w specyficznym formacie arff, który pozwala mi zliczyć kolumny tablicy, ale nie ilośc wpisów -wierszy. Mam więc tablicę wektorów dynamicznie zwiększających swoją objętość o n kolumnach (czyli n pionowych wektorów ;-)). Generalnie ta część działa, kompilator wyrzuca błąd dopiero po dopisaniu linii z definicją funkcji przypisującej wskaźnik. Problemem jest więc linia zawierająca:

vector<double> ** AlgorytmGrupowania::ustaw_wskaznik (Dane obj)

0

Ale przecież vector jest taki miły bo może zmieniać swój rozmiar! Czemu wiec nie zrobiłeś vector<vector<double> > (Pomiędzy > i > MUSI być spacja).
Poza tym przesyłasz duży obiekt poprzez wartość! To jest bardzo ryzykowne, zwłaszcza jeśli nie masz konstruktora kopiującego, ja bym wstawił referencję.
Co do twojego problemu to przy friend nie podałęś pełnej nazwy funkcji, brakuje wskazania, że to jest metoda innej klasy!
Czyli poprawiłbym tak:

class AlgorytmGrupowania;
typedef vector<vector<double> > MyType;
class Dane {
private:
MyType tablica;

public:

friend MyType & AlgorytmGrupowania::ustaw_wskaznik ( Dane & obj ); // tu referencja!!!
....
class AlgorytmGrupowania {
vector<double> *( *ptablica);

MyType & ustaw_wskaznik ( Dane & obj ); // tu referencja!!!
.....
MyType & AlgorytmGrupowania::ustaw_wskaznik ( Dane & obj ){
return obj.tablica;
}

Wygląda na to, że bardzo dziwnie zorganizowałeś swój projekt. Nie wiem co to ma robić wiec trudno powiedzieć jak to powinno wyglądać.

0

wracajac do oryginalnego problemu:

McGoof napisał(a)
error:'AlgorytmGrupowania' has not been declared
error:'Dane' was not declared in this scope
error: expected ',' or ';' before '{' token 

bledy sugeruja, ze w "pliku z funkcjami" nie masz dolaczonej definicji klas AlgorytmGrupowania i Dane.. moze zapomniales #include'a ?

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