Problem` z deklaracją vectora w klasie [C++]

0

Witam. Dopiero co poznałem podstawowy klasy vector. Problem napotkałem, kiedy chciałem zaimplementować kontener tej klasy w swojej klasie (linijka z deklaracją):

vector<punkt>tablica_punktow(3); 

Klasa punkt jest bardzo prostą klasą określającą punkt na ekranie. Posiada składniki takie jak współrzędne, znak reprezentujący punkt i kilka prostych funkcji składowych. To chyba nie ma znaczenia, ale chyba nic nie zaszkodzi dodać nie? Co takiego źle zrobiłem?
Przy próbie kompilacji otrzymuję taki błąd:

expected ';' before '(' token

, który w mojej ocenie niezbyt obrazowo daje do zrozumienia o co chodzi. Dodam jeszcze, że plik z klasą jest dołączany do pliku, gdzie dyrektywą include włączam do programu klasę vector.
Tak na marginesie małe pytanko: jeśli klasa punkt ma konstruktor z argumentami to czy da się wywołać go przy deklaracji kontenera przy użyciu klasy vector? Argumenty mają być dla każdego elementu takie same. Tak, wiem, przypisanie tego typu można prosto zrealizować w pętli for, ale chciałbym mieć wygodniej :P

1

Nie można wywoływać konstruktora w deklaracji klasy. Musisz go wywołać w konstruktorze:

class A{
public:
	A(size_t n) : tablica(n){

	}
	std::vector<int> tablica;
};
3

Składniki klasy inicjalizuje się za pomocą listy inicjalizacyjnej konstruktora. Tutaj masz przykład:

class Element {
public:
  // Niewazne co to, potrzebujemy jakiegos kontruktora.
  Element(int, int, int) {
  }
 
  // Konstruktor kopiujacy (jest potrzebny) bedzie domyslny.
  Element(const Element &) = default;
};
 
// Twoja klasa.
class X {
public:
  // Konstruktor z lista inicjalizacyjna.
  X() :
    mArray(3, Element(1, 2, 3)) {
  // Teraz mArray ma 3 elementy, kazdy utworzony z kopii podanego elementu.
  }
 
  // Twoja tablica. Prawdopodobnie powinna byc prywatna.
  std::vector<Element> mArray;
};
0

Jakiś użytkownik utworzył post, który rozwiązał problem (pokazał użycie funkcji resize()), po czym go od razy usunął. Udało mi się go przeczytać, ale kiedy chciałem zaznaczyć go jako rozwiązanie to się dowiedziałem o skasowaniu :D. No cóż. Reszcie dziękuję za odpowiedzi, z pewnością kiedyś się przydadzą. Temat do zamknięcia.

3

Nie możesz w ten sposób zainicjalizować elementu klasy. Możesz to zrobić za pomocą listy inicjalizacyjnej, tak jak to pokazano powyżej, lub bezpośrednio w definicji klasy, ale w zapisie musi być =:

struct A{
    vector<int> a = {0,0,0};
};

lub

struct B{
    vector<int> b = vector<int>(3);
};

http://melpon.org/wandbox/permlink/w0GTsNEWL9siM2By

0

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <conio.h>
#include <windows.h>
using namespace std;
struct Pojazd
{
int masa;
int predkoscmax;
int iloscosob;
float pojemnosc;
char marka[20];
};
Pojazd sam;

vector <Pojazd> samochod;
int wyswietl(){
for (int j=0; (j<samochod.size()); j++)
{
cout<<samochod[j].masa<<" "<<samochod[j].predkoscmax<<" "<<samochod[j].iloscosob<<"
"<<samochod[j].pojemnosc<<" "<<samochod[j].marka<<endl;

}

cout<<"\n";
return 0;
}

int main()
{int i;
i=0;

ifstream plik("plik.txt");
if (plik.isopen()) {
while (!plik.eof())
{
i++;
plik>>sam.masa>>sam.predkoscmax>>sam.iloscosob>>sam.pojemnosc>>sam.marka;
samochod.pushback(sam);
}
plik.close();
wyswietl();

}
system("pause");
}

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