c ++从另一个类语法访问类字段

时间:2016-11-12 23:21:11

标签: c++ class oop syntax

我有2个班级

class Book
{
public:

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

(更多不相关的函数和变量)

我想创建一个函数,它将计算货架上的总页数,我是新的OOP,以便我尝试做的事情:

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

我很确定唯一的问题是最后一行语法,你能指导我如何纠正它吗? 提前谢谢

3 个答案:

答案 0 :(得分:0)

四个问题:

  1. 你在for循环中有一个名为__bookCount的拼写错误:它应该是_bookCount(一个'_'而不是两个)
  2. 只要i小于_bookCount - 1,就会增加_bookCount:您应该将其更改为小于或等于符号,或仅将return放在那里。
  3. 您的代码中没有_books语句。
  4. 你有_books[i]的双指针,所以Book不是一个对象实例,它是一个指针,用于类_books[i]->_pages的对象。您应该使用(*_books[i])._pages代替{{1}}

答案 1 :(得分:0)

那里有多个错误。

  • _name成员
  • 中的无意义*
  • 错字_booksCount
  • 方法getAvg
  • 中缺少返回
  • getAvg class
  • 中缺少方法Shelf的声明
  • 最后,主要的错误是,你有成员Book** _books这是指针的指针,但如果它只是指针你就可以访问它。您应该仅将_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容器(例如Books)而不是Shelf的数组
vector<Book> _books;

因为如果你使用*和new(或malloc)进行初始化,你的对象不会在堆栈上分配,而是在堆上,所以你应该用delete(或free)删除它,否则会导致内存泄漏。

答案 2 :(得分:0)

我想你想这样做:

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

使用c ++ 11标志编译,如果您使用的是g ++ add --std = c ++ 11 希望这有帮助