2016-11-12 7 views
0

から、私は(多くの無関係な機能と変数を持つ)2クラスC++のアクセスクラスフィールド別のクラスの構文

class Book 
{ 
public: 

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

を持っていると私は、棚の上の総ページを計算する関数を作成したいですあなたはどのようにそれを修正するために私を導いてくださいすることができ、私は唯一の問題は、最後の行の構文であるかなり確信している

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<< 
    } 
} 

:私が実行しようとしました何ように、新しいOOPのですか? 感謝は事前

+0

'books [i]'の種類は何ですか?どのようにそれらのうちの1つを逆参照しますか?識別子をアンダースコアで開始しないでください。これらの名前は予約されています。 – 1201ProgramAlarm

+0

私の先生はアンダースコアを必要とします、本は2次元配列なのでインデックスを置くと本自体になりますが、これは私のコードの問題なので、構文は何か分かりません... – ariel20

+0

'__bookCount'は悪い考えです。 [C++識別子でアンダースコアを使用する際の規則は何ですか?](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier) – user4581301

答えて

0

つの問題に:

  1. あなたはループの内部名__bookCountのタイプミスを持っている:それは_bookCount(1「_」の代わりに、2)である必要があり
  2. あなたはiを増加しています限り、_bookCount - 1より小さい限り:あなたはそれをより小さいか等号に変更するか、_bookCountだけを置くべきです。
  3. コードにはreturnというステートメントはありません。
  4. ​​へのダブルポインタがあるので、_books[i]はオブジェクトインスタンスではありません。Bookというオブジェクトのポインタです。代わりに_books[i]->_pagesを使用するか、(*_books[i])._pages
+0

ありがとう – ariel20

0

あなたは複数のエラーがあります。

  • _nameメンバー
  • 誤植_booksCount
  • で無意味な* Shelfクラス
  • そして最後のメソッドgetAvgの宣言を紛失方法getAvg
  • で戻りがありません、主要なエラーは、メンバーBook** _booksを持っていること、ですこれはポインタのポインタですが、ポインタだけであればそれにアクセスします。​​はBook* _booksとしてのみ宣言する必要があります。
  • あなたのコードは(缶)べき

は、次のようになります。私は願っています

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; 
} 

、それは:)

アイデアを支援します。あなたは、のために、配列の代わりに(たとえばvector用)いくつかのSTLコンテナを使用することができます

vector<Book> _books; 

ShelfBooksので、あなたが使用している場合*と初期化のための新しい(またはmalloc関数)、あなたのオブジェクトIスタックには割り当てられていませんが、ヒープには割り当てられていないので、削除(または空き)で削除する必要があります。そうしないとメモリリークが発生します。

0

私はあなたがこのようSTHをしたいと思います。C++ 11フラグ付き

#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; 
} 

コンパイル、あなたはこれが

を助け--std = C++ 11 希望を追加する++グラムを使用している場合、