Stworzenie konstruktora klasy z możliwością podania danych dla tablicy

0

Czy mógłby ktoś mnie naprowadzić jak stworzyć konstruktor dla klasy w której ma być zawarta tablica 6-elementowa intów (problemem jest to, że chciałbym otrzymać możliwość, aby wprowadzać te dane Od razu tzn np class Klasa a potem Klasa zxc({1,2,3,4,5,6}).

Czy dobrze rozumiem, że potrzebuje tabliczy dynamicznej zawartej w konstruktorze + czy jest możliwe, aby zawrzeć pewne ogarniecznia dla wprowadzanych liczb w konstruktorze?

Pozdrawiam

2
class Klasa {
public:
    Klasa(const int (& intArray) [6])
    {
        for(int i =0; i < 6; ++i)
            Liczby[i]=intArray[i];
    }
    int Liczby[6];
};
0

Jeżeli masz zawsze 6-elementową tablice to nie ma najmniejszego sensu robić to dynamicznie.
Może nie jest to 6-elementową tablica int'ow tylko 3-elementowa tablica punktów?
Ograniczenia w konstruktorze zawsze da się zrobić, tylko że zawsze warto się zastanowić nad odpowiednią reakcją na niepoprawne dane.

0

Z tego co czytałem w różnych źródłach to powinno być (wg mnie) coś takiego tylko, że jakos nie bardzo kompilator sie na to zgadza ;d

class Zbior
{
	public:
		Zbior(int tmp_dane[6]);
	private:
	        int zbior_liczb[6];
};
 
Zbior::Zbior(int tmp_dane[6])
{
	tmp_dane=new int[6];
	memcpy(zbior_liczb,tmp_dane,6*sizeof(int));
int main()
{
	Zbior test({1,2,3,4,5,6});
        return 0;
}
 
0

Nie ma to być po prostu tablica liczb całkowitych, mam problem jak ją przekazać w wywołaniu później, co to dynamicznej to gdzieś to wyczytałem na jakimś przykładzie, ale no dziwne mi się to wydawało.

0

No to weź kod od @Zellus i poczytaj właściwe źródła.

0

Dzięki wielkie.

2

Moim zdaniem lepiej użyć konstruktora zmiennoargumentowego (variadic template).

class A 
{ 
public:
    static constexpr int ARRAY_SIZE = 6;
    template<typename... T, typename std::enable_if<sizeof...(T) == ARRAY_SIZE, int>::type = 0> 
    A(T... array) : m_array{array...} { } // brace initialization
 	
private:
     std::array<int, ARRAY_SIZE> m_array;
}; 
 
int main() 
{
    A a1 (1, 2, 3, 4, 5, 6); // OK   
    A a2 (1, 2, 3, 4, 5, 6, 7); // błąd
    A a3 { 1, 2, 3) // błąd  
    return 0;
}

Ewentualnie możesz użyć std::initialization_list (przy czym tutaj tracisz sprawdzenie rozmiarów tablicy).
Edit: odnosząc się do komentarza - użyj w takim wypadku std::enable_if, wtedy wyeliminujesz możliwość podania mniejszej/większej liczby argumentów (przykład powyżej). Jest jeszcze możliwość użycia static_assert ale std::enable_if to imo lepsze rozwiązanie.

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