Προς το περιεχόμενο

Μπλέξιμο με C++


drunken_guy

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδιά. Έχω μια απορία σχετικά με την c++. (είμαι αρκετά noob σε αυτήν την γλώσσα και τα έχω βρει σχετικά σκούρα). Σας δείχνω το κομμάτι του κώδικα που έχω πρόβλημα. Είναι μια κλάση OrderItem και θέλω να έχει πεδία μια λίστα από struct product και την ώρα που γίνεται η καταχώρηση. (Το QTime είναι κλάση επεξεργασίας ώρας και είναι του IDE QT, καθώς αυτό χρησιμοποιούμε στο συγκεκριμένο μάθημα.)

>#ifndef ORDERITEM_HPP
#define ORDERITEM_HPP
#include <QTime>
#include <vector>
#include <string>
#include "fooditem.hpp"
struct product {
 FoodItem item;
 std::string note;
} ;
class OrderItem
{
private:
   QTime orderTime;
   std::vector<product> itemsOrdered;
public:
   OrderItem();
   OrderItem(FoodItem item, QTime t,std::string);

};

#endif // ORDERITEM_HPP

Το πρόβλημα μου είναι πως στο αντίστοιχο cpp αρχείο θέλω ο constructor να είναι της μορφής OrderItem(FoodItem item, QTime t,std::string) και να δημιουργεί ένα καινούργιο struct product και να το προσθέτει στην λίστα. Πως το κάνω αυτό; Πρέπει μήπως να ξαναγράψω το struct στο cpp ή μήπως κανα include; Ευχαριστώ!

Δημοσ.

Στο OrderItem.cpp ούτως ή άλλως θα κάνεις include το OrderItem.hpp. Και από τη στιγμή που το τελευταίο περιέχει και τον ορισμό του struct product, δεν χρειάζεται να το κάνεις include ξανά.

Δημοσ.

Στο OrderItem.cpp ούτως ή άλλως θα κάνεις include το OrderItem.hpp. Και από τη στιγμή που το τελευταίο περιέχει και τον ορισμό του struct product, δεν χρειάζεται να το κάνεις include ξανά.

Πρώτα από όλα συγχαρητήρια για το post σου #16666 :devil: :-D

Σοβαρά όμως τώρα. Ένας constructor της μορφής

>OrderItem::OrderItem(FoodItem item, QTime t,std::string s)
{
   product a;
   a.item=item;
   a.note=s;
   orderTime=t;
   itemsOrdered.push_back(a);

}

θα ήταν σωστός; Επίσης κλάσεις που θα κληρονομούν την OrderItem θα έχουν πρόσβαση στο struct; Θα μπορούν δηλαδή να χρησιμοποιούν και αυτά τέτοιο struct ή θα χρειάζεται δήλωση πάλι;

Δημοσ. · Κρυμμένο από parsifal, 29 Ιουνίου 2011 - Διπλό μήνυμα ή θέμα
Κρυμμένο από parsifal, 29 Ιουνίου 2011 - Διπλό μήνυμα ή θέμα

Στο OrderItem.cpp ούτως ή άλλως θα κάνεις include το OrderItem.hpp. Και από τη στιγμή που το τελευταίο περιέχει και τον ορισμό του struct product, δεν χρειάζεται να το κάνεις include ξανά.

Πρώτα από όλα συγχαρητήρια για το post σου #16666 :devil: :-D

Σοβαρά όμως τώρα. Ένας constructor της μορφής

>OrderItem::OrderItem(FoodItem item, QTime t,std::string s)
{
   product a;
   a.item=item;
   a.note=s;
   orderTime=t;
   itemsOrdered.push_back(a);

}

θα ήταν σωστός; Επίσης κλάσεις που θα κληρονομούν την OrderItem θα έχουν πρόσβαση στο struct; Θα μπορούν δηλαδή να χρησιμοποιούν και αυτά τέτοιο struct ή θα χρειάζεται δήλωση πάλι;

