c++ - 动态数组成员变量

标签 c++

嘿,我是 c++ 的新手,还在研究它的特殊性。我正忙着弄清楚这段代码出了什么问题。我已经完成了它,一切都在正确计算。问题是,一旦派生类 Calculate 函数结束,基类中的 value_array 似乎不会保留值。我想我已经正确地声明并分配了数组。我很难过...

#include <iostream>

class Indicator 
{
protected:
    double * value_array;
    double * input_array;
    int input_size;
public:
    Indicator(double input[], int size) 
    { 
        input_array = input; 
        input_size = size; 
        value_array = new double[size]; // issue with value_array
    }
    double operator[] (int index) { return value_array[index]; }
    void virtual Calculate() {}
    ~Indicator() { delete[] value_array; }
};

class SMA : public Indicator 
{
private:
    int nperiod;
    double sum;
public:
    SMA(double input[], int size, int period) : Indicator(input, size) 
    { 
        nperiod = period; 
        sum = 0; 
        Calculate(); 
    }
    void Calculate();
};

void SMA::Calculate()
{ 
    for (int i=0; i<input_size; i++)
    {
        if (i > nperiod - 1) 
        {
            sum += input_array[i] - input_array[i-nperiod];
            value_array[i] = sum / nperiod;
        }
        else
        {
            sum += input_array[i];
            value_array[i] = sum / (i+1);
        }
    }
}

int main(int argc, const char *argv[]) {
    double input[] = {1,2,3,4,5,6,7,8,9,10};
    Indicator indicator = SMA(input,10,5);

    double value = indicator[0];
    std::cout << "value: " << value << std::endl;

    std::cin.get();
    exit(0);
}

更新:

这是用 vector 实现的代码。我想将输入保留为 double[] 以与其他库保持一致,还有我应该注意的任何其他潜在问题吗?

#include <iostream>
#include <vector>

class Indicator 
{
protected:
    std::vector<double> value_vector;
    double * input_array;
    int input_size;
public:
    Indicator(double input[], int size) 
    { 
        input_array = input; 
        input_size = size; 
        value_vector.reserve(size);
    }
    double operator[] (int index) { return value_vector[index]; }
    void virtual Calculate() {}
};

class SMA : public Indicator 
{
private:
    int nperiod;
    double sum;
public:
    SMA(double input[], int size, int period) : Indicator(input, size) 
    { 
        nperiod = period; 
        sum = 0; 
        Calculate(); 
    }
    void Calculate();
};

void SMA::Calculate()
{ 
    for (int i=0; i<input_size; i++)
    {
        if (i > nperiod - 1) 
        {
            sum += input_array[i] - input_array[i-nperiod];
            value_vector.push_back(sum / nperiod);
        }
        else
        {
            sum += input_array[i];
            value_vector.push_back(sum / (i+1));
        }
        std::cout << "sma:  " << value_vector[i] << std::endl;
    }
}

int main(int argc, const char *argv[]) {
    double input[] = {1,2,3,4,5,6,7,8,9,10};
    Indicator indicator = SMA(input,10,5);

    for (int i=0; i<10; i++)
    {
        std::cout << "main: " << indicator[i] << std::endl;
    }

    std::cin.get();
    exit(0);
}

最佳答案

那是因为你违反了 Rule of Three .由于您的类管理资源,因此它需要一个复制构造函数和一个赋值运算符。我强烈建议更换任何 T*数据成员 std::vector<T>数据成员。那么你就不需要手动编写那些特殊的成员函数了。

关于c++ - 动态数组成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985122/

相关文章:

c++ - 如果 QMainWindow 被隐藏,关闭对话框退出应用程序

c++ - 带有 std::ref 参数的 std::tie 和 std::make_tuple 有什么区别?

c++ - 二叉搜索树中的双重删除(?)

android - Android jni cpp 文件中的垫到位图

c++ - sf::Shader 和 sf::RectangleShape

c++ - 模板类中方法的完全特化

c# - 支持来自不同供应商的多个工业相机?

c++ - 在体系结构中找不到符号 + 链接器命令失败,退出代码为 1

java - Android JNI NDK - 未找到实现

c++ - 使用 pegtl 语法正确处理状态