So here I am, having a difficult time figuring out what's the problem, first of here's the code:

Preke.H

#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

class Preke
{
private:
	string pav;			// prekės pavadinimas
	int atdata;			// atvežimo į parduotuvę data
	int pardata;		// pardavimo data
	int pkiek;			// prekių kiekis
	double kaina;		// prekės kaina
public:
	Preke(string p = "", int ad = 0, int pd = 0, int pk = 0, double k = 0.0):
	  pav(p), atdata(ad), pardata(pd), pkiek(pk), kaina(k) {}
	  ~Preke() {};
	  bool operator == (Preke & pr){
		  return (pr.kaina > kaina) || (pr.kaina == kaina && pr.pav < pav);
	  string Spausdinti()
	  {
		stringstream eil;
		eil.setf(ios::fixed);
		eil << left << setw(35) << pav
			<< right << setprecision(12) << setw(10) << atdata
			<< right << setprecision(12) << setw(10) << pardata
			<< right << setprecision(4) << setw(10) << pkiek
			<< right << setprecision(5) << setw(8) << kaina << endl;

		return eil.str();
	  }
};

Rinkinys.h

// Prekių rinkinio klasė
#include "Preke.h"

class Rinkinys
{
private:
	static const int CMax = 100;
	Preke R[CMax]; int n;		// konteineris - prekiu masyvas
public:
	Rinkinys(): n(0) {}
	~Rinkinys() {}
	int Kiek()  { return n; }
	int Talpa() { return CMax; }
	Preke Imti(int i)  { return R[i]; }
	void Deti(Preke p) { if (n < CMax) R[n++] = p; }
	void Rikiuoti();
};

Rinkinys.cpp

#include "Rinkinys.h"

void Rinkinys::Rikiuoti()
{
  Preke p;
  for(int i = 0; i < n; i++)
    for(int j = i+1; j < n; j++)
      if(R[j] >= R[i]) {
          p  = R[i];
        R[i] = R[j];
        R[j] = p;
      }
}

Preke.cpp

#include "Preke.h"

main.cpp

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
#include "Rinkinys.h"
//----------------------------------------------------
char const CDfv[] = "Duomenys.txt";
char const CRfv[] = "Rezultatai.txt";
//----------------------------------------------------
void Duomenys(Rinkinys & R);
void Spausdinti(Rinkinys & R);
void Atrinkti(Rinkinys & R, Preke p, Rinkinys & A);
//----------------------------------------------------
int main()
{
	ofstream fr(CRfv); fr.close();
}
//----------------------------------------------------
void Duomenys(Rinkinys & R)
{ 
  ifstream fd(CDfv);
  bool yra = true;
  int k = R.Talpa();
  fd.ignore(150, '\n');              // praleidžiama komentarų eilutė
  fd.ignore(150, '\n');              // praleidžiama komentarų eilutė
  char eil[36]; int atdata, pardata, pkiek; double kaina;
  while(!fd.eof() && yra) {         // kol yra duomenų ir ji telpa į masyvą
    fd.get(eil, sizeof eil);
    fd >> atdata >> pardata >> pkiek >> kaina;
    if(!fd.eof() && (R.Kiek() < k) )
       R.Deti(Preke(eil, atdata, pardata, pkiek, kaina));
    else yra = false;
    fd.ignore();
  }
  fd.close();
}
//----------------------------------------------------

//----------------------------------------------------
void Atrinkti(Rinkinys & R, Preke p, Rinkinys & A)
{
  for (int i = 0; i < R.Kiek(); i++){
    Preke pr = R.Imti(i);
    if (pr == p) A.Deti(pr);
  }
}

ERRORS THAT I'm GETTING

>------ Build started: Project: L6-15, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2148: total size of array must not exceed 0x7fffffff bytes
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2079: 'Preke::Rinkinys::R' uses undefined class 'Preke'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(8) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(8) : error C2864: 'Preke::CDfv' : only static const integral data members can be initialized within a class
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : error C2229: class 'Preke' has an illegal zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : error C2864: 'Preke::CRfv' : only static const integral data members can be initialized within a class
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(21) : error C2535: 'void Preke::Duomenys(Preke::Rinkinys &)' : member function already defined or declared
1>        c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(11) : see declaration of 'Preke::Duomenys'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(42) : error C2535: 'void Preke::Atrinkti(Preke::Rinkinys &,Preke,Preke::Rinkinys &)' : member function already defined or declared
1>        c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(13) : see declaration of 'Preke::Atrinkti'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(48) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Rinkinys.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2148: total size of array must not exceed 0x7fffffff bytes
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2079: 'Preke::Rinkinys::R' uses undefined class 'Preke'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(4) : error C3254: 'Preke' : class contains explicit override 'Rikiuoti' but does not derive from an interface that contains the function declaration
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(4) : error C2838: 'Rikiuoti' : illegal qualified name in member declaration
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(14) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Preke.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.cpp(2) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Generating Code...
1>Build log was saved at "file://c:\Users\andriusa\Desktop\L6_v2\L6-15\L6-15\Debug\BuildLog.htm"
1>L6-15 - 14 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

now my first guess it has something to do with me having const in main.cpp and preke.h that doesn't go along for some reason. Any help will be appreciated!

Dani AI

Generated

The huge cascade of errors you see all come from one syntactic problem: the Preke class definition is not closed where you think it is. That caused the compiler to treat the rest of your headers/sources as if they were nested inside Preke, which explains the odd messages about Preke::Rinkinys, zero-sized arrays, "only static const integral data members..." and "end of file found before the left brace". was right to point out a missing } — fix that first and most of the build noise will disappear.

