如何初始化作为另一个 class 数组的静态常量成员并使用它?
How to initialize static const member that is array of another class, and use it?
我正在尝试实例化一个有库存的自动售货机。我计划的清单是一系列 class 饮料。这是我到目前为止写的。
VendingMachine.h - 应包含饮料数组 class
#include "Drinks.h"
class VendingMachine {
private:
static const int NUM_DRINKS = 5;
static const Drinks drinks[NUM_DRINKS];
public:
VendingMachine();
};
现在Drinks.h
#include <string>
class Drinks {
private:
std::string name;
double price;
int qtyInMachine;
public:
Drinks(std::string name, double price, int qtyInMachine);
void decrementQuantity();
};
VendingMachine.cpp
#include "VendingMachine.h"
VendingMachine::VendingMachine() {
}
Drinks.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 << " ";
}
}
我定义 drinks 的行编译器抱怨说它不是一个完整的常量表达式并且 VendingMachine::NUM_DRINKS 在上下文中是私有的。它声称我的带有 NUM_DRINKS 的 for 语句有相同的私有上下文错误,同样在我的 cout 语句中,它对 drinks 和 name 声称相同。我需要知道如何以及在何处初始化饮料以及如何在 main 中使用而不会出现 'private in this context' 错误。
由于我是 classes 和一般 OO 的极端初学者,所以我找不到我的错误。非常感谢任何帮助。
实际上,您需要研究/修改封装和数据隐藏的 OOP 概念以及访问说明符(private
和 public
)的 C++ 特定功能及其使用方式以及在什么情况下。
注意:还有一个 protected
访问说明符,您可以在继承主题中学习它。
public
class 的一部分对外可见,例如其他 classes、函数等
private
只能在 class 本身内访问。
您在 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 class,您正在 public 访问它 main
。
这些是您需要解决的问题。
为了访问私有数据成员,通常使用访问器函数来访问 name
你会有一个 public getName()
方法等等。
- 要访问私有实例数据成员,您需要 public 方法。
- 要访问
private
static
数据成员或 class 成员,您需要 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) {
}
在单独的 interface/implementation 场景中,就像现在一样,这并不重要。但是,如果您稍后需要移动 class 中的定义,则必须使它们保持一致。所以,这是一个长期的维护开销 运行.
这是一个经过最小修改的工作示例:http://ideone.com/tr5oZu
我正在尝试实例化一个有库存的自动售货机。我计划的清单是一系列 class 饮料。这是我到目前为止写的。
VendingMachine.h - 应包含饮料数组 class
#include "Drinks.h"
class VendingMachine {
private:
static const int NUM_DRINKS = 5;
static const Drinks drinks[NUM_DRINKS];
public:
VendingMachine();
};
现在Drinks.h
#include <string>
class Drinks {
private:
std::string name;
double price;
int qtyInMachine;
public:
Drinks(std::string name, double price, int qtyInMachine);
void decrementQuantity();
};
VendingMachine.cpp
#include "VendingMachine.h"
VendingMachine::VendingMachine() {
}
Drinks.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 << " ";
}
}
我定义 drinks 的行编译器抱怨说它不是一个完整的常量表达式并且 VendingMachine::NUM_DRINKS 在上下文中是私有的。它声称我的带有 NUM_DRINKS 的 for 语句有相同的私有上下文错误,同样在我的 cout 语句中,它对 drinks 和 name 声称相同。我需要知道如何以及在何处初始化饮料以及如何在 main 中使用而不会出现 'private in this context' 错误。
由于我是 classes 和一般 OO 的极端初学者,所以我找不到我的错误。非常感谢任何帮助。
实际上,您需要研究/修改封装和数据隐藏的 OOP 概念以及访问说明符(private
和 public
)的 C++ 特定功能及其使用方式以及在什么情况下。
注意:还有一个 protected
访问说明符,您可以在继承主题中学习它。
public
class 的一部分对外可见,例如其他 classes、函数等private
只能在 class 本身内访问。
您在 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 class,您正在 public 访问它 main
。
这些是您需要解决的问题。
为了访问私有数据成员,通常使用访问器函数来访问 name
你会有一个 public getName()
方法等等。
- 要访问私有实例数据成员,您需要 public 方法。
- 要访问
private
static
数据成员或 class 成员,您需要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) {
}
在单独的 interface/implementation 场景中,就像现在一样,这并不重要。但是,如果您稍后需要移动 class 中的定义,则必须使它们保持一致。所以,这是一个长期的维护开销 运行.
这是一个经过最小修改的工作示例:http://ideone.com/tr5oZu