Δημοσ.

Ένας constructor της μορφής

>OrderItem::OrderItem(FoodItem item, QTime t,std::string s)
{
   product a;
   a.item=item;
   a.note=s;
   orderTime=t;
   itemsOrdered.push_back(a);

}

θα ήταν σωστός;

Περνάς τα ορίσματα στον constructor by value, με αποτέλεσμα να δημιουργούνται περιττά προσωρινά αντίγραφα αυτών. Αντί γι' αυτό, χρησιμοποίησε references.

 

Επίσης, μιας και «παίζεις» με Qt, θα μπορούσες αντί για τα containers της STL να χρησιμοποιήσεις τα αντίστοιχα του Qt framework: QVector, QString

 

 

Επίσης κλάσεις που θα κληρονομούν την OrderItem θα έχουν πρόσβαση στο struct; Θα μπορούν δηλαδή να χρησιμοποιούν και αυτά τέτοιο struct ή θα χρειάζεται δήλωση πάλι;

Σκέψου το λίγο: Εκεί (στο αρχείο) που θα κάνεις το subclassing σου, δε θα πρέπει να έχεις κάνει include τον header της superclass OrderItem (ο οποίος περιέχει τον ορισμό του struct); Είναι ακριβώς ίδια περίπτωση με αυτό που σου απάντησα στο 1ο μου μήνυμα!

Δημοσ.

Ευχαριστώ πολύ για την βοήθεια και sorry αν φάνηκαν λίγο χαζές αλλά προερχόμενος από java έχω μπερδευτεί φουλ με τα includes και τα * ή &.. Α χρειάζεται μήπως να το μαρκάρω κάπως το θέμα ως λυμένο; Ευχαριστώ και πάλι!

Δημοσ.

Λοιπόν είπα να μην ξεκινίσω καινούργιο θέμα μιας και έχω καινούργιο πρόβλημα στο ίδιο πρόγραμμα. Παρακάτω δείχνω τον κώδικα του βασικού μου παραθύρου:

 

>#include "MainWindow.hpp"

#include "FoodItem.hpp"

#include "string"

#include "QMessageBox"

#include "iostream"

#include "QWidgetItem"

#include "QListWidgetItem"

#include "qstring"

#include <sstream>

#include "OrderEatIn.hpp"

#include "OrderOK.hpp"

#include "OrderItem.hpp"

#include "vector"

#include "QStringList"

MainWindow::MainWindow(QWidget *parent) :

   QMainWindow(parent)

{

   setupUi(this);

   deliveryBoy->setDisabled(true);

   orderList->setDisabled(true);



/*

   for(int i=0;i<10;i++)

   {

       std::string name=menu[i]->getName();

       QString qstr(name.c_str());

       list->addItem(qstr);



   }*/



   this->initList();



}



void MainWindow::on_action_triggered()

{

   this->close();

}



void MainWindow::on_infoBut_clicked()

{





   for(int i=0;i<list->count();i++)

   {

       QListWidgetItem* curItem=list->item(i);



       QTableWidgetItem* it=new QTableWidgetItem(curItem->text());

       if(curItem->isSelected())

       {



          //tableWidget->setItem(0,0,it);



           for(int j=0;j<10;j++)

           {

               QString qst(menu[j]->getName().c_str());

               QString listName(curItem->text());

               if(qst.compare(listName)==0)

               {



                   QMessageBox::information(this,menu[j]->getName().c_str(),menu[j]->getPerigrafi().c_str());

               }

               //break;

           }

      // break;

       }

   }

}



void MainWindow::on_action_2_triggered()

{

   QMessageBox::about(this,"About the application","Design and Writing the api: \nDimitris Glukiotis\nDeligiannis Kimonas");

}







void MainWindow::on_tabWidget_currentChanged(int index)