After you close the class, make these semantic improvements so the rest of the errors do not come back:

  • Give comparison operators correct meanings and signatures. operator== should test real equality and be const taking const Preke&. For sorting, implement a const operator< (or a dedicated comparator) with clear ordering (for example: higher price first, then name ascending). Example pattern:
#ifndef PREKE_H
#define PREKE_H

// ... members ...

bool operator==(const Preke& o) const {
  return pav == o.pav && atdata == o.atdata && pardata == o.pardata
         && pkiek == o.pkiek && kaina == o.kaina;
}

bool operator<(const Preke& o) const {
  if (kaina != o.kaina) return kaina > o.kaina; // highest price comes first
  return pav < o.pav;
}

#endif
  • In Rinkinys, prefer const Preke& Imti(int i) const to avoid copies, and use if (R[j] < R[i]) swap(...) (or call std::sort on a std::vector<Preke>). You do not need to invent operator>=; derive other comparisons from operator<.

  • Fix file I/O patterns: avoid while(!fd.eof()) and C-style char eil[]. Use std::string and std::getline, or read with operator>> and check the stream state immediately. This prevents subtle parsing errors and incomplete last-line reads.

Checklist: close the missing } in Preke, change operator signatures to use const references and const methods, implement a clear operator<, and consider switching to std::vector + std::sort. After those changes, rebuild and address any remaining warnings one-by-one.

Recommended Answers

All 3 Replies

I think you can't initialise Cmax within the class:

static const int CMax = 100;

Try this:

  • In your Rinkinys.h file do the following alterations
    static const int CMax;
          Preke R[];
  • Now add to the top of your Rinkinys.cpp file:
    const int Riknikys::Cmax = 100;
          Preke Rinkinys::R[Cmax];

Post here if some of the errors were solved. :)

It just gives more errors I think

1>------ Build started: Project: L6-15, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2057: expected constant expression
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2079: 'Preke::Rinkinys::R' uses undefined class 'Preke'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2229: class 'Preke::Rinkinys' has an illegal zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(8) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(8) : error C2864: 'Preke::CDfv' : only static const integral data members can be initialized within a class
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : error C2229: class 'Preke' has an illegal zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(9) : error C2864: 'Preke::CRfv' : only static const integral data members can be initialized within a class
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(21) : error C2535: 'void Preke::Duomenys(Preke::Rinkinys &)' : member function already defined or declared
1>        c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(11) : see declaration of 'Preke::Duomenys'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(42) : error C2535: 'void Preke::Atrinkti(Preke::Rinkinys &,Preke,Preke::Rinkinys &)' : member function already defined or declared
1>        c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(13) : see declaration of 'Preke::Atrinkti'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\main.cpp(48) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Rinkinys.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2057: expected constant expression
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1>        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2079: 'Preke::Rinkinys::R' uses undefined class 'Preke'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.h(8) : error C2229: class 'Preke::Rinkinys' has an illegal zero-sized array
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(2) : error C2653: 'Riknikys' : is not a class or namespace name
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(2) : error C2864: 'Preke::Cmax' : only static const integral data members can be initialized within a class
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(3) : error C2597: illegal reference to non-static member 'Preke::Cmax'
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(3) : error C2838: 'R' : illegal qualified name in member declaration
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(6) : error C3254: 'Preke' : class contains explicit override 'Rikiuoti' but does not derive from an interface that contains the function declaration
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(6) : error C2838: 'Rikiuoti' : illegal qualified name in member declaration
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\rinkinys.cpp(16) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Preke.cpp
1>c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.cpp(3) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\andriusa\desktop\l6_v2\l6-15\l6-15\preke.h(7)' was matched
1>Generating Code...
1>Build log was saved at "file://c:\Users\andriusa\Desktop\L6_v2\L6-15\L6-15\Debug\BuildLog.htm"
1>L6-15 - 20 error(s), 4 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ok here is the code that I managed to compile on my system. I found one missing closing bracket at operator== in Preke class as well as calling operator>= while it is not defined. I marked all errors with "//!" comments on the side :)

