C ++: Как получить доступ к функции класса внутри другого класса? - PullRequest
0 голосов
/ 21 февраля 2010

Я учусь работать с std :: vector и хочу получить доступ к его значениям и функциям. У меня есть векторный объект внутри другого объекта под названием спектр. Теперь, когда я пытаюсь определить емкость вектора с помощью .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 ]

7 голосов
/ 21 февраля 2010

Строка vector<float> band(max_oct); не делает то, что вы думаете.

Определяет автоматическую переменную с именем band в области видимости конструктора Spectrum. Она не касается переменной-члена, также называемой 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);
}

Между прочим, я думаю, что вы могли бы путать size и capacity векторов (хотя не уверен из того, что вы говорите). Конструктор с одним аргументом vector создает вектор с указанным размером. Поэтому, если вы этого еще не сделали, вы должны ожидать, что емкость будет 8 или больше , а не 8.

[Редактировать: в ответ на ваш следующий вопрос, вам нужно инициализировать lpow в total(): float lpow = 0;]

2 голосов
/ 21 февраля 2010

Это не работает, потому что вы пытаетесь использовать -> для ввода, даже если ввод не является указателем (или объектом с методом ->). Просто используйте input.band.capacity и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...