2016-11-12 4 views
0

Ich habe 2 KlassenC++ Zugriffsklassenfeld aus einer anderen Klasse Syntax

class Book 
{ 
public: 

    int _pages; 
    string* _name; 
}; 
class Shelf 
{ 
public: 
int shelfName; 
int _booksCount; 
book** _books; 
}; 

(mit mehr irrelevant Funktion und Variablen)

und ich möchte Funktion schaffen, die die Gesamt-Seiten auf dem Regal berechnen werden, ich bin neu OOP so dass das, was ich zu tun versucht:

double Shelf:: getAvg() 
{ 
    int sum, i; 
    for (int i = 0; i < __bookCount-1; i++)// the count not considering inedx 0 
    { 
     sum += _books[i]._pages;// need to be fixed<< 
    } 
} 

ich bin ziemlich sicher, dass das einzige Problem, die letzte Zeilensyntax ist, können Sie bitte leiten mich, wie es zu korrigieren? danken im Voraus

+0

Welcher Typ ist 'Bücher [i]'? Wie dererenzieren Sie einen von denen? Beginnen Sie Ihre Bezeichner nicht mit einem Unterstrich; Diese Namen sind reserviert. – 1201ProgramAlarm

+0

mein Lehrer erfordert es den Unterstrich, Bücher ist 2D-Array, also dachte ich, wenn ich Index setzen wird es das Buch selbst sein, aber das ist das Problem in meinem Code, so dass ich nicht weiß, was ist die Syntax ... – ariel20

+0

'__bookCount' ist eine schlechte Idee. [Welche Regeln gelten für die Verwendung eines Unterstrichs in einer C++ - ID?] (Http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier) – user4581301

Antwort

0

vier Ausgaben:

  1. Sie haben einen Tippfehler in Namen __bookCount innerhalb der for-Schleife: es sollte _bookCount sein (ein '_' statt zwei)
  2. Du zunehmende i Solange es weniger als _bookCount - 1 ist: Sie sollten das auf ein kleineres oder gleiches Zeichen ändern oder nur eingeben.
  3. Sie haben keine return Anweisung in Ihrem Code.
  4. Sie haben Doppelzeiger auf _books, also _books[i] ist keine Objektinstanz, es ist ein Zeiger für ein Objekt der Klasse Book. Verwenden Sie stattdessen _books[i]->_pages oder (*_books[i])._pages
+0

vielen Dank – ariel20

0

Sie haben mehrere Fehler dort.

  • Senseless * in _name Mitglied
  • Typo _booksCount
  • Fehlende Rückkehr in Verfahren getAvg
  • der Methode Fehlende Erklärung getAvg in Shelf Klasse
  • Und zuletzt, großer Fehler ist, dass Sie Mitglied haben Book** _books Das ist der Zeiger des Zeigers, aber Sie greifen darauf zu, wenn es nur Zeiger waren. Sie sollten _books nur als Book* _books deklarieren.

Der Code sollte (können) wie folgt aussieht:

class Book { 
    public: 
     int _pages; 
     string _name; 
}; 

class Shelf { 
public: 
    int shelfName; 
    int _booksCount; 
    Book* _books; 

    double getAvg(); 
}; 

double Shelf::getAvg() 
{ 
    int sum, i; 
    for (int i = 0; i < _booksCount; i++) 
    { 
     sum += _books[i]._pages; 
    } 

    return sum/_booksCount; 
} 

Ich hoffe, es hilft :)

Idee: Sie können einige stl Behälter (zB vector) für anstelle von Array verwenden Books in Shelf

vector<Book> _books; 

denn wenn Sie * und neue (oder malloc) für die Initialisierung, das Objekt i s nicht auf dem Stack, sondern auf dem Heap, so sollten Sie es löschen löschen (oder frei) oder es wird Speicherlecks verursachen.

0

Ich glaube, Sie würden etw wie dies tun:

#include <vector> 
#include <string> 
#include <iostream> 
#include <memory> 

class Book 
{ 
public: 
    int _pages; 
    std::string* _name; 
    Book(const char* nameArg, size_t pagesArg): _name(new std::string(nameArg)), _pages(pagesArg) {} 
    ~Book() { delete name;} 
}; 

class Shelf 
{ 
    std::string shelfName; 
    std::vector<std::unique_ptr<Book>> _books; 
public: 
    Shelf(const char* nameArg): shelfName(nameArg) { 
    } 

    void addBook(const char* bookNameArg, size_t pagesArg) { 
     _books.push_back(std::unique_ptr<Book>(new Book(bookNameArg, pagesArg))); 
    } 

    size_t getNoPagesOnShelf() const { 
     size_t pagesCount = 0; 
     for(int tmp = 0; tmp < _books.size(); ++tmp) { 
       pagesCount += _books[tmp]->_pages; 
     }   
    return pagesCount; 
    } 
}; 


int main() { 
Shelf shelf("Number 1"); 
shelf.addBook("Book1", 500); 
shelf.addBook("Book1", 20); 
shelf.addBook("Book1", 300); 
std::cout << "Total number of pages in shelf is : " << shelf.getNoPagesOnShelf() << std::endl; 
} 

Compile mit C++ 11-Flag, wenn Sie g verwenden ++ hinzufügen --std = C++ 11 Hoffnung hilft diese

Verwandte Themen