【问题标题】:can't access public fields in class | c++无法访问类中的公共字段 | C++
【发布时间】:2013-06-22 09:27:40
【问题描述】:

我这里有这门课 (这是一个 .h 文件)

    #ifndef STORE_H_
    #define STORE_H_

    #include <iostream>
    #include <set>
    #include "list.h"
    #include "Album.h"
    #include "Customer.h"


class Store {

    public:
static const int currentYear = 2013;
Store();
void addAlbum(int barcode, int price, int year, int numPurchased, string title,                             string artist);
void removeAlbum(int barcode);
void addCustomer(int id, string name);
void createNewOrder(int id, int ordNum);
void addToOrder(int ordNum, int barcode);
void removeFromOrder(int ordNum, int barcode);
void payOrder(int ordNum);
string getRecommendations(int numOfRecommendations) const;
string getInventoryReport() const;
string getCustomersReport() const;
string getCustomerReport(int id) const;
string getRevenueReport() const;
~Store();

bool albumsCompare(Album album1, Album album2);
bool customerCompare(Customer customer1, Customer customer2);
std::set<Album> albums;
std::set<Customer> customers;

};

#endif /* STORE_H_ */

我正在尝试访问“相册”集

std::set<Album> albums;

从这里(.cpp 文件)

void addAlbum(int barcode, int price, int year, int numPurchased, string title, string artist) {


    if(barcode <= 0){
        throw INVALID_BARCODE();
    }

    if(price <= 0){
        throw INVALID_PRICE{};
    }

    if(year > Store::currentYear){
        throw INVALID_YEAR();
    }

    if(numPurchased < 0){
        throw INVALID_NUM_PURCHASED();
    }

    if(Album::findBarcode(Store::albums, barcode) != Store::albums.end()){
        throw BARCODE_ALREADY_EXISTS();
    }
}

但我收到错误:无法调用成员函数'std::set::iterator Album::findBarcode(const std::set&, const int&)'

任何帮助解决这个问题将不胜感激!

这里是 findBarcode 函数

#include "Album.h"




std::set<Album>::iterator Album::findBarcode (std::set<Album>& set,int& barcode){
 Album data = Album();
for (std::set<Album>::iterator i = set.begin(); i != set.end(); i++){
     Album data = *i;
     if(data.barcode == barcode){
            return i;
     }
}
return set.end();

}

【问题讨论】:

  • 如果您将barcodepriceyearnumPurchased 设为unsigned int,则您不需要所有的否定检查。

标签: c++ class field public


【解决方案1】:

您正在定义一个非成员函数addAlbum,与您的同名成员函数无关。您需要将您的成员函数定义放在Store 范围内:

void Store::addAlbum(int barcode, int price, int year, int numPurchased, string title, string artist)
{//  ^^^^^
  ....
}

【讨论】:

  • 不是问的问题,但是,@user2266935 也应该将他的数据成员设为私有。
  • 谢谢,但现在我收到此错误:无法调用成员函数 'std::set::iterator Album::findBarcode(const std::set&, const int&)' 没有对象有什么想法吗?
  • @user2266935 你绝对应该在那里使用albums 而不是Store::albums。但可能还有其他问题。不能说不知道更多关于Album::findBarCode
【解决方案2】:

默认情况下,在 C++ 中,当我们创建一个类时,所有字段都是私有的。 您还可以使用 struct 关键字创建您的类,所有字段和方法都将是公共的

【讨论】:

  • 很好,但是这里的错误是静态访问非静态成员,而不是权限。
  • 首先:OP 已将 public 关键字放在他的类定义的顶部。第二:我们不要鼓励人们将结构用于复杂对象。
猜你喜欢
  • 2013-09-11
  • 2012-05-30
  • 2012-10-06
  • 2023-03-27
  • 2016-09-09
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多