Tworzenie tablicy dynamicznej obiektów tworzonych lista inicjalizacyjna

0

Hej, mam problem ze stworzeniem dynamicznej tablicy obiektów, które tworzone są przez liste inicjalizacyjna. Listy uzywam ze wzgledu na zastosowanie const int. W jaki sposob inicjuje sie elementy takiej tablicy? Szukalem juz w kilku miejscach i nie znalazlem rozwiazania, ponizej kod który podczas kompilowania wyrzuca blad: [Error] no matching function for call to 'Maszyna::Maszyna()'

#include <iostream>
#include <string>

using namespace std;

class Maszyna {
 private:
  const string Nazwa;
  int liczba1;

 public:
  Maszyna(string name, int liczba) : Nazwa(name), liczba1(liczba) {}
};

int main() {
  Maszyna a("abc", 20);
  Maszyna tab[2] = {{"bcd", 50}, {"eef", 70}};
  Maszyna *wsk = new Maszyna[2];
}

Myslałem o nadaniu wartosci początkowych deklarowanych w klasie, ale nic to nie zmienia.

0

Dzieki za odpowiedz, aczkolwiek sedno problemu ktory probuje rozwiazac lezy jeszcze o krok dalej ;) mianowicie - co w przypadku gdy wielkoscia tworzonej dynamicznie tablicy jest wynik jakiejs funkcji i nie wiem z góry ile ich będzie, tzn ze nie bede mogl ich zainicjowac jak w przykladzie wyzej. Dopoki nie korzystalem z listy inicjalizacyjnej pisalem Klasa *wsk=new Klasa[wartosc_z_funkcji], a pozniej wskaznik wsk przesylalem do funkcji ktora wypelniala mi w jakis sposob tak stworzoną tablicę. Natomiast tutaj z tego co wyczytałem lista inicjalizacyjna "dziala" jeszcze przed stworzeniem obiektu, wiec wartosci poszczegolnych pol musza byc nadane wczesniej. Prosze o pomoc, nie oczekuje kompletnego kodu, tylko nakierowania haslowego w czym szukac ;)

1

Używaj std::vector, i się o takie rzeczy nie martw. Przy czym wtedy wypadałoby zastosować się do rule of zero/three/five, i zamiast elementu const dodać const ref getter do niego, żeby nie blokować optymalizacji.

Jeśli z jakiegoś powodu nie możesz używać biblioteki standardowej, a musisz mieć w jakiś sposób tablicę potencjalnie niezainicjalizowanych elementów, to zrób tablicę std::optional<Maszyna>, lub po prostu tablicę wskaźników na tę klasę. Ale to jest rozwiązanie prawie zawsze gorsze - domyślnie wybierz std::vector i się tym nie martw.

0

Pozwole sobie pociagnac kwestie dalej - dlaczego probujac wypelnic tablice wskaznikow (tab_wsk na pozycji spelniajace) do obiektów klasy Urzadzenie konkretnymi wskaznikami na obiekty ktorych pola spelaniaja warunek logiczny dostaje taki komunikat bledu w konsoli:

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Tutaj kod bez definicji klasy:

int main() {
  Urzadzenie tab[6] = {
      {"Bosch", 20000, 500, "VM"},        {"Siemens", 14000, 120, "Siemens"},
      {"Hitachi", 3000, 60, "Samsung"},   {"Hyundai", 20000, 2000, "Hyundai"},
      {"Yamaha", 13222, 566, "Kawasaki"}, {"Rexroth", 19000, 300, "Rexroth"}};
  SprProd(tab, 6);
}
void SprProd(Urzadzenie *wsk, int n) {
  int licznik = 0;

  for (int i = 0; i < n; i++) {
    if (wsk->DajProducentU() == wsk->DajProducentS()) {
      licznik++;
    }
    wsk++;
  }

  Urzadzenie **tab_wsk = new Urzadzenie *[licznik];

  int spelniajace = 0;

  for (int i = 0; i < n; i++) {
    if (wsk->DajProducentU() == wsk->DajProducentS()) {
      tab_wsk[spelniajace] = wsk;
      spelniajace++;
    }
    wsk++;
  }
}
1

Tak to się Bracie robi (używa new na liście inicjalizacyjnej):

class SomeClass
{
public:
  SomeClass(const std::string &s);

private:
  std::string const *pointer;
};
SomeClass::SomeClass(const std::string &s)
: pointer(new std::string(s))
{}

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