• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

tablica w funkcji klasy

VPS Starter Arubacloud
0 głosów
174 wizyt
pytanie zadane 19 sierpnia 2019 w C i C++ przez shnycell Nowicjusz (140 p.)

Witam, jestem początkujący więc proszę o wyrozumiałość. Próbuje napisać programik obiektowo, który pisałem strukturalnie, tak dla ćwiczenia. I już na początku mam problem ze zrozumieniem przypisania wartości do tablicy przez konstruktor.

Tutaj bardzo uproszczony kod:

 

//Kszt.h

#include <iostream>
#include <windows.h>

using namespace std;

class Kszt
{
public:

    double x;
    double y;
    double tab[];

    void wczytaj();
    void rysuj();

  Kszt()
   {
       wczytaj();
   }
 //  ~Kszt();


};

//----------------------------------------------------------

// wczytaj.cpp

#include <iostream>
#include "Kszt.h"

using namespace std;

void Kszt::wczytaj()
{
    x=2;   // te wartosci przypisuja sie i sa "widoczne" w funkcji rysuj
    y=3;   // te wartosci przypisuja sie i sa "widoczne" w funkcji rysuj
    double tab[8]={2,3,5,1,7,9,3,0};    // tablice tylko w tej "wczytaj"
    cout<<"x.wczytaj="<<x<<endl;
    cout<<"y.wczytaj="<<y<<endl<<endl;

    for(int i=0; i<8; i++)
     {
      cout<<tab[i]<<endl;       // tu wszystko dobrze
     }

}

//----------------------------------------------------------

//rysuj.cpp

#include <iostream>
#include "Kszt.h"

using namespace std;

void Kszt::rysuj()
{

   cout<<endl;

   cout<<"x.rysuj="<<x<<endl;        // te sa juz przypisane
   cout<<"y.rysuj="<<y<<endl<<endl;  // te sa juz przypisane

   for(int i=0; i<8; i++)
    {
     cout<<tab[i]<<endl;     // TUTAJ SMIECI
    }

}

//----------------------------------------------------------

//main

#include <iostream>
#include "Kszt.h"

using namespace std;

int main()
{
    Kszt K1;
    K1.rysuj();

    return 0;
}

w funkcji "wczytaj" (konstruktor?) odczyt z tablicy jest w porządku, zaś w funkcji "rysuj" odczytują się śmieci, a wartości x i y  są odczytywane w obu funkcjach dobrze, bez double przed tablicą w funkcji "wczytaj" wyskakuje błąd "cannot convert ' brace-enclosed initializer list ' to 'double' in as..." 

Wiem, że to podstawy podstaw, ale kompletnie nie rozumiem w czym jest problem, bo jeśli obiekt jest stworzony (chyba), to dane w tablicy powinny tam być.

Bardzo proszę o jakąś wskazówkę.

1 odpowiedź

+1 głos
odpowiedź 19 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
edycja 19 sierpnia 2019 przez tangarr
1. W funkcji wczytaj tworzysz nową zmienną tab (lokalną) i przesłaniasz zmienną tab klasy Kszt.
2. Rozmiar tablicy tab powinieneś zdefiniować w definicji klasy.
3. Listę inicjalizującą możesz użyć tylko podczas inicjalizacji obiektu (tworzenia go)
 

Jeżeli chcesz użyć jednolitej inicjalizacji to stwórz tablicę pomocniczą i w pętli przepisz z niej dane do tablicy tab
komentarz 19 sierpnia 2019 przez shnycell Nowicjusz (140 p.)
Dziękuję za bardzo szybką odpowiedź i podpowiedź, teraz działa.

Czyli muszę zrobić to tak:

    tab[0]=2;
    tab[1]=3;
    tab[2]=5;
    tab[3]=1;
    tab[4]=7;
    tab[5]=9;
    tab[6]=3;
    tab[7]=0;

a w składniku klasy zdefiniować ilość elementów czyli tak:

double tab[8];
komentarz 19 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)

Możesz też zrobić tak:

double tmp[]={2,3,5,1,7,9,3,0};
for (int i=0; i<8; i++) {
    tab[i] = tmp[i];
}

Możesz również użyć tablicy dynamicznej std::vector

#include <iostream>
#include <vector>

class X {
    std::vector<int> tab;
public:
    X(const std::initializer_list<int> &list) {
        tab = list;
    }
    void print() {
        for (unsigned long long i=0; i< tab.size(); i++) {
            std::cout << tab[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main()
{   
    X a({ 1 , 2, 3, 4 });
    a.print();
    X b{10, 9,8,7,6,5};
    b.print();

    return 0;
}

 

komentarz 19 sierpnia 2019 przez shnycell Nowicjusz (140 p.)
O to bardzo ciekawe rozwiązanie z tymi wektorami. Dziękuję jeszcze raz.
komentarz 20 sierpnia 2019 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <vector>

class X {
    std::vector<int> tab;
public:
    explicit X(const std::initializer_list<int> &list)
        : tab{list} {}
    void print() const {
        for(auto v: tab) {
            std::cout << v << ' ';
        }
        std::cout << '\n';
    }
};

int main() {
    X a{1, 2, 3, 4};
    a.print();
    X b{10, 9,8,7,6,5};
    b.print();
}

 

komentarz 21 sierpnia 2019 przez shnycell Nowicjusz (140 p.)
Super! Teraz dokładnie muszę to przeanalizować jeszcze raz. Dziękuje raz jeszcze!

Podobne pytania

0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 3 października 2017 w Java przez heartagram Obywatel (1,770 p.)
0 głosów
2 odpowiedzi 132 wizyt
0 głosów
1 odpowiedź 800 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez karols32 Nowicjusz (120 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...