声明稍后初始化的结构成员(C ++)

时间:2015-10-17 07:37:34

标签: c++ opencv struct initialization declaration

我需要一个在结构中声明的变量,以便稍后用值初始化。这基本上是因为它的初始化取决于结构的另一个成员,它只在某些函数完成后才有值。

这听起来有点奇怪,所以我会展示我的代码:

# tables.py
class MyItemsTable(tables.Table):
    itemid = tables.LinkColumn('myapp.views.edit_item', 
                        args=[A('pk')],orderable=False)
    class Meta:
        model = models.MyItems
        attrs = {"class": "paleblue"}

# views.py      
def myitems_list(request):
    myitems = models.MyItems.objects.all()
    table = tables.MyItemsTable(myitems)
    RequestConfig(request).configure(table)
    return render(request, 'myapp/mylist.html', {'table':table,'myitems':myitems})

def edit_item(request, pk):
    selecteditem = get_object_or_404(models.MyItems, pk=pk)
    return render(request, 'myapp/edit_item.html', {'selecteditem': selecteditem})

# models.py
class MyItems(models.Model):
    itemid = models.IntegerField(primary_key=True)
    itemfullname = models.TextField('Full Name',blank=True, null=True)

目前此代码抛出此错误: struct frame { Mat thresholded; vector<vector<Point> > contrs; vector<Moments> momts; }; frame obj_detect(frame img) { // Get contours from image findContours(img.thresholded, img.contrs, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // Initialise moments vector big enough for all contours' moments img.moments(img.contrs.size()); ... return img; } int main() { frame frame1; frame1 = obj_detect(frame1); ... }

我应该如何初始化矩矢量数组,以便它有足够的空间用于所有轮廓?

3 个答案:

答案 0 :(得分:2)

你想要做的事情没有任何错误或奇怪。这是一个初始化函数的例子(或者称为类的构造函数)。

还不完全清楚的是struct1是否是要初始化的结构,或者它是否是用于返回新结构的输入(因为您的函数确实将其返回类型定义为my_struct也是如此)。在任何一种情况下,通常建议通过引用而不是值或返回值来传递结构。

您可以尝试这样的事情:

void my_function(const my_struct& input_struct, my_struct& output_struct)
{
  ...
  output_struct.size = ...;
  output_struct.my_array = new char[output_struct.size];
  ...
}

当然,如果您真的使用的是C ++,那么您应该质疑为什么使用结构来表示似乎是字符串的内容?

一旦你以这种方式分配内存,重要的是你也要释放内存以避免内存泄漏。可以使用delete取消分配单个对象,但应使用delete []取消分配数组,例如:

delete [] some_struct.my_array;

此外,在解除分配它们之后将指针设置为null被认为是一种好习惯,以避免引用过时的内存段。这可以这样做:

some_struct.my_array = nullptr;

最后,管理这一切都变得有点乏味,特别是如果对象的生命周期和所有权更复杂的话。为了解决这个问题,标准库有unique_ptrshared_ptr个对象,当对象不再被使用时会自动解除分配。

我认为详细了解各自的差异和用途是不合理的,因为这里和其他地方有无数资源。

答案 1 :(得分:-3)

你必须使用malloc()

char* struct1.my_array = new char[struct1.size];

编辑: 实际上你可以使用malloc或new。在这种情况下 - 无所谓。如果您更喜欢malloc,则必须使用free()释放内存,否则必须使用new / delete。通常new / delete在创建对象时很有用,当你处理结构和原始类型时会坚持使用malloc。

New / Delete运算符通常调用构造函数/析构函数,它们比malloc / free稍慢。那么为什么你必须支付(甚至一点点)性能成本呢?

答案 2 :(得分:-3)

对我来说这是一个非常简单的问题

    my_struct my_function(my_struct struct1)
    {
        ...
        struct1.my_array = malloc(struct1.size); // Initialise the array
        ...
    }