【问题标题】:Enums in Constructors in C++C++ 构造函数中的枚举
【发布时间】:2020-10-28 05:10:39
【问题描述】:

我对 C++ 中的构造函数和 OOP 非常陌生,遇到了以下问题。 我尝试制作以下课程,但显然枚举器有问题。 另外我想知道是否可以以某种方式将 EUR 设置为默认选项。


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"

谢谢!

【问题讨论】:

  • 错误信息有什么不清楚的地方? Currency_ 是一种类型。不是成员,例如Netto_。此类错误也不限于enums,但如果是class,您也会得到它。
  • 您声明了 enum 类型,但没有这些类型的成员
  • @Necklondon 在类中定义枚举没有错。
  • 如果看不到Currency_类型,传入Currency参数很烦人。只有这个类或派生类才能在不玩傻游戏的情况下进行构造。
  • 不相关,eur_to_usdusd_to_eur 应该是 static 成员

标签: c++ oop constructor enumerator


【解决方案1】:

这一行:

enum Currency_ { EUR, USD };

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

enum Currency_ { EUR, USD };
Currency_ Currency_val;

【讨论】:

  • 你可以留一行(enum Currency_t { EUR, USD } Currency_;)。
  • @1201ProgramAlarm 绝对正确。为了清楚起见,我仍然会将枚举声明和变量声明分开。
  • 它可以编译,但是由于缺乏可读性,我们强烈反对将这种类型和变量声明合二为一。
【解决方案2】:

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

class Amount
{
public: 
    enum Currency_ { EUR, USD }; 
protected:
    Currency_ Currency;
    ...
};

void test() {
    Amount amount("description", 2.0, Amount::USD, Amount::tax1);
}

【讨论】:

    【解决方案3】:

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

    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。最后,我通过你的字符串参考以避免不必要的副本。我删除了你的常量,因为它们不是这个问题的一部分,而且你可能希望转换率无论如何都是可配置的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多