c++ 使用动态生成的数组的类

y4ekin9u  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(144)

尝试创建一个类,该类可以更改动态创建的二维字符串数组中特定元素的内容。
我有一个程序,可以动态创建一个二维数组,然后我想创建一个类,把这个数组作为参数,沿着两个整数,它们将是一个特定元素的索引,稍后我会让它交换那个元素的内容,并扫描数组中它想交换的其他元素,现在我甚至在挣扎,让类把那个数组作为参数。我知道我必须通过引用而不是通过值来执行此操作,因为数组将动态创建,但似乎我做错了。

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Example {
    int x, y;
    string** chart;
public:

    Example(int i, int j,string **arr);
    void print() const { cout << x << y << chart[x][y] << endl; }

};

Example::Example(int i, int j,string **arr) {
    x = i;
    y = j;
    **chart = **arr;
}

int main() {

    string chart[7][7]; //to make the experiment simpler I haven't 
                        //made the array dynamically generated yet
                        //but it will be later

    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            if (chart[i][j] == "")
                chart[i][j].insert(0, 3, '  ');
        }
    }

    chart[6][5] = "EXA";

    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            cout << '[' << chart[i][j] << ']';
        }
        cout << endl;
    }

    Example Exa1(6, 5, &chart);
    Exa1.print();

    return 0;
}
31moq8wy

31moq8wy1#

问题&chart的类型是std::string (*)[7][7],它不能隐式转换为string**,因此构造函数Example::Example(int i, int j,string **)不能使用。这正是上面提到的错误所指出的:

error: no matching function for call to 'Example::Example(int, int, std::string (*)[7][7])'
   45 |     Example Exa1(6, 5, &chart);

解决这个问题,请确保&chart与构造函数的3参数具有相同的类型。
此外,最好使用std::vector

class Example {
    int x, y;
    std::vector<std::vector<string>> chart;
public:

    Example(int i, int j,const std::vector<std::vector<std::string>> &arr);
    
};

Example::Example(int i, int j,const std::vector<std::vector<std::string>> &arr)
   :x(i),y(j),chart(arr) {
  
}

int main() {

    std::vector<std::vector<std::string>> chart(7, std::vector<std::string>(7)); 
    //pass chart instead of &chart
    Example Exa1(6, 5, chart);

}

Working demo
或者也可以使用std::array

class Example {
    int x, y;
    std::array<std::array<std::string, 7>, 7> chart;
public:

    Example(int i, int j,const std::array<std::array<std::string, 7>, 7> &arr);
    
};

Example::Example(int i, int j,const std::array<std::array<std::string, 7>, 7> &arr)
   :x(i),y(j),chart(arr) {
  
}

int main() {

    std::array<std::array<std::string, 7>, 7> chart;
    //pass chart instead of &chart
    Example Exa1(6, 5, chart);

}

相关问题