Как использовать массив строк в c ++? - PullRequest
0 голосов
/ 07 августа 2020

Мне нужно создать массив строк, в котором я могу хранить 3 или 5 слов, например {"банан, персик, груша"} или {"апельсин", "груша", "силантро", "имбирь", " mandarine "}.

Я не понимаю, нужно ли мне создавать массив строковых указателей (чтобы динамически выделять память в зависимости от размера массива-3 или 5) или просто иметь массив строк с статически выделенная память 5. И как ее инициализировать / установить значение null / использовать в конструкторах.

Мне не разрешено использовать вектор. Когда я объявил массив размером 5, проблема началась в конструкторе по умолчанию. Я не знаю, как установить для него значение null ... // string multiple_fruits [5] // multiple_fruits [] = {nullptr,};

Итак, я использую здесь массив строковых указателей, есть ли лучший способ? Что я делаю не так?? HAAAALP

//.h file
class Fruit {
  char* single_fruit;
  string* multiple_fruits;
  int num_Fruits;
};
 

//.cpp file
Fruit::Fruit() {
  single_fruit = nullptr;
  multiple_fruits = nullptr;
  num_Fruits = 0;
}
 
Fruit::Fruit(const char* singlefruit, string* multiplefruits, int numFruits) {
  single_fruit = new char[strlen(singlefruit) + 1];
  strcpy_s(single_fruit, strlen(singlefruit) + 1, singlefruit);
 
  multiple_fruits = new string[numFruits];

  for (int i = 0; i < numFruits; i++) {
    multiple_fruits[i] = multiplefruits[i];
  }
  num_fruits = numFruits;
}
 
int main() {
  Fruit A;
  A("apple", {"banana", "peach", "pear"}, 3)
  Fruit B;
  B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"}, 5);
return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Мой подход заключается в использовании std::string и std::initializer_list для этого:

#include <string>
#include <initializer_list>

class Fruit {
public:
  Fruit(const std::string &singlefruit, const std::initializer_list<std::string> &multiplefruits) : single_fruit{singlefruit}, multiple_fruits{new std::string[multiplefruits.size()]}, num_Fruits{multiplefruits.size()} {
    for (std::size_t i = 0; i < num_Fruits; ++i) {
      multiple_fruits[i] = *(multiplefruits.begin() + i);
    }
  }
  ~Fruit() {
    delete[] multiple_fruits;
  }
private:
  std::string single_fruit;
  std::string *multiple_fruits;
  std::size_t num_Fruits;
};

int main() {
  Fruit A("apple", {"banana", "peach", "pear"});
  Fruit B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"});
}

Я выделил память для элементов и удалил память в деструктор.

Вы не можете объявить переменную в одной строке и вызвать конструктор в следующей строке.

0 голосов
/ 07 августа 2020

Вот один из способов использования правильного объявления аргумента массива в конструкторе.

#include <algorithm> // std::copy
#include <iterator>  // std::begin, std::end
#include <string>
#include <iostream>

template<size_t N>
class Fruit {
public:
    Fruit();
    Fruit(const std::string& singlefruit, const std::string (&multiplefruits)[N]);
    
    size_t size() const;

private:
    std::string single_fruit;
    std::string multiple_fruits[N];
};

template<size_t N>
Fruit<N>::Fruit() {}

template<size_t N>
Fruit<N>::Fruit(const std::string& singlefruit, const std::string (&multiplefruits)[N]) 
    : // colon indicates the start of the member initializer list
    single_fruit(singlefruit)
{
    std::copy(std::begin(multiplefruits), std::end(multiplefruits), multiple_fruits);
}

template<size_t N>
size_t Fruit<N>::size() const { return N; }

int main() {
    Fruit A("apple", {"banana", "peach", "pear"});
    std::cout << A.size() << '\n';

    Fruit B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"});
    std::cout << B.size() << '\n';
}

Вывод:

3
5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...