创建指向对象的二维指针数组并将其传递给其他类

时间:2015-06-16 14:58:47

标签: c++ arrays object

我是C ++的新手并且已经研究了数组,指针等等,但是我无法弄清楚如何使这个工作。希望你能帮忙!

我需要一个包含3 x 2个对象frases的二维数组MGFrase。它们将通过方法getFrase检索,因此我可以使用MGFrase的方法setTone更改其属性altura,这是{{1}的数组}第

在下面的代码中,我希望更改int的{​​{1}},但它会不断更改alturas[0]

这是创建阵列的正确方法吗?这些方法有问题吗?

如果我的问题不够明确或与论坛规则不符,请告诉我,以便我可以编辑,我是新来的。

提前谢谢大家!

frases[1, 0]

PS:这就是解决方案的现状:

frases[0, 0]

2 个答案:

答案 0 :(得分:1)

您没有正确索引数组。每个维度都需要有自己的方括号[]。因此,对于二维数组,您可以将其作为:

访问
foo[row][col]

你有什么:

frases[n, 0] = new MGFrase();

使用逗号运算符忽略左侧并使用右侧作为索引。

有了这个,你可以修复你的功能:

MGComposition::MGComposition(){

    frases = new MGFrase* [3];
    for( int n = 0 ; n < 3 ; n ++ ){
        frases [n] = new MGFrase[2];
    }

    for( int n = 0 ; n < 3 ; n ++ ){
        frases[n][0] = new MGFrase();
        frases[n][1] = new MGFrase();
    }
}

MGFrase* MGComposition::getFrase( int channel , int numFrase ){
    return frases[ channel][numFrase] ;
}

void MGComposition::log(){
    cout << "- Composition --\n";
    for( int n = 0 ; n < 3 ; n ++ ){
         frases[n][0]->log();
         frases[n][1]->log();
    }
}

MGFrase::MGFrase(){
   int alturas [10];

}

void MGFrase::setTone(int tone, int index) {
    alturas[index] = tone;
}


MGGenerator::MGGenerator( MGComposition* theComposition ) {

  MGComposition* composition;
  composition = theComposition;

  MGFrase* fraseDoBaixo;
  fraseDoBaixo = composition->getFrase(1, 0);
  fraseDoBaixo->setTone(8, 0);

}

答案 1 :(得分:1)

具有两个维度的指针数组实现为锯齿状数组需要三个星号:每个维度一个星号,加上一个星号,它是一个指针数组。一对方括号可以替换一个星号。您的声明new MGFrase* [3]生成三个指针的数组,因此它缺少一个星号。

这整个星号计数业务很快变得相当烦人。幸运的是,您可以通过使用C ++容器来避免所有这些,例如std::array<T,N>std::vector<T>来代替指针数组。以下是如何使其发挥作用:

std::array<std::array<std::unique_ptr<MGFrase>,2>,3> frases;

MGComposition::MGComposition(){
    for( int n = 0 ; n < 3 ; n ++ ){
        frases[n][0] = make_unique<MGFrase>(new MGFrase());
        frases[n][1] = make_unique<MGFrase>(new MGFrase());
    }
}

此方法使用固定大小的2×3数组的std::unique_ptr<MGFrase>对象,负责为您进行内存清理。现在,由于缺少析构函数,您的代码不会创建内存泄漏。