Konstruktor kopiujący - wskaźnik

0

Witam jestem tutaj nowy i jeszcze nie jestem obeznany na tym forum także proszę o wyrozumiałość.
Do rzeczy, mam zaimplementowaną klasę "stos" która ma przechowywać na stosie napisy typu string.

class stos
{
  private:
    std::string *str;
    int ile;
  public:
    const int rozmiar;
} 
  • pare metod..
    Problem polega na tym że gdy definiuje sobie konstruktor kopiujący to tworzy kopię ale niestety jakakąkolwiek zmianę wykonam na kopii to również wykonam ją na oryginale, wiem że problem leży we wskaźniku, wskażnik *str w kopii pokazuje na to samo co wskaźnik *str w oryginale stąd ten błąd. Nie wiem niestety jak go usunąć.

konstruktor i konstruktor kopiujący:

Stos::Stos(int a) : rozmiar(a)
  {
    ile = 0;
    str = new std::string[rozmiar];
  }
Stos::Stos(const Stos &wzor) : rozmiar(wzor.rozmiar)
  {
    std::string *str;
    str = new std::string[rozmiar];
    ile = wzor.ile;
    *str = *(wzor.str);
  }

Wiem ze mógłbym po prostu w pętli przekopiować elementy wzoru do nowo utworzonej tablicy, ciekawi mnie czy istnieje lepszy/szybszy sposób

0

A za pomocą new?
Można tworzyć stringa jako argument podając istniejący już string.

1
class StringStack {
private:
	std::vector<std::string> data;
	
public:
	StringStack() {}
	StringStack(const StringStack& other) {
		data = other.data;
	}
	
	void push(std::string str) { data.push_back(str); }
	std::string pop() {
		std::string tmp = data.back();
		data.pop_back();
		return tmp;
	}
};

http://ideone.com/WMGFbg

0

n0name :)
Zapomniałem dodać że klasa którą tworze ma być tak skonstruowana jak podałem wyżej.
szweszwe:
nie bardzo rozumiem o co Ci chodzi :)

0

Mniej więcej o coś takiego, może zadziała:

std::string *str = new string(*(wzor.str));
0

albo nie działa albo wartość "ile" zle kopiuję
zmienna ile wykorzystuję do wypisywania i liczenia ile jest elementów na stosie.

1
class StringStack {
private:
	std::string* data;
	const size_t size;
	unsigned top;
	
public:
	StringStack(size_t size):
		data(new std::string[size]),
		size(size),
		top(0)
	{}
	
	StringStack(const StringStack& other):
		data(new std::string[other.size]),
		size(other.size),
		top(other.top)
	{
		for(size_t i = 0; i < top; ++i) data[i] = other.data[i];
	}

    // tylko C++11	
    const StringStack& operator=(const StringStack&) = delete;

	~StringStack() { delete[] data; }
	
	void push(std::string str) { data[top++] = str; }
	std::string pop() { return data[--top]; }
};

http://ideone.com/kCn4Sg

0
Stos::Stos(const Stos &wzor) : rozmiar(wzor.rozmiar)
  {
    str = new std::string[wzor.rozmiar];
    str = wzor.str;
    ile = wzor.ile;
  } 

To działa, dzięki za pomoc : )

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