在cpp和hpp文件中,整个程序使用的c ++中的枚举声明在哪里?

时间:2017-04-29 13:48:39

标签: c++ enums

我有一个程序可以在网络上执行模拟。 我的所有课程和实现都在h文件中,我试图打电话给我的班级' main.cpp中的函数(在h文件中)。 我在我的课堂上使用枚举,而从main.cpp调用的c&#t; tor则采用枚举值。我不断收到错误,因为每次更改声明地点时,cpp或h文件都不知道这些启示。
1.应该在我的班级内宣布吗?外?在cpp和h文件中? 2.如果我也希望类的方法能够使用枚举类型,我应该在哪里放置声明? 3.从cpp文件和类的方法获取枚举类型的正确方法是什么?我看到了一些选项,如ClassName :: enumType,CLassName.enumType等。 这是我的代码结构:

    main.cpp
    #include...

    enum networkType {X,Y};

    int main(){
    //create instances of my class 
    network n = new network(X, ...);


    }


    networks.h
    //enum networkType {X, Y};      here?
    class network{

        enum networkType {X, Y};         //here?
    network::network(networkType x, ...) //c'tor
    ..
//members:
    networkType type_;

//functions that use the enumerated value
    void setNetworkType(networkType t);
    networkType getNetworkType();
...more methods

我得到的一些错误是 - 对于getter方法 - ' NETWORKTYPE'没有命名类型  networkType network :: getNetworkType()

感谢。

2 个答案:

答案 0 :(得分:1)

如果将var formData = new FormData(); formData.append('image', image); formData.append('name', name); formData.append('email', email); formData.append('address', address); formData.append('co_address', co_address); formData.append('city', city); formData.append('action' 'det_lilla_extra'); // Note this line // Note that I removed your wrapper object $.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', dataType: 'json', data: formData, // Note this change processData: false, // Don’t forget this one 定义放在类中,则枚举的实际名称为enum。您必须在类范围之外使用全名(包括类外部成员函数定义的返回类型,除非您使用尾随返回类型)。

network::networkType

(请注意,如果您已经在main.cpp中显示network::networkType network::getNetworkType() { return _type; } ,则该不同的和不兼容的类型。)

答案 1 :(得分:0)

  

1.应该在我的班级内宣布吗?外?在cpp和h文件中?

enum networkType {X,Y};绝对不应该在全球范围内,因为这会使XY污染全球范围。无论如何,枚举的声明应始终(且仅)在类的头文件中。

首选C ++ 11声明为enum class networkType {X, Y} 因此XY的范围将为networkType

如果networkType主要用于network,我会将其声明置于network内,如下所示:

class network{
    enum class type {X, Y};
};

无需在枚举名称中添加前缀“network”,因为type现在的作用域为network

如果您不能使用C ++ 11,我更喜欢这种风格:

class network{
    enum type {TYPE_X, TYPE_Y};
};
  

2.如果我还希望类的方法能够使用枚举类型,我应该在哪里放置声明?

方法声明和成员变量可以使用不带前缀的嵌套类型:

class network{
    enum class type {X, Y};
    network( type x, ... );
    type getNetworkType() const;  //< added const here, because method is only observer
    type _type;
}

当方法的实现不是内联时,您必须添加范围前缀:

network::network( network::type x, ... ){ 
    // within function body no scope prefix is needed:
    type y = x;
} 

network::type network::getNetworkType() const{ 
    return _type; 
}

全局函数必须在函数头中使用前缀以及body:

network::type do_something( network::type x ){
    network::type y = x;
    return y;
}
  
      
  1. 从cpp文件和类的方法中获取枚举类型的正确方法是什么?
  2.   

“来自班级的方法” - 见上文。

在.cpp文件中,你必须使用范围前缀。虽然我们在此,但默认情况下不要使用运算符new。在大多数情况下,您可以(并且应该)在堆栈上创建对象。如果您确实需要动态分配,请选择std::unique_ptr等智能指针。现代C ++代码几乎不应包含delete,也很少包含new

int main(){
    // Prefer to use stack variables:
    network net( network::type::X );
    network::type theType = net.getNetworkType();

    // If you really need dynamic allocation:
    auto pnet = std::make_unique<network>( network::type::X );
    theType = pnet->getNetworkType();
}