如何声明对同一类中成员的引用?

Posted

技术标签:

【中文标题】如何声明对同一类中成员的引用?【英文标题】:How to declare a reference to a member in the same class? 【发布时间】:2016-07-06 18:33:29 【问题描述】:

我查看了很多其他问题和答案,但似乎没有人有与我相同的问题。

我试图在一个类中引用变量。我取出我正在编写的较大程序的一部分并将其隔离在一个小文件中:test.cpp。我想我的问题可能与我如何将变量与引用一起使用有关,但与较大的程序中出现的消息相同。

这是我的代码:

#include <iostream>

class Test 
public:
    int test;
    int& rtest = test;
;

int main() 
    std::cout << "Enter an integer: ";
    std::cin >> Test.rtest;
    std::cout << "\n" << Test.rtest << "\n";
    return 0;

我收到了这些消息:

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
     int& rtest = test;

In function ‘int main()’: error: expected primary-expression before ‘.’ token
     std::cin >> Test.rtest;

error: expected primary-expression before ‘.’ token std::cout << "\n" << Test.rtest << "\n";

为什么我会得到这些?我正在尝试做的事情可能吗?如果是这样,我该怎么做?

【问题讨论】:

【参考方案1】:

警告:非静态数据成员初始化器仅适用于 -std=c++11 或 -std=gnu++11 int& rtest = test;

您需要将标志 -std=c++11 传递给您的编译器,否则它默认为旧版本的 C++,它不允许您以这种方式初始化类成员。

在函数'int main()'中:错误:'.'标记之前的预期主表达式 std::cin >> Test.rtest; 错误:'.' 标记之前的预期主表达式 std::cout

这是因为. 操作员想要您的类的实例,而不是类本身(这就是:: 的用途)。声明例如Test test; 并改用 test.rtest

【讨论】:

将标志传递给 g++ 确实有效,但我花了几分钟的研究才弄清楚如何做到这一点。【参考方案2】:

您需要拥有Test 的实例才能访问类的非静态成员:

int main() 
    Test t; // <<<<<<<<
    std::cout << "Enter an integer: ";
    std::cin >> t.rtest;
    std::cout << "\n" << t.rtest << "\n";

您还需要使用适当的构造函数初始化引用,除非您启用了 -std=c++11 编译器标志,如错误消息所述:

class Test 
public:
    int test;
    int& rtest; // Nope!  = test;

    Test() : test(), rtest(test)  // <<<<<<<<<<<<<<<<<<
;

【讨论】:

不错的答案。感谢分享编译器标志

以上是关于如何声明对同一类中成员的引用?的主要内容,如果未能解决你的问题,请参考以下文章

C++类中成员函数声明后面接 const

如何使用模板声明成员函数? (不是模板类)

如何使用在同一类的基模板中的类中声明的枚举

如何在 TypeScript 类中正确声明计算属性名称?

类中声明的变量的内存分配

C++要点总结