当请求变量时,C++调用函数

C++ Call Function When Variable is Requested

本文关键字:C++ 调用 函数 请求 变量      更新时间:2023-10-16

我以前在基于mono的语言中看到过这样做,但我只是好奇这在c++中是否可能。如果我有以下类别的

  class test {
    public:
    int foo;
    int myfunction();
  };

当我尝试访问foo变量时,我有没有办法让它调用myfunction并返回其值?

test t;
cout << t.foo;//instead of printing the value of foo, print the return value of myfunction

提前感谢!我在谷歌上搜索了一下,但什么也找不到。

或者,是否可以在没有括号的情况下调用没有参数的函数?

哇!感谢大家的投入。我不想插入括号的主要原因是我试图使这个API类似于旧的非c++API。在这个类中,函数后面没有两个括号可能会使维护更加困难,但这将节省我几个小时的时间来回答为什么Vector2.normalized必须在它后面有()。

是的,将foo设为私有的,并且只能使用可以执行任何操作的公共访问器方法进行访问。你不能直接按照你在C++中要求的方式去做。

编辑:如果你想要你描述的行为选项,C++可能不是这个项目的语言。

此外,我应该注意到,标准库已经有了一个经过良好优化和调试的vector,应该使用它来支持您自己的滚动(除非它只是一个练习)。

编辑2:此外,如果你想这样做是为了节省打字时间,请记住,现在要节省两秒钟的打字时间,你需要花费自己或未来的维护人员四个小时的时间进行令人挠头的调试,试图弄清楚为什么它不能以应有的方式工作。你写一次代码,读很多次。

一般来说,按照您的要求执行不是一个好主意,在其他语言中称为属性

然而,我已经用它来调试意大利面条代码了。

所以,这是一个属于工具箱的工具,但它不是一个你应该经常使用的工具。

即兴(代码没有被脏编译器的手指污染):

class Test
{
private:
    class IntProperty
    {
    private:
        int value_;
    public:
        IntProperty( int v = 0 ): value_( v ) {}
        void setValue( int v ) { value_ = v; }
        int value() const { return value_; }
        IntProperty& operator=( int x )
        {
            setValue( x );  return *this;
        }
        operator int () const { return value(); }
    };
public:
    IntProperty foo;
};

这通常是不好的一个原因是,如果将foo传递给某些模板化代码,例如标准流输出,则不会调用到int的转换。这样的地方需要明确的转换调用。

它通常不好的另一个原因是,如果setter或getter需要访问对象的其余部分,那么这涉及到一个存储的"外部对象"指针,这相当于内存和时间方面的效率低下。

因此,与其考虑这个怪物,不如考虑简单地制作数据private,并提供一个getter函数。

干杯&hth。,

您可以使foo成为宏:

#define foo myfunction()
class test{
public: 
  int myfunction();
};

但这是一个可悲的方法。

在C++中没有办法做到这一点。如果您计划访问Vector类上的x、y、z成员,您可以编写一个operator[],它通过参数接收索引,调用所需的方法/函数,并返回所请求成员的计算值(根据传递的索引)。示例:

int& operator[](unsigned i) {
    // Be sure to write proper bounds checking here.
    doSomething(data[i]);
    return data[i];
}

一个可能的解决方法是使用宏,这有点邪恶。

#include <stdio.h>
#define FOO myfunction()
class test {
  private:
    int foo;
  public:    
    int myfunction() {
      return 42;
    }
};
int main() {
  test t;
  printf("%dn",t.FOO);
  return 0;
}

不过,正如我在对您的OP的评论中所暗示的,我认为从维护的角度来看,这种技巧很可怕,应该避免。