Konstruktor wywołany bez parametrów

0

Mam taki problem otóż jeszcze bawię się programowaniem oraz chcę zrobić coś takiego:

mam taki konstruktor:

 magazyn(string n, int i, double c):nazwa(n),ilosc(i),cena(c)
	{
		nowe_produkty();
		ofstream pliczek;
			pliczek.open("baza.txt" , ios::app);
			pliczek << "\n" << nazwa << " " << ilosc << " " << cena;
			pliczek.close();
	};

oraz chce go wywołać bez żadnych argumentów czyli chcę zrobić np. tak:

 magazyn produkt(); 

bo u mnie plik z main wygląda tak:

#include <iostream>
#include <string>

using namespace std;
int main()
{
	string n;
	int d;
	double a;
	magazyn testowy(n,d,a);
}

a chcę aby funkcja main była bez tego string int double. (niepotrzebnie zajmuje 2 razy tyle pamięci)

Na marginesie dodam tylko funkcje nowe_produkty(), która może nic z tym wspólnego nie ma, ale jakby ktoś ją tak bardzo potrzebował.

	void nowe_produkty() // dodaje nowe produkty do bazy
	{
		cout << "nazwa produktu: ";
		cin >> nazwa;
		cout << "Ilosc produktu: ";
		cin >> ilosc;
		cout << "cena produktu: ";
		cin >> cena;
	}
1

Nie rozumiem.

 magazyn()
        {
                nowe_produkty();
                ofstream pliczek;
                        pliczek.open("baza.txt" , ios::app);
                        pliczek << "\n" << nazwa << " " << ilosc << " " << cena;
                        pliczek.close();
        }

?

1

Podałeś takie wycinki kodu że w zasadzie nie ma prawa działać, ale chyba chodzi ci o coś takiego

#include <iostream>
#include <string>

using namespace std;


class magazyn
{
public:
     magazyn(string n="domyslny", int i=0, double c=0.0)
        {
            cout << "podano\n" << n << "\n" << i << "\n" << c << endl;
        }
};
using namespace std;
int main()
{
        magazyn testowy("ble",3);
}

Generalnie chodzi o to że konstruktor ma parametry domyślne, więc jeśli ich nie podasz przy wywołaniu właśnie takie będą miały wartości. Uwaga, "pomija" się je od prawej, więc teraz możesz pominąć double-a, ale nie możesz podać doublea a pominąc inta i lub/stringa. Możesz za to np podać samego stringa wtedy int i double będą z definicji konstruktora.

1
struct magazyn
  {
   string nazwa;
   unsigned ilosc;
   double cena;
   istream &inp(istream &sin,bool ask=false)
     {
      if(ask) cout<<"nazwa produktu: ";    cin>>nazwa;
      if(ask)  cout<<"Ilosc produktu: ";    cin>>ilosc;
      if(ask) cout<<"cena produktu: ";    cin>>cena;
     }
   ostream &out(ostream &sout)const { return sout<<nazwa<<' '<<ilosc<<' '<<cena; }
   void write(const char *name) { ofstream file(name,ios::app); out(file)<<endl; }
   magazyn(istream &sin,bool ask) { inp(sin,ask); }
  };
ostream &operator<<(ostream &sout,const magazyn &m) { return m.out(s); }
istream &operator>>(istream &sin,magazyn &m) { return m.inp(s,true); }

int main()
  {
   magazyn testowy(cin,true);
   testowy.write("plik.txt");
   cout<<testowy<<endl;
   return 0;
  }
1

O ile dobrze zrozumiałem, to tak się nie da; skąd kompilator miałby niby wiedzieć, że wywołując konstruktor bezparametrowy chcesz wywołać akurat ten? ...

1

Nie wiem może chodzi ci o coś takiego:

#include <iostream>
#include <string>
using namespace std;
class A {
public:
  A() {
    A("takisobietekst",43,5.87);
  }
  A(std::string n, int i,double c) {
      std::cout << "alalalal";
  }
};
int main() {
    A aa;
	return 0;

}

http://ideone.com/LpsAki#view_edit_box

ale zadziała to tylko jeśli kompilujesz zgodnie ze standardem C++11

0

Dziękuję wam za pomoc :-) chciałem się tylko dowiedzieć czy tak da się zrobić, ale jak nie da się tak zrobić będę musiał kombinować inaczej (chcę jak najbardziej poznać działanie konstruktorów), mimo to dziękuję wam za pomoc :-)

Chodziło mi aby pozbyć się w funkcji main tych 3 zmiennych i używać tylko te, które są w klasie oznaczone jako private no ale nie da się używać w funkcji main rzeczy oznaczonych w klasie jako private (tzn. nie da się jawnie da się ominąć to, ale tego nie chciałem) :)

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