C++;请求变量时调用函数 我以前在基于单声道的语言中看到过这种情况,但我只是好奇C++中是否有可能。如果我有下面的课程 class test { public: int foo; int myfunction(); };

C++;请求变量时调用函数 我以前在基于单声道的语言中看到过这种情况,但我只是好奇C++中是否有可能。如果我有下面的课程 class test { public: int foo; int myfunction(); };,c++,c,class,C++,C,Class,当我尝试访问foo变量时,我是否有办法使它调用myfunction并返回其值 test t; cout << t.foo;//instead of printing the value of foo, print the return value of myfunction 测试t; cout是的,将foo设为私有,并且只能使用可以执行任何操作的公共访问器方法进行访问。你不能直接按照C++中的方式来做。 编辑:如果你想要描述的行为选项,C++可能不是这个项目的语言。 我还应该注意到

当我尝试访问foo变量时,我是否有办法使它调用myfunction并返回其值

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

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

<>编辑:如果你想要描述的行为选项,C++可能不是这个项目的语言。 我还应该注意到,标准库已经有了一个经过良好优化和调试的
向量
,应该使用它来支持您自己的滚动(除非它只是一个练习)


EDIT2:如果你想节省打字时间,请记住,为了节省两秒钟的打字时间,你需要花费自己或未来的维护人员四个小时的艰苦调试,试图找出它为什么不能按看起来应该的方式工作。您编写代码一次,多次读取。

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

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

您可以将foo设置为宏:

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

但这是一种令人悲哀的方法。

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

#include <stdio.h>

#define FOO myfunction()

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

int main() {
  test t;
  printf("%d\n",t.FOO);
  return 0;
}
#包括
#定义FOO myfunction()
课堂测试{
私人:
int foo;
公众:
int myfunction(){
返回42;
}
};
int main(){
试验t;
printf(“%d\n”,t.FOO);
返回0;
}

不过,正如我在您的OP评论中提到的,我认为从维护的角度来看,此类技巧非常糟糕,应该避免。

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

然而,我用它来调试意大利面代码

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

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

这通常是不正确的一个原因是,如果将
foo
传递给一些模板化代码,例如标准流输出,则不会调用到
int
的转换。此类位置需要显式转换调用

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

< P> >,而不是这个怪物,简单地考虑一下这个数据<代码>私有< /代码>,并提供一个吸收器函数。
干杯&hth.,

你为什么要这样做?这会使我正在制作的向量类的工作变得更容易。它如何使它“更容易”?除了不必键入
()
?@preducer之外,即使您可以这样做,我认为从维护的角度来看,这也不好。想想下一个需要维护代码的人。你觉得你提出的问题有多直观?“永远不要这样做”:<代码>定义VARNEXT FUNAMEY()/CUT>。我描述了C++方式,主要是做被问的问题。我并不质疑这一点,但是OP更关心的不是键入括号。但我只是用它来调试现有的意大利面代码。除了这些特殊的应用程序之外,这通常不是一个好主意。如果他在类中已经有名为foo的私有变量,这将不起作用。是的,这就是我删除它的原因。我认为他使用stdioprintf@Precursor这就是他的观点。用C++,一个人应该坚持<代码> <代码>,或者更好,<代码> <代码> .jjy富有——我不认为总是最好使用流流几乎总是比使用PrtTf和其他本机C函数慢。因此,当性能很重要时,可以肯定地说最好使用本机C函数。然而,在这个例子中,我同意使用cout是可以的,我只是更喜欢printf.@DownVoter-需要解释吗?-1即使是在开玩笑的时候,也不应该建议这样的邪恶。有人会认真对待的,就像这里发生的那样。顺便说一句,有人在我之前否决了这个。我猜也是出于同样的原因。这些宏名称将严重破坏其他代码。
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;
};