Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用类作为变量_C++_Class_Variables_Operator Overloading_Operators - Fatal编程技术网

C++ C++;使用类作为变量

C++ C++;使用类作为变量,c++,class,variables,operator-overloading,operators,C++,Class,Variables,Operator Overloading,Operators,所以我有一个类似的类: class CVal { public: void operator=(int n) { d = n; } private: int d; }; 现在每当我做这样的事情 CVal c; switch(c) {...} 我想访问CVal::d,那么我该如何做呢?我想重载一些运算符,但我什么也找不到。您应该这样定义转换运算符 class CVal { public: //... operator int() cons

所以我有一个类似的类:

class CVal {
public:
    void operator=(int n) {
        d = n;
    }
private:
    int d;
};
现在每当我做这样的事情

CVal c;
switch(c) {...}

我想访问CVal::d,那么我该如何做呢?我想重载一些运算符,但我什么也找不到。

您应该这样定义转换运算符

class CVal {
public:
    //...
    operator int() const { return d; }
private:
    int d;
};
<>或者如果你有一个支持C++ 2014的编译器,那么你可以用下面的方式定义

class CVal {
public:
    //...
    operator auto() const { return d; }
private:
    int d;
};

根据C++标准(64.2转换语句)

2条件应为积分型、枚举型或类别 类型。如果是类类型,则条件是上下文隐式的 已将(第4条)转换为整型或枚举型。完整的 促销活动正在进行


无法访问类的私有成员。但是,如果您想无论如何都使用私有成员的值,则需要编写get函数。例如:

class CVal {
public:
    void operator=(int n) {
        d = n;
    }
    int getD() {  // this function returns the value of private member d
        return d;
    }        
private:
    int d;
};
现在,您可以通过以下方式访问d:

CVal c;
switch(c.getD()) {...}

此选项优于隐式转换类,使其在开关中可访问。因为它可以避免将来可能出现的调试错误。除此之外,许多编码约定更喜欢此选项

要么将
d
设置为公共,要么创建一个返回它的getter函数,然后在开关中执行
c.d
c.d()
。这是一个坏主意。如果你有一只虫子,找到它会让你非常痛苦。更好的方法是:
switch(c.GetMyValue()){…}
Reason:switch语句中的表达式必须是整数类型
CVal
不是整数类型,但如果可以使用隐式转换,编译器将使用它。转换运算符是否应该是显式的?@Slava使转换运算符显式将破坏代码,因为它依赖于隐式转换。@Slava如果定义为显式的,则clang和gcc都不会编译代码。:)足够公平。不使用这种范例的另一个原因。他没有问如何访问
d
,他问如何使用
switch()
中的类实例。@Slava是的,但这可能是一个更好的选择。为什么要将
d
设为静态?@TartanLlama可能是这样,但答案没有这么说,这只是对另一个问题的回答——“如何访问d?”。显然作者并没有问这个问题。@SudiptoChandra那个么你们应该解释为什么这是一个比隐式转换更好的选择。