2016-11-08 63 views
0

我想习惯C++。 我想在每次从文件中读取一行而不知道维时,在动态数组中添加一个对象。在飞行对象初始化C++

我宣布这样一个指针数组:

Rlmr *myArray; 

其中Rlmr是与公共字符串作为ID的一类。

现在我通过线读取文件中的行之后,我想一个对象添加到myArray的

​​

我不明白,然后从编译器错误:

error: no match for âoperator=â in â*(myArray+ ((unsigned int)(((unsigned int)index) * 28u))) = (operator new(28u), (<statement>, ((Rlmr*)<anonymous>)))â

什么是错的。而且,如何使用std :: vector来完成。 我想了解这两种方式,谢谢。

+7

有几件事情是错误的。 'malloc'。 'malloc'是C,而不是C++。 C++代码使用'new'。此外,你甚至不应该使用'malloc'或'new',但是你应该使用'std :: vector',让它担心自动调整数组的大小。如果你想“习惯C++”,最好的方法是学习如何正确使用C++容器。现代C++代码很少需要动态分配任何内存。如果你想使用'std :: vector',你的C++书会给出一个更好的解释,而不是简单的回答stackoverflow.com –

+0

...特别是如果这本书来自一个好的C++书籍列表](http://stackoverflow.com/q/388242/1782465) – Angew

回答

1

出了什么问题? new返回一个指针。在下面的行您要的指针分配给现有对象:

myArray[index-1] = new Rlmr(cBeacId); 

相反,你应该写:

new (myArray + index - 1) Rlmr(cBeacId); 

被称为“放置new”(CF here)。这解决了你的问题,但不应该满足任何人。

其次,如何与vector做到这一点:在vector

std::vector<Rlmr> data; 

while (fgets(buffer, MAXSIZEBUFFER, fp) != NULL) { 
    if(buffer[0] == '#') // Skip comment lines 
     continue; 
    else { 
     sscanf(...); 
    } 
    data.emplace_back(cBeacId); 
} 

详细信息。 vector::emplace_back可用here

1

首先不要用malloc动态分配对象。相反,使用new(或new[]如果分配数组)。

现在为您的问题。该数组是一个对象数组,而不是指向对象的指针数组。并且new Rlmr(cBeacId)产生*指针to a Rlmr对象。这就是为什么你会得到一个错误。

解决您的问题的一种方法是使用std::vector(它应该始终是“转到”默认容器)。然后,你可以这样做

std::vector<Rlmr> myArray; 

while (...) 
{ 
    ... 
    myArray.emplace_back(cBeacId); 
} 

除此之外你应该学习如何使用标准C++流设施和String类。从长远来看,它将使您的C++程序员变得更加轻松,特别是当您可以创造性地使用某些standard algorithm functions时。