在飞行对象初始化c ++

时间:2016-11-08 12:02:20

标签: c++

我正在尝试习惯C ++。 我想在每次从文件中读取一行而不知道维度时在动态数组中添加一个对象。

我声明了一个指向数组的指针:

Rlmr *myArray;

其中Rlmr是一个公共字符串为id的类。

现在我逐行读取一个文件,之后我想将一个对象添加到myArray

        index = 0;
        while (fgets(buffer, MAXSIZEBUFFER, fp) != NULL) {
            if(buffer[0] == '#') // Skip comment lines
                continue;
            else {
                sscanf(...);
                index++;
            }
        // At this point I want a new object in the array
        myArray = (Rlmr*) malloc(sizeof (Rlmr) * index);
        // Here I try to call the object constructor by passing the id
        myArray[index-1] = new Rlmr(cBeacId);
        }

我不明白编译器的错误:

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

出了什么问题。而且,如何使用std :: vector完成它。 我想了解两种方式,谢谢。

2 个答案:

答案 0 :(得分:1)

首先,不要使用malloc动态分配对象。而是使用new(如果分配数组,则为new[]

现在为您解决问题。数组是一个对象数组,而不是一个指向对象的指针数组。 new Rlmr(cBeacId)导致*指针to a Rlmr`对象。这就是你得到错误的原因。

解决问题的一种方法是使用std::vector(应该始终是&#34;转到&#34;默认容器)。然后你可以做类似

的事情
std::vector<Rlmr> myArray;

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

除此之外,您应该学习如何使用标准C ++流设施和字符串类。从长远来看,它将使您作为C ++程序员的生活变得更加轻松,尤其是当您可以以创造性的方式开始使用某些standard algorithm functions时。

答案 1 :(得分:1)

有什么问题? new返回一个指针。在以下行中,您尝试分配指向现有对象的指针:

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

相反,你应该写:

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

名为&#34;展示位置new&#34; (cf here)。这解决了您的问题,但不应满足任何人。

其次,如何使用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的详情,例如: vector::emplace_back可用$observer->method('getSampleData') ->will($this->returnCallback( function() { $this->mockTestCall('arg1_value'); } ));