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

Posted

技术标签:

【中文标题】c ++从另一个类语法访问类字段【英文标题】:c++ Access class field from another class syntax 【发布时间】:2016-11-12 23:21:11 【问题描述】:

我有两节课

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

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

【问题讨论】:

books[i] 是什么类型?你如何取消引用其中之一?不要用下划线开始你的标识符;这些名称是保留的。 我的老师要求它是下划线,books 是二维数组,所以我想如果我把索引放在这本书本身,但这是我的代码中的问题,所以我不知道是什么是语法... __bookCount 是个坏主意。 What are the rules about using an underscore in a C++ identifier? 【参考方案1】:

那里有多个错误。

_name 成员中的无意义 * _booksCount 错字 方法 getAvg 中缺少返回值 Shelf 类中缺少方法 getAvg 的声明 最后,主要错误是,您有成员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;

希望对你有帮助:)

想法:您可以使用一些 stl 容器(例如 vector)而不是 Books 中的数组 Shelf

vector<Book> _books;

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

【讨论】:

【参考方案2】:

我想你想这样做:

#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++ 添加 --std=c++11 希望这会有所帮助

【讨论】:

【参考方案3】:

四个问题:

    您在 for 循环中的名称 __bookCount 中有错字:应该是 _bookCount(一个“_”而不是两个) 只要小于 _bookCount - 1,您就增加了 i:您应该将其更改为小于或等号,或者只输入 _bookCount。 您的代码中没有 return 语句。 你有一个指向_books的双指针,所以_books[i]不是一个对象实例,它是一个Book类对象的一个指针。您应该改用_books[i]-&gt;_pages,或(*_books[i])._pages

【讨论】:

以上是关于c ++从另一个类语法访问类字段的主要内容,如果未能解决你的问题,请参考以下文章

在目标 C 中引用另一个类中的实例化对象

如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面

从另一个类访问 IBOutlet

6.5 继承

从另一个类访问 MainWindow 类成员

如何使用 ExtJs 4 和 MVC 从另一个类访问一个类?