c++ - 如何初始化另一个类的数组的静态常量成员,并使用它?
问题描述
我正在尝试用库存实例化自动售货机。我计划的库存是一系列类饮料。这是我到目前为止所写的。
VendingMachine.h - 应该包含 Drinks 类的数组
#include "Drinks.h"
class VendingMachine {
private:
static const int NUM_DRINKS = 5;
static const Drinks drinks[NUM_DRINKS];
public:
VendingMachine();
};
现在饮料.h
#include <string>
class Drinks {
private:
std::string name;
double price;
int qtyInMachine;
public:
Drinks(std::string name, double price, int qtyInMachine);
void decrementQuantity();
};
自动售货机.cpp
#include "VendingMachine.h"
VendingMachine::VendingMachine() {
}
饮料.cpp
#include <string>
#include "Drinks.h"
Drinks::Drinks(std::string n, double p, int qty) : name(n), price(p), qtyInMachine(qty) {
}
void Drinks::decrementQuantity() {
qtyInMachine--;
}
现在进行测试程序
#include <iostream>
#include "VendingMachine.h"
const Drinks VendingMachine::drinks[VendingMachine::NUM_DRINKS] {Drinks("Cola",1.25,20),
Drinks("Root Beer",1.35,20),Drinks("Orange Soda",1.20,20),Drinks("Grape Soda",1.20,20),
Drinks("Bottled Water",1.55,20)};
int main() {
VendingMachine vm1;
for (int i = 0; i < VendingMachine::NUM_DRINKS; i++) {
std::cout << vm1.drinks[i].name << " ";
}
}
我定义饮料编译器的行抱怨它不是一个完整的 const 表达式,并且 VendingMachine::NUM_DRINKS 在上下文中是私有的。它为我的带有 NUM_DRINKS 的 for 语句声明了相同的私有上下文错误,在我的 cout 声明中它声称对于饮料和名称都相同。我需要知道如何以及在何处初始化饮料以及如何在 main 中使用而不会出现“在此上下文中私有”错误。
由于我是一般的课程和 OO 的极端初学者,我找不到我的错误。非常感谢任何帮助。
解决方案
实际上,您需要研究/修改封装和数据隐藏的 OOP 概念,以及访问说明符 (private
和public
) 的 C++ 特定特性以及它们的使用方式和上下文。
注意:还有一个protected
访问说明符,您可以在继承主题中研究它。
public
类的一部分对外界可见,例如其他类、函数等。private
只能在类本身内访问。
您有在public
上下文中访问的私有成员,这就是您收到这些错误的原因,即:
class VendingMachine {
private:
static const int NUM_DRINKS = 5; // private to class
static const Drinks drinks[NUM_DRINKS]; // private to class
public:
VendingMachine(){}
};
并且,在main
功能上:
int main() {
VendingMachine vm1;
for (int i = 0; i < VendingMachine::NUM_DRINKS; i++) { // accessing private member VendingMachine::NUM_DRINKS
std::cout << vm1.drinks[i].name << " "; // accessing private members vm1.drinks[i].name
}
}
name
数据成员属于private
Drinks 类,您在main
.
这些是您需要解决的问题。
为了访问私有数据成员,通常使用访问器函数,例如访问name
您将有一个公共getName()
方法等。
- 要访问私有实例数据成员,您需要公共方法。
- 要访问
private
static
数据成员或类成员,您需要public
static
成员函数。
我想指出的另一件事是:
// Declaration: Observe names of the method arguments
Drinks(std::string name, double price, int qtyInMachine);
// Definition: Observe the names of the arguments here
Drinks::Drinks(std::string n, double p, int qty) : name(n), price(p), qtyInMachine(qty) {
}
在像现在这样的单独的接口/实现场景中,这并不重要。但是,如果您以后需要在类中移动定义,则必须使它们保持一致。因此,从长远来看,这是一种维护开销。
这是一个最小修改的工作示例:http: //ideone.com/tr5oZu
推荐阅读
- ios - 在 iOS 15 上访问原始蜂窝信号强度测量 (dBm)
- html - 我的按钮没有转到导航的右侧
- angular - Angular Mobx 多个版本
- jquery - 如何在滚动魔术动画上使用 SVG 图像蒙版
- css - CSS - 检测用户是否更改了浏览器的默认字体
- google-play - 适用于 AR 的 Google Play 服务与您的设备不兼容
- python - 检查数据框中是否存在值不起作用
- ssh - 如何计算 ssh 反向隧道的最大并发
- haskell - 守卫表达式的模式匹配
- python - 将函数应用于 Pandas DataFrame 中每一行的应用函数的替代方法