【问题标题】:C++ Use Class as VariableC++ 使用类作为变量
【发布时间】:2015-09-17 13:36:22
【问题描述】:

所以我有一个类似于这个的类:

class CVal {
public:
    void operator=(int n) {
        d = n;
    }
private:
    int d;
};

现在每当我做类似的事情时

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

我希望访问 CVal::d,那么我该怎么做呢?我想重载一些运算符,但我找不到任何东西。

【问题讨论】:

  • 要么将d公开,要么创建一个返回它的getter函数,然后在开关中执行c.dc.d()
  • 这是个坏主意。如果你有虫子,找到它会很痛苦。更好的方法是:switch(c.GetMyValue()) {...}

标签: c++ class variables operator-overloading operators


【解决方案1】:

你应该像这样定义转换运算符

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++ 标准(6.4.2 switch 语句)

2 条件应为整型、枚举型或类 类型。如果是类类型,则条件是上下文隐式的 转换(第 4 条)为整数或枚举类型。不可缺少的 促销活动进行中......

【讨论】:

  • 原因:switch语句中的表达式必须是整数类型。 CVal 不是整数类型,但如果隐式转换可用,编译器会使用它。
  • 转换运算符应该是explicit吗?
  • @Slava 使转换运算符 explicit 会破坏代码,因为它依赖于隐式转换。
  • @Slava 当它被定义为显式时,clang 和 gcc 都不会编译代码。:)
  • 很公平。不使用这种范式的另一个原因。
【解决方案2】:

不能访问类的私有成员。但是如果你无论如何都想使用私有成员的值,你需要编写 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()) {...}

此选项比隐式转换类以使其在 switch 中可访问要好。因为它可以使您免于将来可能出现的调试错误。除了许多编码约定更喜欢这个选项。

【讨论】:

  • 他没有问如何访问d,他问的是如何使用switch()中的类的实例。
  • @Slava 是的,但这可能是一个更好的选择。
  • 你为什么把d设为静态?
  • @TartanLlama 可能是这样,但答案并没有这么说,这只是另一个问题的答案 - “如何访问 d?”。显然作者没有问这个。
  • @SudiptoChandra 那么你应该解释为什么这是一个比隐式转换更好的选择。
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多