#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

class Preke
{
private:
	string pav;			// prekės pavadinimas
	int atdata;			// atvežimo į parduotuvę data
	int pardata;		// pardavimo data
	int pkiek;			// prekių kiekis
	double kaina;		// prekės kaina
public:
	Preke(string p = "", int ad = 0, int pd = 0, int pk = 0, double k = 0.0):
	  pav(p), atdata(ad), pardata(pd), pkiek(pk), kaina(k) {}
	  ~Preke() {};
	  bool operator == (Preke & pr){
		  return (pr.kaina > kaina) || (pr.kaina == kaina && pr.pav < pav);
      } //!You were missing a closing bracket here

        //!You are also missing operator>= which would probably go here
      bool operator>=(Preke& pr) {
        return pr.atdata >= this->atdata;
      }
	  string Spausdinti()
	  {
		stringstream eil;
		eil.setf(ios::fixed);
		eil << left << setw(35) << pav
			<< right << setprecision(12) << setw(10) << atdata
			<< right << setprecision(12) << setw(10) << pardata
			<< right << setprecision(4) << setw(10) << pkiek
			<< right << setprecision(5) << setw(8) << kaina << endl;

		return eil.str();
	  }
};

// Prekių rinkinio klasė

class Rinkinys
{
private:
	static const int CMax = 100;
    Preke R[CMax];
	int n;		// konteineris - prekiu masyvas
public:
	Rinkinys(): n(0) {}
	~Rinkinys() {}
	int Kiek()  { return n; }
	int Talpa() { return CMax; }
	Preke Imti(int i)  { return R[i]; }
	void Deti(Preke p) { if (n < CMax) R[n++] = p; }
	void Rikiuoti();
};

void Rinkinys::Rikiuoti()
{
  Preke p;
  for(int i = 0; i < n; i++)
    for(int j = i+1; j < n; j++)
      if(R[j] >= R[i]) { //!You don't have an operator>= defined in Preke
          p  = R[i];
        R[i] = R[j];
        R[j] = p;
      }
}

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
//----------------------------------------------------
char const CDfv[] = "Duomenys.txt";
char const CRfv[] = "Rezultatai.txt";
//----------------------------------------------------
void Duomenys(Rinkinys & R);
void Spausdinti(Rinkinys & R);
void Atrinkti(Rinkinys & R, Preke p, Rinkinys & A);
//----------------------------------------------------
int main()
{
	ofstream fr(CRfv); fr.close();
}
//----------------------------------------------------
void Duomenys(Rinkinys & R)
{
  ifstream fd(CDfv);
  bool yra = true;
  int k = R.Talpa();
  fd.ignore(150, '\n');              // praleidžiama komentarų eilutė
  fd.ignore(150, '\n');              // praleidžiama komentarų eilutė
  char eil[36]; int atdata, pardata, pkiek; double kaina;
  while(!fd.eof() && yra) {         // kol yra duomenų ir ji telpa į masyvą
    fd.get(eil, sizeof eil);
    fd >> atdata >> pardata >> pkiek >> kaina;
    if(!fd.eof() && (R.Kiek() < k) )
       R.Deti(Preke(eil, atdata, pardata, pkiek, kaina));
    else yra = false;
    fd.ignore();
  }
  fd.close();
}
//----------------------------------------------------

//----------------------------------------------------
void Atrinkti(Rinkinys & R, Preke p, Rinkinys & A)
{
  for (int i = 0; i < R.Kiek(); i++){
    Preke pr = R.Imti(i);
    if (pr == p) A.Deti(pr);
  }
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.