首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遮蔽变量

遮蔽变量
EN

Stack Overflow用户
提问于 2013-10-27 18:31:12
回答 2查看 11.2K关注 0票数 1

我的问题是关于定义到类中的变量。我给你看我的问题。

我已经定义了这个类:

代码语言:javascript
运行
复制
class Measure {

int N;
double measure_set[];
char nomefile[];
double T;

public:
    void get( );
    void printall( );
    double mean( );
    double thermal_comp( );
};

我想让方法做以下工作:

  1. 从.dat文件中读取数字并保存到measure_set数组中;
  2. 读取用户输入并将其保存到变量T中;

以下是我所做的:

代码语言:javascript
运行
复制
void Measure::get() 
{   
    cout << "Insert filename:" << endl;
    cin >> nomefile;
    cout << endl;
    cout << nomefile << endl;
    cout << endl;

    int M=0;
    int nmax=50;

    ifstream f;
    f.open(nomefile);
    while(M<nmax)
    {
        f >> measure_set[M];
        if(f.eof()) 
        break;
        M++;
    }
    f.close();
    N=M+1;

    cout << "Insert temperature:" << endl;
    cin >> T;
    cout << endl;
} 

我注意到T是用measure_set[0]记忆的。为什么会发生这种情况,以及如何编写工作代码?我不是C++方面的专家,只为计算目的使用它,虽然我可以以其他方式解决我的问题,我想学习如何在C++中完成这个工作。非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-10-27 19:01:32

在C和C++中,在多个作用域中使用同名是合法的--一些编译器(例如gcc -Wshadow)将提供一种机制来警告您这一点,因为它可能会造成混淆。

代码语言:javascript
运行
复制
#include <iostream>

int i = 0;
int main() {
    int i = 1;
    for (int i = 0; i < 10; ++i) {
        int i = 2 * i;
        std::cout << i << std::endl;
    }
    return 0;
}

一些编译器会编译它并输出'0,2,4,6,8,.‘。有些人不会

避免这种情况的一个常见方法是使用前缀。"m_“表示”成员“,"s_”表示“静态”,"g_“表示”全局“等。一些编码样式对成员变量使用"_”后缀。这也有助于防止成员变量与类似名称的getters/setters发生冲突,如果您的骆驼就是这样的话。

代码语言:javascript
运行
复制
class Measure {
    int         m_n;
    double      m_measureSet[MEASURE_SET_SIZE]; // [] is not legal in a class.
    std::string m_nomefile;
    double      m_t;

public:
    const std::string& nomefile() const { return m_nomefile; }
    ...
};

如果这在使用中得到了回报,我倾向于发现开发人员被鼓励使用访问器而不是成员(在末尾添加()似乎比在开始时输入"m_“要容易)。

代码语言:javascript
运行
复制
std::cout << "Measuring file " << nomefile << std::endl;

会变成

代码语言:javascript
运行
复制
std::cout << "Measuring file " << m_nomefile << std::endl;

或更好:

代码语言:javascript
运行
复制
std::cout << "Measuring file " << nomefile() << std::endl;
票数 6
EN

Stack Overflow用户

发布于 2018-05-03 01:44:58

您对度量值类成员的声明:

代码语言:javascript
运行
复制
double measure_set[];
char nomefile[];

正在声明数组,而不声明数组中的元素数。这不是合法的C++,尽管显然有些编译器会支持它。

如果您想要动态大小的数组,或者自己分配和释放数组内存,请使用std::free。

代码语言:javascript
运行
复制
//Declaration
double* measure_set;

//Allocation
unsigned int arrayLen = 10;
measure_set = new double[arrayLen];

//Assigning values to array elements
for(int i = 0; i < arrayLen; ++i) {
  measure_set[i] = 0;
}

//Freeing allocated memory
delete[] measure_set;

您目前的代码:

代码语言:javascript
运行
复制
measure_set[M];

引用未分配任何内存的数组中的数组元素。如果预先分配数组内存,这将是很好的,只要您没有写入超过数组的界限。

对于std::vector (动态大小数组),您可能希望使用push_back或emplace_back函数将值插入到向量中,而不是使用方括号操作符分配值。

此外,在使用向量时,您可能也希望使用备用函数(等等)预先分配基础数组。以避免代价高昂的调整矢量大小的操作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19621785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档