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那个么你们应该解释为什么这是一个比隐式转换更好的选择。