【问题标题】:C++ Variable array in a Class Problem类问题中的 C++ 变量数组
【发布时间】:2011-06-05 03:39:15
【问题描述】:

我想知道是否有办法包含一个不固定大小的数组的数据成员。

函数 initModulation 将创建一个大小为 M 的 int 数组和一个大小为 M 的 Complex 数组。(Complex 是另一个类,由实部和虚部组成)。

函数 modulate 需要能够访问这两个数组。在调用 init Modulation 函数后,这两个数组超出范围。为避免这种情况,我将只创建 Modulator 类的这两个数据成员,但我不能这样做,因为数组大小取决于 M。

class Modulator
{
    int M;
    double phase;
    std::string mapping;

public:
    void initModulation(int M, double phase, std::string mapping);
    double* modulate(int *input,int inputlength,int complexFlag);
};

对此有什么想法吗?

谢谢, 明赫

【问题讨论】:

  • std::complex 浮现在脑海中。不要强迫自己重新发明轮子。

标签: c++ class scope


【解决方案1】:
  1. 没有非常特殊的情况不要写初始化函数;用构造函数构造。

  2. 数组是类数据的逻辑部分,因为它们用于调制,这就是类实例的作用。所以你应该让他们成为成员。

  3. 您计划创建编译时大小未知的数组,对吧?您是否将它们存储为类的成员有什么关系?无论哪种方式,您此时都掌握了有关 M 的信息,并相应地使用它。

  4. 但无论如何,您不应该分配自己的数组。使用std::vector。毕竟,你足够聪明,可以将std::string 用于文本数据,所以...

  5. 为什么要使用int 来表示应该是某种“标志”的参数? C++ 有一个真正的布尔类型,称为bool。使用它。

  6. 对于调制的输入和输出,再次使用向量。

  7. 有一个类的名称与类名一致的成员函数是可疑的。许多语言都支持“可调用”对象的概念,C++ 就是其中之一。在 C++ 中,我们将此功能拼写为“operator()”。

因此:

class Modulator
{
    std::vector<int> int_data;
    std::vector<Complex> complex_data;
    double phase;
    std::string mapping;

    public:
    Modulator(int M, double phase, std::string mapping): 
    int_data(M), complex_data(M), phase(phase), mapping(mapping) {}

    std::vector<double> operator()(const std::vector<int>& input, bool is_complex);
};

欢迎使用现代 C++。 :)

【讨论】:

    【解决方案2】:

    您可以使用std::vector 类,它类似于数组,但大小可变,不需要显式内存管理。如果您将其中一个声明为数据成员,那么您可以让initModulation 填充任意数量的元素,然后在modulate 中提供数据。

    一个建议 - 将initModulation 更改为类构造函数可能是个好主意。这样,它会被自动调用,并且没有先初始化对象就调用modulate 的风险。

    【讨论】:

      【解决方案3】:

      I was wondering if there was a way to include a data member which is an array of unfixed size.

      STL 可能是您正在寻找的。(std::vector ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-30
        • 2011-08-04
        • 2010-12-30
        • 2011-02-01
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多