Mam taki sobie kod:
#include <iostream>
#include <sstream>
#include <vector>
class KlasaA {
std::stringstream ss;
public:
KlasaA() {}
// //konstruktor kopiujący
// KlasaA(const KlasaA & objA) {
// this->operator=(objA);
// }
//
// //operator przypisania
// KlasaA & operator=(const KlasaA & clsA) {
// this->ss.clear();
// this->ss << clsA.ss;
// return (*this);
// }
};
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
KlasaA objA;
std::vector<KlasaA> array;
array.push_back(objA);
char z;
std::cin >> z;
return 0;
}
Problem tkwi w kopiowaniu przez wartość obiektu klasy który zawiera obiekt klasy stringstream. Gdy dajemy push_back gdy chcemy dodać jakiś element do wektora to kompilator wywala błąd ponieważ:
kompilator generuje dla klasy "KlasaA" domniemany operator przypisania który kopiuje składnik po składniku. Jak wiadomo oczywiście to jak zrobimy tak:
std::stringstream sss;
std::stringstream sss2("ala ma 2 koty");
sss = sss2;
to program nie zadziała. Tak jak powyżej prawdopodobnie postąpi kompilator gdy będziemy chcieli przypisać do jednego obiektu klasy "KlasaA" drugi obiekt "KlasaA" czyli dlatego właśnie się wywala bo we metodzie push_back prawdopodobnie będzie się znajdować operacja przypisania obiektów klasy "KlasaA". Ja wykombinowałem sobie tak ,że zdefiniowałem własny operator przypisania oraz konstruktor kopiujący. Jak od komentujemy funkcje operatora przypisania oraz konstruktor kopiujący to program zadziała poprawnie gdyż kompilator będzie wiedział ,że jak chcemy przypisać jeden obiekt "KlasaA" do drugiego nie postąpi tak jak w kodzie powyżej ze przypisaniem jednego stringstreama do drugiego tylko uruchomi moją wersję operatora przypisania. Moje pytanie brzmi:
Dlaczego klasa stringstream nie ma zdefiniowanego operatora przypisania oraz konstruktora kopiującego(nawet jak ma to nie działą on prawidłowo)? Jak będziemy chcieli dodać do wektora jakiś obiekt który zawiera obiekt klasy stringstream przez wartość to będziemy musieli zawsze definiować własny operator przypisania i konstruktor kopiujący?? Czy to nie jest utrudnianie ludziom życia?. Można to jeszcze jakoś inaczej obejść? Nie wiem czy moje rozumowanie jest prawidłowe może program wywala się przez coś innego