tablica obiektów z konstruktora niedomyślnego

0

Czytając topic : 43388 nasunęło mi się jedno pytanie .
Załużmy , że mamy prościutką klasę :

Klasa
{
public:
Klasa(){};
Klasa(int x){ liczba=x; }
int liczba;
};

Teraz tworzymy sobie obiekt , można to zrobić za pomocą 2 konstrktorów :
Klasa obiekt;
lub
Klasa obiekt(liczba);

Wszystko jest ok . Ale co jak chcemy stworzyć tablice obiektów ?
Klasa obiekty[20];
to jest ok , bo urzyliśmy domyślnego konstruktora
ale teraz chcemy utworzyć tablice obiektów używając 2 konstruktora :
Klasa obiekty20 oraz Klasa obiekty(liczba)[20]
obydwie ^ linijki nie działają , wyskakuje error i w sumie się nie dziwie .
I tu jest problem . Oczywiście można to obejść , np tak tworząć konstruktor domyślny , żeby działał tak jak ten z argumentem , ale to nie zawsze zadziała , np gdy chcemy w programie podać jakie argumeny mają być podane do konstruktora . Można to zrobić na wskaźnikach , zrobić :
Klasa *obiekty[20];
i
for(int i=0;i<20;i++)
obiekty[i]=new Klasa(liczba);
ale tutaj tracimy troche na pamięci i nie jest to elegancko .
Czy widzicie jakiś sposób na zaradzenie temu , najlepiej bez alokowania pamięci ?

0

No właśnie ... Jest sposób żeby to obejść. Można to zrobić tak, że w definicji konstruktora domyślnego wywoływać funkcję odpowiedzialną za robienie rzeczy, które normalnie powinien robić konstruktor nie-domyślny. Czyli, jeśli mamy :

Klasa 
{
   int skladnik ; 
   Klasa()
   {
       // puste, żeby było prościej
    }
    Klasa(int liczba)
   { 
       skladnik = liczba ;
   }
} ;

To możemy linijkę skladnik = liczba przenieść do specjalnie do tego zrobionej funkcji i wywoływać ją w ciele konstruktora domniemanego.
Czyli :

Klasa 
{
   int skladnik ; 
   Klasa()
   {
       funkcja(10) ;
    }
    funkcja(int liczba)
   { 
       skladnik = liczba ;
   }
} ;

Aczkolwiek niewiem czy to elegancie i praktyczne ...

0

[browar]
Niestety jest to totalnie niepraktyczne , bo tą funkcję w konstruktorze też musisz wywołać z argumentem , który i tak musisz podac na sztywno ( konstrktor domyślny nie ma argumentów ) , więc nie robi to różnicy ;)
Chodzi tu o sytuacje , gdy dopiero w czasie działania programu wiemy jakie argumenty przesłać do konstruktora ...

0

Rozwiazanie:
<cpp>
class Klasa
{
public:
Klasa(int x=0){ liczba=x; }
int liczba;
};
<cpp>

Zamiast 0 mozna wstawic inna liczbe jaka nam pasuje !!!!
Konstruktor dziala jak domyslny i z jednym parametrem.

0

Rozwiazanie:

nie tak do końca ;)
Tutaj też na sztywno musisz podać tą liczbę ( jest nią teraz 0 ) i to w końcu nic nie daje .
Rozważ taką sytuację :

int x;
cin>>x;

for(int i=x;i<x+10;i++)
{
utwórz tablice 100 obiektów przesyłając do konstruktora liczbę i
}

????

0

To tutaj jest odpowiedz ostateczna ;) Opis bledu przy kompilacji czegos w stylu : Klasa *Tablica = new Klasa20;

new : cannot specify initializer for arrays
An initializer was given for the specified array created with the new operator.
The new operator creates arrays of objects by calling the default constructor for each element of the array. The elements of the array cannot be initialized to distinct values.

Wiec jak widzisz tak sie nie da podobnie jak Klasa Tablica20!! No chyba ze jeszcze o cos innego chodzi ;)

Jesli chodzi zas o ostatnie pytanie to:
<cpp>
class Klasa
{
public:
static int x;
Klasa(int x){
liczba = x;};
Klasa(){ liczba=x; }
int liczba;
};

int Klasa::X = 0; //zainicjalizowanie

//potem jak pobierasz jakis x to
Klasa::x=x;
Klasa Tablica[10];
// i masz co chciales ;)
<cpp>

0

Jesli chodzi zas o ostatnie pytanie to:

class Klasa
{
public:
static int x;
Klasa(int x){
liczba = x;};
Klasa(){ liczba=x; }
int liczba;
};

int Klasa::X = 0; //zainicjalizowanie

//potem jak pobierasz jakis x to
Klasa::x=x;
Klasa Tablica[10];
// i masz co chciales ;)

Bardzo sprytnie :) . Myśle , że to najlepiej rozwiązuje ten problem .
Duże [browar] dla ciebie .

0

Klasta obiekty[20] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
};

0

Klasta obiekty[20] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
};

A co jak nie wiemy ile ma być elementów w tablicy i dopiero w czasie działania programu będzie to wiadomo ??

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