【问题标题】:c++ array declaration in a header标题中的c ++数组声明
【发布时间】:2010-09-24 05:44:06
【问题描述】:

我想知道是否可以将数组(此时大小未知)声明为类的私有成员,然后在类的构造函数中设置大小。例如:

class Test {
int a[];
public:
Test(int size);
};

Test::Test(int size) {
a[size];   // this is wrong, but what can i do here?
}

这可能还是我应该使用动态数组?谢谢!

【问题讨论】:

    标签: c++ arrays dynamic header


    【解决方案1】:

    简短回答:否(数组的大小仅在编译时定义)
    长答案:

    你可以使用一个向量来达到同样的效果:

    class Test
    {
        std::vector<int> a;
        public:
            Test(std::size_t size):
                a(size)
            {}
    };
    

    【讨论】:

    • 我希望人们在标记答案时添加 cmets。至少你回到了0
    • 仇恨者喜欢匿名仇恨。讨厌仇人!我给你一点。
    • +1 对于一个好的实用答案,如果有人对此有疑问,请解释原因(这样我们就可以向您证明 Martin 是对的)
    • +1 从我到 std::vector 很棒。一个小的挑剔是使用 size_t 而不是 int 作为ctor。
    • @Andreas Magnusson:发现了 Wee。更新。但是,如果您的向量大小超出了有符号整数,我认为您还有其他问题。
    【解决方案2】:

    不,这是不可能的。标头中的数组声明必须具有恒定大小的值。否则,像“sizeof”这样的结构就不可能正常工作。您需要将数组声明为指针类型并在构造函数中使用 new[]。示例。

    class Test { 
        int *a;
    public:
        Test(int size) {
           a = new int[size];
        }
        ~Test() { delete [] a; }
    private:
        Test(const Test& other);
        Test& operator=(const Test& other);
    };
    

    【讨论】:

    • 需要添加CopyConstructor和赋值运算符并调用正确的版本od delete。或者使用向量。
    • 德拉特。我通常会因为同样的问题打电话给其他人......很快就会解决
    • 双重错误;(这是合乎逻辑的星期五
    • 绝对同意向量更好。原始样本没有使用 STL,所以我决定不使用 STL 来回答。 STL 使 C++ 变得更好。我发现将两者分开越来越难
    • 你很可能还需要一个变量来存储 a 的大小。
    【解决方案3】:

    正如其他答案所指出的,数组的大小在编译时是固定的。但是,通过使用模板,您可以在编译时参数化大小:

    template <int N> class Test {
        int a[N];
    public:
        Test() { }
    };
    
    Test<5> test;
    Test<40> biggertest;
    

    此技术不允许您在运行时计算大小(如动态std::vector 解决方案所做的那样),但根据您的需要,这可能就足够了。

    【讨论】:

    • 这行得通,但现在每个版本的 Test 都是不同的类。因此没有隐含的友谊(因此没有复制等的访问权限)。
    • 并不是说您可以将 Test 复制到 Test ——它不适合。此外,没有多态性 - Test 和 Test 是不兼容的类型,因此处理它们的每个函数也必须模板化。
    • 不用担心。他仍然可以模板化 operator= 和 cctor。
    • @Greg:有趣的提示。泛型!= 模板的另一个原因。还是泛型
    【解决方案4】:

    首先,一般最好在构造函数的初始化列表中初始化东西,而不是在构造函数的主体中。

    如果您在编译时知道该边界,则只能使用预定义的边界初始化数组。在这种情况下,您需要动态分配空间。

    你必须记住要有一个析构函数,它会在对象被销毁时删除数组,否则会导致内存泄漏。

    【讨论】:

      【解决方案5】:

      请参阅 Martin 的解决方案(使用 std::vector),并记住,即使您需要将缓冲区传递给 C API,std::vector 也可以通过传递 &amp;vec[0] 来实现:

      std::vector<char> vec(10);
      memset(&vec[0], 0, vec.size());
      

      保证可以工作,但前提是向量不为空(C++ 怪癖,)。

      【讨论】:

      • 我经常使用 &vec[0] 技巧,尽管在这种情况下 memset() 是不必要的,因为 vec 已经被初始化为全零。
      【解决方案6】:

      不,这是不可能的。您应该使用动态数组,例如std::vector。 C99 允许结构只有一个未调整大小的数组作为 last 成员,但即使这样做,您仍然必须自己手动分配内存,例如malloc()

      【讨论】:

        【解决方案7】:

        你说的是不可能的。类总是有一个恒定的大小。您可以让您的类使用指向动态分配数组的指针,或者您可以使用 std::vector。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-01
          • 1970-01-01
          • 2010-09-22
          • 2017-04-07
          • 2016-12-07
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          相关资源
          最近更新 更多