C ++:如何访问另一个类中的类函数?

时间:2010-02-21 15:18:17

标签: c++ class vector

我正在学习如何使用std :: vector并想要访问它的值和函数。我在另一个名为spectrum的对象中有一个矢量对象。现在,当我尝试使用.capacity确定向量的容量时,如果我只声明向量,它就可以正常工作。但是当我在另一个对象中声明向量时,我会遇到语法错误。

错误:

test.c++:36: error: base operand of ‘->’ has non-pointer type ‘Spectrum’

如下所述, - >应该是一个点。

我想要的是确定容器的容量,即使它现在编译它也会得到结果0而不是我期望的8。

代码:

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

/*  spectrum    */
class Spectrum{
    public:
        float oct;
        vector<float> band;

        float total(){
            int k;
            float lpow;
            // logarithmic summation
            for(k = 0; k < oct; k++){
                lpow = lpow + pow(10, band[k]);
            }
            return(10*log10(lpow));
        }

        Spectrum(int max_oct = 3){
            oct = max_oct;
            cout << "max oct = " << max_oct << endl;
            vector<float> band(max_oct); //create vector/array with max_oct bands
            cout << (int)band.capacity() << endl;
        }

};

int main()
{
    //does not work in a class
    Spectrum input(8);
    cout << (int)input->band.capacity() << endl;

    //does work outside of a class
    vector<float> band(8);
    cout << (int)band.capacity() << endl;
}

2 个答案:

答案 0 :(得分:7)

vector<float> band(max_oct);行没有按照您的想法行事。

它在Spectrum构造函数的范围内定义了一个名为band的自动变量。它不会触及名为band的成员变量:实际上它“隐藏”它,因此构造函数中对band的任何后续引用都引用自动变量,而不是成员变量(您可以使用this->band)进行访问。

你想要的是:

Spectrum(int max_oct = 3) : oct(max_oct), band(max_oct) {
}

或(不太好,因为它构造了一个空向量,然后调整它的大小,而不是在第一个位置构建正确的大小):

Spectrum(int max_oct = 3) {
    oct = max_oct;
    band.resize(max_oct);
}

顺便说一句,我认为你可能会混淆sizecapacity向量(不确定你说的是什么)。 vector的单arg构造函数创建具有指定大小的向量。所以如果你还没有,你应该期望容量为8 或更多,而不是8。

[编辑:在回答您的下一个问题时,您需要在lpow中初始化total()float lpow = 0;]

答案 1 :(得分:2)

它不起作用,因为您尝试在输入上使用->,即使输入不是指针(或具有->方法的对象)。只需使用input.band.capacity即可。