0

我想将结构的动态数组作为成员变量存储在另一个结构中。这是使用我在 main 中给出的示例的构造函数的正确方法吗?

编辑 我纠正了我在代码中的一些明显错误(当时是早上 6 点)。我还向 B 添加了另一个成员,以查看 push_back 是否仍然正确。我知道使用动态内存的向量会更轻松,但我需要这样做,因为这些结构最终要与推力::device_vector 一起使用。

struct A
{
    float mem1;
    int mem2;
};
struct B
{
    A * Aarr1;
    A * Aarr2;
    B(A * a1, A * a2): Aarr1(a1), Aarr2(a2){}
};
int main()
{
    A * test = new A[5];
    A * test2 = new A[10];
    vector<B> btest;
    btest.push_back(B(test, test2));
    for(int i=0; i<5; i++)
        printf("mem1: %f, mem2: %i \n", btest[0].Aarr[i].mem1, btest[0].Aarr[i].mem2);
}
4

3 回答 3

1

单独来看,构造函数很好。但是,代码还有许多其他问题。

就目前而言,您的代码正在泄漏内存,因为该数组从未被释放。

您可能需要考虑从使用 C 数组转移到std::vectorstd::array.

printf()(误拼为print())中还有一个错误:两者之一mem1应该是mem2.

于 2013-03-16T10:09:01.120 回答
1

的构造函数B是可以的,但是你调用的方式push_back()不是:

btest.push_back(B(A));

你应该做这个:

btest.push_back(B(test));

B此外,不需要显式构造对象,因为您的构造函数未标记为explicit

btest.push_back(test);

还要考虑使用自动内存管理而不是原始指针(std::vector<>而不是数组,智能指针而不是指针)。这样,您将避免由于忘记这一点而导致内存泄漏:

delete test;

撇开泄漏不谈,最糟糕的是你的代码也有未定义的行为,因为它使用了未初始化变量的值(循环A内的成员变量)。for

最后,你不应该:在类定义中使用 after 类名。这就是您可以在 C++11 中重写代码的方式:

#include <vector>
#include <cstdio>

struct A // Do not use ":" here, that's for introducing inheritance,
         // which you are not using in your example.
{
    float mem1 = 0.0; // In C++11, you can specify default initialization
    int mem2 = 0;     // for your member variables this way. In C++03 you
                      // would have to define a default constructor which
                      // initializes your member variables to the desired
                      // value.
};

struct B
{
    std::vector<A> Aarr;
//  ^^^^^^^^^^^^^^
//  Prefer using standard containers over dynamically allocated arrays, as
//  it saves your from taking care of memory management and avoids leaks.

    explicit B(size_t s): Aarr(s) { }
//  ^^^^^^^^
//  It is usually a good idea to mark constructors which take on argument
//  and are not copy constructors as explicit, to avoid awkward implicit
//  conversions.
};
int main()
{
    std::vector<B> btest;
    btest.push_back(B(5));
//                  ^^^^
//                  We need to explicitly construct an object of type B,
//                  because we have marked B's constructor as explicit.

    for(int i=0; i<5; i++)
    {
        std::printf(
             "mem1: %f, mem2: %i \n", 
            btest[0].Aarr[i].mem1, 
            btest[0].Aarr[i].mem2
            //                  ^
            //                  You had "mem1" here.
            );
    }
}
于 2013-03-16T10:11:45.703 回答
0

您的代码中几乎没有小错误和拼写错误。它应该如下所示:

struct A  // <-- no ':' after name type
{
    float mem1;
    int mem2;
};

struct B  // <-- no ':' after name type
{
    A * Aarr;
    B(A * a): Aarr(a){}
};

int main()
{
    A * test = new A[5];
    vector<B> btest;
    btest.push_back(B(test)); // <-- test, A is name of type
    for(int i=0; i<5; i++)
        printf("mem1: %f, mem2: %i \n", // <-- printf, not print
                btest[0].Aarr[i].mem1, btest[0].Aarr[i].mem1);
}

还可以考虑使用std::vectororstd::array代替 C 样式的数组。

于 2013-03-16T10:13:33.273 回答