【问题标题】:Create an array of a Class based on string基于字符串创建一个类的数组
【发布时间】:2020-12-03 13:07:28
【问题描述】:

我创建了一个名为“信”的类:

class Letter
{
    char letter{};
    bool guessed{ false };

    public:
        void setLetter(std::string);
};

我想创建一个“字母”类的数组。数组的大小应该是用户输入字符串的大小,如果可能,字符串的每个字母都应该存储在字母对象的 1 个元素中。 我尝试了以下方法:

std::string word;
Letter test[] = word;
"initialization with {...} expected for aggregate object"
std::string word;
Letter test[word.length()]; // and then iterate through each element of the string
"expression must have a constant value"

编辑: 解决了

std::string word;
std::vector<Letter> test;
for (int i = 0; i < word.length(); i++)
{
    test[i].setLetter(word[i]);
}

【问题讨论】:

  • 当您需要动态大小的数组时首选std::vector
  • 你能用vector吗?
  • @GenoC 当然,我只是更习惯于数组
  • setLetter(std::string) 应该是setLetter(char);
  • letter 成员是 private。大概是setLetter负责设置吧。但它需要一个完整的std::string 而不仅仅是一个字母。目前尚不清楚它是如何工作的,如果输入不完全是 1 个字母,我无法想象它应该做什么。您的意思是改用void setLetter(char) 吗?

标签: c++ arrays string class


【解决方案1】:

您可以修改您的程序以使用std::vector,这会更可取,因为它更灵活且更易于使用。你可以做这样的事情 -

class Letter
{
    char letter{};
    bool guessed{ false };

    public:
        void setLetter(char c){
            letter= c;
        };
        char getLetter(){
            return letter;
        };
};

int main()
{
    int user_input;
    char tmp;
    std::cin>>user_input;
    std::vector<Letter> test(user_input);  // this will create an array which can hold user_input number of objects of given type - Letter
    std::cout<<"enter letters :\n";
    for(int i=0;i<user_input;i++){
        std::cin>>tmp;
        test[i].setLetter(tmp);            // read input letter into each element(which is object of Letter)
    }
    for(int i=0;i<user_input;i++){
        std::cout<<test[i].getLetter();    // output the read letter
    }

    return 0;
} 

输入:

4
abcd

输出:

enter letters :
abcd

  1. 在这里,您使用一个 Letter 向量,其中我只是将输入读取到向量的每个元素中(其中每个元素将是 Letter 类的对象),然后我只是输出读取的值。您可以修改上述程序以满足您的需要。

  2. 我做的另外一个改动是setLetter传入的参数。由于是设置letterLetter的对象的变量,所以它应该取一个字符作为参数,然后设置字符作为字母的值。我刚刚添加了getLetter,它只是返回要打印的字母。

  3. 如果你不想使用向量,你可以使用带有声明语法的数组,比如 -

     Letter* test = new Letter[user_input];
    

    但是,在 C++ 中,向量是首选方式,应避免使用数组,因为向量类似于具有附加功能和灵活性的数组。

【讨论】:

    【解决方案2】:

    正如已经指出的那样,我也会使用矢量来表示动态大小。在我看来,艰巨的任务是将字符串转换为字母数组。 Letter 类应该有一个构造函数,它接受一个字符并存储它。比你可以做这样的事情:

    std::vector<Letters> myVector;
    for( char current : string )
    {
        myVector.emplace_back( current );
    }
    

    【讨论】:

      【解决方案3】:

      在现代 C++ 中,在考虑动态数组时应首先使用的工具是 std::vector。在这里,您将使用std::vector&lt;Letter&gt;。在这种情况下,您可以编写 std::vector&lt;Letter&gt; test(word.length()); 来创建包含 word.length()Letter 的默认构造实例的容器。

      std::vector 的行为主要类似于数组。您可以使用operator[] 以同样的方式访问元素。例如test[1] 访问第二个元素,无论testLetter[] 数组还是std::vector&lt;Letter&gt;。它具有您应该熟悉的附加功能,列于here

      如果数组的大小不是动态的(在编译时已知),仍然最好使用std::array。 C 风格的数组在现代 C++ 中的用例很少,通常应该避免使用更新、更安全的替代方案。

      【讨论】:

      • "在现代 C++ 中,在考虑动态数组时,您应该首先考虑的工具是 std::vector" ... 使用“现代”,您的意思是过去 -1994 年? ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2016-04-11
      • 2022-06-17
      • 2019-02-16
      相关资源
      最近更新 更多