C++中构造函数中的枚举

Enums in Constructors in C++

本文关键字:枚举 构造函数 C++      更新时间:2023-10-16

我对C++中的构造函数和OOP非常陌生,遇到了以下问题。我试图创建以下类,但显然枚举器出了问题。我还想知道我是否可以以某种方式将欧元设置为默认选项。


class Amount
{
// Todo 6.2
// Implement class Amount
protected: 
float Netto_;
float Brutto_;
enum tax_ { tax1 , tax2};
enum Currency_ { EUR, USD }; 
const float eur_to_usd = 1.13;
const float usd_to_eur = 0.89;
std::string Description_;
public:
Amount(std::string Description , float Brutto, Currency_ Currency, tax_ taxtype) : Brutto_{Brutto} , Description_{Description}, Currency_{Currency}, tax_{taxtype} {} 
};

我得到以下错误:

"Currency_" is not a nonstatic data member or base class of class "Amount"

谢谢!

此行:

enum Currency_ { EUR, USD };

不是在声明成员变量,而是在声明类型。由于没有变量,因此无法初始化该变量。你需要把它分成两行:

enum Currency_ { EUR, USD };
Currency_ Currency_val;

您需要声明一个Currency_类型的变量,并将枚举定义公开,以便在构造函数中使用它。(对于tex_也是如此(

class Amount
{
public: 
enum Currency_ { EUR, USD }; 
protected:
Currency_ Currency;
...
};
void test() {
Amount amount("description", 2.0, Amount::USD, Amount::tax1);
}

要声明一个新的枚举类型,您应该这样做:

enum MyEnumType {A, B, C};

现在您可以声明MyEnumType:的实例

MyEnumType variable;

你可以在一个类中创建枚举类型,但你从来没有真正创建过该类型的实例。

您将类型与变量混淆了。你的名字也有混合的大写字母,这可能会导致你的误解。大写不应该是随机的,而应该隐含意义。类型通常以大写字母开头,成员变量则以小写字母开头(通常以_结尾(。无论您选择什么实际的代码样式,都要保持一致。不要用大写枚举器名称声明某些枚举,而用小写枚举器等声明其他枚举。此外,您不应该混合常量、类型和变量声明,而是在类中将它们物理地分隔成段。这也有助于更清楚哪些需要初始化,哪些不需要初始化。

以下是对代码的一个小的重新排列,并固定大小写,以及类型声明和变量声明的分离:

#include <string>
class Amount
{
// types (uppercase letter)
enum Tax { TAX1, TAX2};
enum Currency { EUR, USD }; 
// variables (needing initialization.  All have trailing '_', not the types)
std::string description_;
float brutto_;
float netto_;
Currency currency_;
Tax tax_;

public:
Amount(std::string const & description, float brutto, Currency currency, Tax taxtype) :
description_{description},
brutto_{brutto}, 
netto_{0},             
currency_{currency}, 
tax_{taxtype} 
{} 
};

希望这能让事情变得更清楚。此外,您应该按照变量声明的顺序初始化它们(因为这是它们实际初始化的顺序(,而且您没有初始化netto_,所以我给它一个0。最后,我通过引用传递了您的字符串,以避免不必要的复制。我删除了您的常量,因为它们不是这个问题的一部分,而且您可能希望转换率无论如何都是可配置的。