{

   waiterName->setDisabled(true);

   orderList->clear();

   orderList->setDisabled(false);

   if(index==0)waiterName->setDisabled(false);

   if(index==2)

   {

       deliveryBoy->setDisabled(false);

   }

   else{



       deliveryBoy->setDisabled(true);

   }

}



void MainWindow::on_tableWidget_cellClicked(int row, int column)

{

   QTime time=timeEdit->time();

   this->orderInStore=new OrderEatIn(time);



   orderList->clear();

   orderList->setDisabled(false);

   std::string string;

   std::stringstream out;

   out<<"New Order For: "<<row<<":"<<column;

   string=out.str();

   QString str(string.c_str());

   QListWidgetItem itm(str);

   orderList->insertItem(0,str);

   if(row==0)waiterName->setCurrentIndex(0);

   else if(row==1)waiterName->setCurrentIndex(1);

   else waiterName->setCurrentIndex(2);









}



void MainWindow::on_buttonBox_rejected()

{

   orderList->clear();

   orderList->setDisabled(true);



}



void MainWindow::on_buttonBox_accepted()

{

   if(tabWidget->currentIndex()==0)

   {

       if(orderList->isEnabled()&&orderList->count()>1)

       {

           float price=this->orderInStore->sumPrice();

           priceLine->setText(QString::number(price));





           QString qstr="";

          // std::vector<OrderItem> orderVector=this->orderInStore->getList();

           for (std::vector<OrderItem>::iterator it = this->orderInStore->getList().begin();

           it != this->orderInStore->getList().end(); ++it)

           {

               qstr=qstr+(*it).getFood().getName().c_str()+"\n";

           }

           OrderOK orderBox("In Store Order",waiterName->currentText(),"",QString::number(price),0,qstr);



           orderBox.exec();

           if(orderBox.Accepted)

           {

               orderList->clear();

               orderList->setDisabled(true);

               priceLine->setText("");

               quantityNum->setValue(1);

               quantityNum->setSuffix("");

           }





       }

   }

}

void MainWindow::initList()

{



   this->menu[0]=new FoodItem("Patates Giaxni","Patates psites me tyri","merida",7,8);

   this->menu[1]=new FoodItem("Brokolaki","Mprokolo me pagwto","merida",4,5);

   this->menu[2]=new FoodItem("Xoriatiki Salata","Ntomata, feta, aggouri","merida",5,6);

   this->menu[3]=new FoodItem("Pagoto Special","Sokolata, fraoula, fustiki","kilo",4.5,6);

   this->menu[4]=new FoodItem("Gemista","Ntomata kai piperia","merida",6,7);

   this->menu[5]=new FoodItem("Banana split","banana, sokolata","kilo",10,12);

   this->menu[6]=new FoodItem("Paidakia","Paidakia patates","kilo",11,13);

   this->menu[7]=new FoodItem("Special Burger","burger kai rokfor","merida",4,5);

   this->menu[8]=new FoodItem("Salata Sef","Ta gnwsta kai magioneza","merida",5,6);

   this->menu[9]=new FoodItem("Kotopoulo","Kota kai patata","kilo",9,10);

   list->clear();







   for(int i=0;i<10;i++)

   {

       std::string name=menu[i]->getName();

       QString qstr(name.c_str());

       list->addItem(qstr);



   }



}









void MainWindow::on_addBut_clicked()

{

   if(tabWidget->currentIndex()==0)

   {



       if(orderList->isEnabled())

       {



           for(int i=0;i<list->count();i++)

           {

               //QListWidgetItem* itm=new QListWidgetItem(list->item(i)->text());

               QString itm=list->item(i)->text();

               if(list->item(i)->isSelected())

               {

                   for(int j=0;j<10;j++)

                   {

                       QString foodName=menu[j]->getName().c_str();

                       if(foodName.compare(itm)==0)

                       {

                           if(this->orderInStore->changeQuantity(*menu[j],quantityNum->value()))

                           {



                           }

                           else this->orderInStore->addToOrder(*menu[j],menu[j]->getPerigrafi(),quantityNum->value());

                       }

                       /*EDW MPAINOUNE Gia delivery oi listes kai takeaway Me elseif*/

                   }

                   if(orderContains(itm,quantityNum->value(),i))

                   {



                   }

                   else

                   {

                       itm=itm+" * "+quantityNum->text();

                       //list->takeItem(i);

                       orderList->addItem(itm);

                   }



                   quantityNum->setValue(1);

                   break;

               }



           }

       }

   }

}

