Új hozzászólás Aktív témák
-
mgoogyi
senior tag
1, Ha csinálsz egy olyat, hogy
delete pData; akkor csináld így:
if (pData!=null) {
delete pData; pData = null;
}Ha úgy próbálsz felszabadítani, hogy a pData-t már egyszer felszabadítottad, el fog szállni futás közben, ezért a null-ra állítással jelzed magadnak, hogy felszabadítottad-e vagy sem.
Meg engem eléggé zavar, hogy pData=0; -t használsz pData=null; helyett.
2, A get()-nél nem ellenőrzöd, hogy elementNum elérte-e a nullát, mert ha igen, akkor a pData[0]-tól semmi jót ne várj.
3, az empty()-nél is ez kéne:
if (pData!=null) {
delete pData; pData = null;
}4, Nagyon nem hatékony, hogy minden egyes beszúrásnál és törlésnél újrafoglalod a tömböt meg átmásolgatod az elemeket. Célszerűbb lenne egy oda-vissza láncolt lista.
Remélem tudtam segíteni! Ha null-t Null-nak vagy NULL-nak kell itt írni, akkor sorry, mostanában inkább java-zok...
-
Jester01
veterán
Nem működő programok esetén
1) használj debuggert
2) használj memória-hozzáférés ellenőrzőt (valgrind)
3) mondd meg pontosan milyen bemenetre milyen hibát ad, vagy mennyiben nem várt eredményt (a "nem fut le normálisan" nulla információ)
4) teljes, futtatható programot postolj, hogy mi is ki tudjuk próbálni (ebben ugye nem volt main)Jester
-
mgoogyi
senior tag
#include "fifo.h"
#include<stdio.h>FiFo:iFo()
{
elementNum=0;
pData=0;
}FiFo:iFo(const FiFo&theOther)
{
if(theOther.elementNum==0)
{
elementNum=0;
pData=0;
}
else
{
elementNum=theOther.elementNum;
pData=new double[elementNum];
for(int i=0;i<elementNum;i++)
{
pData=theOther.pData(i);
}
}
}FiFo::~FiFo()
{
if (pData) {
delete [] pData;
pData = 0;
}
}double FiFo::get()
{
if (elementNum==0) {
return 0;
}if(elementNum==1)
{
double element=pData[0];
if (pData) {
delete [] pData;
pData = 0;
}
elementNum=0;
return element;
}
elementNum--;
double element=pData[0];
double*pTemp=new double[elementNum];
for(int i=0;i<elementNum;i++)
{
pTemp(i)=pData[i+1];
}
if (pData) {
delete [] pData;
pData = 0;
}
pData=pTemp;
return element;
}bool FiFo::put(double element)
{
double*pTemp=new double[elementNum+1];
elementNum++;
for(int i=0;i<elementNum-1;i++)
{
pTemp(i)=pData(i);
}
pTemp[elementNum-1]=element;
if (pData) {
delete [] pData;
pData = 0;
}
pData=pTemp;
return true;
}bool FiFo::empty()
{
elementNum=0;
if (pData) {
delete [] pData;
pData = 0;
}
return true;
}Alapból a destruktorban szállt el, hiszen a get()-nél mikor kivetted az utolsó elemet, már felszabadítottad a pData-t, a destruktor pedig még1x megpróbálta ezt megtenni.
-
Jester01
veterán
Neked igen érdekes hibát dob a fordító, az enyém az "érthetően" megmondja mi a baj:
Vector.cpp:127: error: no match for 'operator<<' in 'std:perator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std:stream*)os)), 32) << ((const Vector*)v)->Vector::at(i)'
Magyarul, a Vector-t kiíró operator<< a String-et kiíró operator<< függvényt szeretné hívni, csakhogy ilyen nincs. Van helyette viszont String::print, szóval ez jobb: os<<' '; v.at(i).print(os); Ehhez még szükséges a String::print const-tá alakítása, illetve a Vector.h-ban az operator<< prototípusát is javítani kell mert nem egyezik az implementációval. Ha ez mind megvan, akkor már fordul, csak nem működik
Felhívom a figyelmed továbbá, hogy a string konstansok azok bizony konstansok, tehát const char* típusúak.
Jester
-
Sk8erPeter
nagyúr
Legközelebb azért az ilyen hosszúakat légyszi a pastebin.com-ra, vagy a pastie.org-ra copy-paste-eld, ezeken az oldalakon szépen kiemeli a szintaktikát is (ha bejelölöd, hogy pl. C++ nyelvű forráskód), és így könnyebb áttekinteni, mint itt a PH-n. Ja, és ide csak dobd be a linket, amit kapsz a bemásolás után.
[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
Hali!
Az eredeti kód azért nem fordul, mert void visszatérési értékű a getParameter() függvényed a Gift osztályban, ami miatt a cout elszáll.
Ezt megoldhatod úgy, hogy inkább double visszatérési értékűvé változtatod:
double getParameter(){ return 0; }; /// void getParameter(){} helyettDe ennél a kiíratást egyszerűbben oldanám meg, mondjuk lehetne minden osztálynak egy void print() művelete, ami épp a feladat által kiírt tulajdonságokat írná ki.
Egy lehetséges példa a Te feladatodra vonatkozóan:
-a Gift osztályban deklarálj egy
virtual void print();
függvényt, az összes többi osztályban pedig egy sima (nem virtuális)
void print();
függvényt.
-maga a megvalósítás pedig a következőképpen nézhetne ki (csak egy lehetséges megoldás, lehetne rajta bőven csiszolni, de gyorsmegoldásként szerintem megfelel):using namespace std;
void Gift::print()
{
cout << "Weight: " << baseWeight << endl;
cout << "Quantity: " << db << endl;
}
void ColoredEgg::print()
{
cout << "Name: Colored Egg" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
char colours[4][7] = { "RED", "GREEN", "BLUE", "VIOLET" };
cout <<"Color: "<< colours[colour] << endl;
}
void ChocolateFigure::print()
{
cout << "Name: Chocolate Figure" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
std::cout <<"Melting Point: "<< MeltingPoint << endl;
}
void Candy::print()
{
cout << "Name: Candy" << endl;
cout << "Quantity: " << getWeight() << endl;
//Paraméter:
char quality_names[4][5] = { "HARD" , "SOFT" };
std::cout <<"Quality: "<< quality_names[quality] << endl;
}-Ezenkívül szerintem a destruktort a Gift osztályban virtuálissá kellene tenned, hogy ne legyen memóriaszivárgás:
virtual ~Gift() {}
A Testing.cpp-ben pedig a for ciklus akkor ez alapján a következőképpen nézhetne ki (a többi rendben van):
for (int i = 0; i < 3; i++) // kiíratjuk
{
cout << "************************" <<endl; //csak az elválasztás kedvéért
Present[i]->print();
}Sk8erPeter
-
Jester01
veterán
Ha tényleg nem szereti a 3 paraméteres változatot akkor ott valami gubanc van a fordítási környezettel mert az összes fellelhető dokumentáció azt állítja hogy ez szabványos. Ha a környezettel nem tudsz mit kezdeni akkor nincs más hátra mint előre, és írni egy a követelményeidnek megfelelő rendezést kézzel.
Jester
-
sghc_toma
senior tag
ha irtal kisebb operatort, akkor nem kell harmadik parameter, mivel a sort alapbol azt hasznalja.. tehat pl. ennek igy mukodnie kell:
#include <vector>
#include <algorithm>
class Product
{
//...
int value;
public:
friend bool operator<(const Product & p1, const Product & p2);
}
bool operator<(const Product & p1, const Product & p2)
{
return p1.value < p2.value;
}
int main()
{
std::vector<Product> products;
//...
std::sort(products.begin(), products.end());
return 0;
}[ Szerkesztve ]
in asm we trust
-
sghc_toma
senior tag
a Termekek.h-ban van egy ilyen:
Product& operator<(Product& j1,Product& j2);
ez ugye nem OK, bool a helyes visszateresi ertek..meg egy ilyen:
return strcmp(j1.get_name(),j2.get_name());
ez nem jo, mert akkor igaz, ha nem egyenlo a ket nev, nem akkor, amikor az elso kisebb..
Es ami a fo problema: a vektorban ugye pointereket tarolsz, az operator< meg referenciakkal dolgozik, ez igy nem okes.. tehat kell egy osszehasonlito fv., ami valahogy igy nez ki:
bool compare(Product * p1, Product * p2)
{
return strcmp(p1->get_name(), p2->get_name()) < 0;
}ezt megadhatod harmadik parameternek a sort-nak..
remelem nem neztem el semmit (kicsit sietve futottam at a kodot, eppen beadandot irok )in asm we trust
-
sghc_toma
senior tag
hm.. fura, nalam fordul.. itt vannak a diff-ek a pastebin-es kodhoz kepest:
diff Termekek.h Termekek_mine.h
158c158
< Product& operator<(Product& j1,Product& j2);
---
> bool compare(Product * j1, Product * j2);diff Termekek.cpp Termekek_mine.cpp
482c482
< sort(store.begin(),store.end());
---
> sort(store.begin(),store.end(), compare);
485c485
< bool operator<(Product& j1,Product& j2)
---
> bool QuickFrozen::compare(Product * j1, Product * j2)
487c487
< return strcmp(j1.get_name(),j2.get_name());
---
> return strcmp(j1->get_name(), j2->get_name()) < 0;ja, es a main fuggvenyed void visszateresi erteku.. ez nem okes, int-nek kene lennie.. nem is ertem, a cl miert nem szol erte (W4-gyel sem)..
in asm we trust
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!