Konstruktor wywołany bez parametrów

Konstruktor wywołany bez parametrów
liske1
  • Rejestracja:około 14 lat
  • Ostatnio:2 dni
  • Postów:523
0

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

mam taki konstruktor:

Kopiuj
 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:

Kopiuj
 magazyn produkt(); 

bo u mnie plik z main wygląda tak:

Kopiuj
#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ł.

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

edytowany 1x, ostatnio: liske1
Shalom
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Nie rozumiem.

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

?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
SI
  • Rejestracja:ponad 14 lat
  • Ostatnio:około godziny
1

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

Kopiuj
#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.

edytowany 3x, ostatnio: sig
_13th_Dragon
  • Rejestracja:ponad 20 lat
  • Ostatnio:7 miesięcy
1
Kopiuj
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
Patryk27
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
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? ...


_13th_Dragon
Przecież ten jego konstruktor z parametrami, tych parametrów nie potrzebuje.
robcio
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 lat
  • Lokalizacja:Opole
  • Postów:533
1

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

Kopiuj
#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


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
edytowany 2x, ostatnio: robcio
liske1
  • Rejestracja:około 14 lat
  • Ostatnio:2 dni
  • Postów:523
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) :)


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.