bool MainWindow::orderContains(QString foodName,float q,int i)

{

   for(int i=1;i<orderList->count();i++)

   {

       QStringList l;

       QString name="";

       l=orderList->item(i)->text().split(" ");

       bool oneword=true;

       if(l.at(1).compare("*")==0)

       {

           name=l.at(0);

       }

       else if(l.at(2).compare("*")==0)

       {

           name=l.at(0)+" "+l.at(1);

           oneword=false;

       }

       if(name.compare(foodName)==0)

       {

           if(oneword)

           {

               float oldQ=l.at(2).toFloat();

               oldQ=oldQ+q;

               QString item=foodName+" * "+QString::number(oldQ)+" "+l.at(3);

               orderList->takeItem(i);

               orderList->addItem(item);

           }

           else

           {

               float oldQ=l.at(3).toFloat();

               oldQ=oldQ+q;

               QString item=foodName+" * "+QString::number(oldQ)+" "+l.at(4);

               orderList->takeItem(i);

               orderList->addItem(item);

           }

           return true;

       }

   }

   return false;

}



void MainWindow::on_list_itemClicked(QListWidgetItem* item)

{



   for(int i=0;i<10;i++)

   {

       QString nameOf(this->menu[i]->getName().c_str());

       if(nameOf.compare(item->text())==0)

       {

           QString typeOf(this->menu[i]->getMonada().c_str());

           if(typeOf.compare("kilo")==0)

           {

               quantityNum->setSuffix(" kg");

               quantityNum->setValue(1);



           }

           else{

               quantityNum->setSuffix(" Merida");

               quantityNum->setValue(1);
          }
    }

   }

}

Έχω το εξής πρόβλημα.. Στην συνάρτηση void MainWindow::on_buttonBox_accepted() παίρνω segmentation στο πρώτο στοιχείο της λίστας. Επίσης στο παράθυρο orderOK που θα έπρεπε να εμφανίζονται τα στοιχεία της λίστας, εμφανίζονται όλα κανονικά εκτός του πρώτου στοιχείου. Η δημιουργία της λίστας γίνεται στο on_addBut_clicked. Οποιαδήποτε ιδέα θα ήταν χρήσιμη..

Δημοσ.

Κάτι βρήκα γενικά. Κάποιο λάθος υπήρχε στην διάτρεξη με iterator. Όταν το γύρισα σε μια κλασσική for, δουλεύει κομπλέ, οπότε nevermind! :)

Δημοσ.

παιδιά είμαι αρχάριος σε αυτήν την γλώσσα και θέλω να την μάθω...αν κάποιος μπορεί να μου βρει e-books και κάποιο πρόγραμμα που θα μπορώ να προγραμματιζω...Ευχαριστώ πολύ!!!

Δημοσ.

παιδιά είμαι αρχάριος σε αυτήν την γλώσσα και θέλω να την μάθω...αν κάποιος μπορεί να μου βρει e-books και κάποιο πρόγραμμα που θα μπορώ να προγραμματιζω...Ευχαριστώ πολύ!!!

Ίσως για αρχή να σου φανεί χρήσιμο το dev-c++. Είναι σχετικά απλό, εύκολο στην εγκατάσταση και με debugger που ψιλοπαλεύεται. Τώρα για ebooks δεν μπορώ να σε βοηθήσω, αλλά σίγουρα υπάρχει το site με τα references της c++ που προσφέρει καλή βοήθεια και πρέπει να έχει και tutorials :)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...