Inicjalizacja obiektu klasy pochodnej w klasie bazowej.

0

Czy możliwa jest w.w operacja. Objaśnienia w komentarzach kodu.

class Board
	:public Place
{
private:

#pragma region Places declaration
	Place A1();    // taka deklaracja obiektu działa
        // Place A1(1,1); taka proba deklaracji nie dziala chodz zdefiniowany jest konstruktor klasy Place, ktory umozliwia taka inicjalizacje np bezposrednio w funkcji main()
#pragma endregion	

public:
	Board();
	~Board();
};

1
class Board : public Place
{
public:
    Board();
    ~Board();
};

Board::Board() : Place(1, 1)
{

}
1
Place A1();    // taka deklaracja obiektu działa

Most vexing parse (chociaż czy tutaj jest most vexing to sprawa dyskusyjna). A1 jest funkcją przyjmującą zero parametrów i zwracającą obiekt typu Place.

0

Ok a jak będzie gdy będe chciał utworzyć podczas inicjalizacji obiektu klasy Board kilka obiektów klasy Place w klasie Board. Prościej - jedna klasa Board ma zawierać kilka obiektów Place zainicjalizowanych danymi. Czy jest to możliwe. Jesli tak to jak ? Jak próbuję to zrobić metodą opisaną wyżej kompilator wyrzuca bląd: "expected a type specifier".

0

Jeśli pola mają być składnikami klasy to osobno deklarujesz pola, osobno inicjalizujesz:

class Board : public Place
{
private:
  Place a1, a2, a3;
// albo std::vector<Place> a;
public:
  Board() : a1(1,1), a2(1,1), ...
  {
// jesli uzyles std::vector, to tu inicjalizujesz 'a'
  }
} 

3

Chcesz dziedziczyć po Place, czy Twój obiekt ma zawierac obiekty typu Place?

0

Ok. Pierwsza 'metoda' działa, tzn inicjalizacja pojedynczych wcześniej zadeklarowanych obiektów przed wywołaniem konstruktora (chyba na tym ten sposób polega). Co do drugiej to mam problem (szczerze ten sposób wydaje się lepszy i bardziej optymalny dla mnie). Do meritum: chce zadeklarować 'tablice dwuwymiarową' uzywajac do tego klasy vector.Po krótkim czasie mam kod:

std::vector < std::vector<Place> > places(7, std::vector<Place>(7)); // z góry znam wymiar mojej 'tablicy'

Niestety kod nie działa blad: "expected a type specifier".

1

Pokaż cały kod. Szklana kula mi mówi, że napisałeś coś takiego

class Board : public Place // <- na pewno chcesz dziedziczyć?
{
private:
  
  std::vector < std::vector<Place> > places(7, std::vector<Place>(7)); // z góry znam wymiar mojej 'tablicy'
public:
  Board()
  {

  }
} 

Jeżeli tak, to lipton. Inicjalizuj places w liście inicializacyjnej:

class Board
{
private:
  
  std::vector < std::vector<Place> > places;
public:
  Board() : places(7, std::vector<Place>(7))
  {

  }
} 

P.S. Jak z góry znasz rozmiar to użyj std::array + wywal te magiczne liczby (:

0
__MicK napisał(a):

vector.Po krótkim czasie mam kod:

std::vector < std::vector<Place> > places(7, std::vector<Place>(7)); // z góry znam wymiar mojej 'tablicy'

Niestety kod nie działa blad: "expected a type specifier".

Wygląda, że znowu łączysz deklarację elementu z jego inicjalizacją.

Stwórz w klasie pole:

class Board : public Place
{
...
std::vector< std::vector<Place> > places;
};

a w konstruktorze Board() je zainicjalizuj:

Board()
{
places.resize(7)
for(auto it=places.begin(); it!=places.end(); ++it)
{
(*it).resize(7);
}
...
}
0

Dzięki wszystkim za odpowiedzi. Z mojej strony temat można zamknąć.

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