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

Przesłanie stałej tablicy string do konstruktora/wskaźnika do niej.

Object Storage Arubacloud
0 głosów
470 wizyt
pytanie zadane 20 maja 2018 w C i C++ przez RobertWielewicki Nowicjusz (230 p.)

Witam, pragnę zrobić małą, bardzo prostą grę żeby pouczyć się lepiej klas lecz już na początku napotykam spory problem.

Otóż nie wiem jak do konstruktora przesłać tablicę string wyglądającej jak ta:

string test[] = {
"aaaaaaaa",
"bbbbbbbb",
"ccccccccc",
"dddddddd"
};

Korzystam z Visual Studio 2017.
Mogę, lecz nie muszę korzystać z oryginalnej tablicy, więc nie ma tu dużego nacisku na rozwiązanie.

2 odpowiedzi

+1 głos
odpowiedź 20 maja 2018 przez RafalS VIP (122,820 p.)
wybrane 25 maja 2018 przez RobertWielewicki
 
Najlepsza

Prawdopodobnie próbowałeś zrobić składową tak:

string tab[5];

Musisz jednak pamiętać, że składowe są tworzone przy tworzeniu obiektów, a to oznacza, że w konstruktorze próbowałeś zrobić coś takiego:

string tab[5]; //automatyczne tworzenie składowej obiektu
//wchodzimy do konstruktora
//tab2 to przekazany argument, tworzenie jest pewnie w mainie
//a przesylany sam wskaznik, ale dalem tworzenie tutaj, zebys widzial ze to nie ma sensu
string tab2[5] = {...}; //zawartosc
//przypisanie w konstruktorze
tab = tab2;

To oczywiście nie zadziała. Ale wszystko zadziała świetnie gdy użyjemy wskaźnika. Bo wskaźnik po stworzeniu można przypisywać w przeciwieństwie do tablicy. I jak wiadomo tablica to poniekąd wskaźnik na pierwszy element tej tablicy.  

#include <string>
#include <iostream>
using namespace std;
class A {
public:
	// string tab[] jest rownowazne z string *
	A(string * tab, int tabLen) {
		this->tab = tab;
		this->tabLen = tabLen;
	}
	void printTab() {
		for (size_t i = 0; i < tabLen; i++)
		{
			cout << tab[i] << endl;
		}
	}
private:
	string * tab;
	int tabLen;
};
int main()
{
	string test[] = {
		"aaaaaaaa",
		"bbbbbbbb",
		"ccccccccc",
		"dddddddd"
	};
	A a(test, 4);
	a.printTab();
	return 0;
}

 

+1 głos
odpowiedź 20 maja 2018 przez tangarr Mędrzec (154,780 p.)

Aby przekazać referencję do tablicy musisz użyć konstrukcji:
 

void funkcja1(string (&tablica)[5]) {
    for (int i=0; i<5; i++)
         cout << tablica[i] << endl;
}

Takie rozwiązanie jest jednak mało wygodne ze względu na wymóg sztywnego zdefiniowania rozmiaru.
Można temu łatwo zaradzić przy pomocy szablonu:
 

template <int N>
void funkcja2(string (&tablica)[N]) {
    for (int i=0; i<N; i++)
        cout << tablica[i] << endl;
}

A tutaj przykład zastosowania w konstruktorze klasy.
 

#include <iostream>
using namespace std;

class Klasa {
public:
    template<int N>
    Klasa(string (&tab)[N]) : n(N), kopia(new string[N]) {
        for (int i=0; i<N; i++)
            kopia[i] = tab[i];
    }
    ~Klasa() {
        delete [] kopia;
    }
    void wypisz() {
        for (int i=0; i<n; i++)
            cout << kopia[i] << endl;
    }
private:
    int n;
    string *kopia;
};

int main() {
    string test[] = {
        "aaaaaa",
        "bbbb",
        "cccccccccc"
    };
    Klasa x(test);
    x.wypisz();
}

 

Podobne pytania

0 głosów
3 odpowiedzi 943 wizyt
0 głosów
1 odpowiedź 536 wizyt
pytanie zadane 22 marca 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 7 października 2019 w Java przez Szczurek431 Początkujący (330 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...