我是C ++的新手并且已经研究了数组,指针等等,但是我无法弄清楚如何使这个工作。希望你能帮忙!
我需要一个包含3 x 2个对象frases
的二维数组MGFrase
。它们将通过方法getFrase
检索,因此我可以使用MGFrase
的方法setTone
更改其属性altura
,这是{{1}的数组}第
在下面的代码中,我希望更改int
的{{1}},但它会不断更改alturas[0]
。
这是创建阵列的正确方法吗?这些方法有问题吗?
如果我的问题不够明确或与论坛规则不符,请告诉我,以便我可以编辑,我是新来的。
提前谢谢大家!
frases[1, 0]
PS:这就是解决方案的现状:
frases[0, 0]
答案 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>
对象,负责为您进行内存清理。现在,由于缺少析构函数,您的代码不会创建内存泄漏。