инициализация передачи массива строк в качестве параметра

Могу ли я инициировать массив строк и передать его как функцию, которая его инициализирует. Я знаю, это звучит избыточно, но в основном я хочу инициировать массив строк, а затем передать его в переменную, чтобы я мог использовать его позже? Что-то вроде этого:

Это .h:

class ScreenBasics{

void setupAnswers(int &_numberOfAnswers, string *_answersText);

string *answersText;{

Это будет реализация .cpp

void ScreenBasics::setupAnswers(int &_numberOfAnswers, string *_answersText){

answersText = _answersText; // this is where I get confused cause I don't know if I should initiate my string pointer using new like answersText = new string(_numberOfAnswers);

{

поэтому в main.cpp я могу сделать что-то вроде этого:

 int main( ) {

ScreenBasics basics;
int numberOfAnswers = 4;
string newAnswers [] = { "Good", "Superb", "Great", "Perfect"};
basics.setupAnswers(numberOfAnswers, newAnswers);

// let's say I want to call some of those answers later
for ( int i = 0; i < numberOfAnswers; i++){

cout << basics.answersText[i] << endl;

}

}

Спасибо!

0

Решение

Похоже, ваш класс должен использовать конструктор для инициализации указателя.

class ScreenBasics
{
ScreenBasics(std::string* _answersText, std::size_t size)
: answersText(new std::string[size])
{
// copy values from _answersText to answersText
}
};

Обратите внимание, что, поскольку вы выделяете ресурс динамически, вам необходимо реализовать Правило трех: то есть вам нужно создать конструктор копирования, оператор копирования-назначения и деструктор. Это связано с тем, что их реализации по умолчанию не соответствуют нашим требованиям. Например, конструктор копирования по умолчанию и оператор копирования-назначения выполняют мелкий копии (то есть они копируют указатель но не на что это указывает). Кроме того, деструктор не освобождает память, выделенную моей new[], Вам нужно будет предоставить собственное определение деструктора, который вызывает delete[],

К счастью, всего этого можно избежать, используя стандартный контейнер библиотеки std::vector, который является классом динамического массива, который обрабатывает выделение памяти для вас. Реализации по умолчанию вышеупомянутых конструкторов будут правильно копировать / копировать-назначать вектор, если это необходимо:

class ScreenBasics
{
ScreenBasics(std:vector<std::string> _answersText)
: answersText(_answersText)
{
}
};

Обратите внимание, что размер также не нужно передавать в качестве параметра. Вектор поддерживает свой размер внутри.

0

Другие решения

Думали ли вы об использовании структур? И классы, и структуры могут иметь смесь открытых и закрытых членов, могут использовать наследование и могут иметь функции-члены. Я бы рекомендовал использовать структуры в качестве простых структур старых данных без каких-либо классоподобных функций и использовать классы в качестве совокупных структур данных с частными данными и функциями-членами.

Ваш код будет выглядеть следующим образом:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
string title;
int year;
} mine, yours;int main ()
{
string mystr;

mine.title = "2001 A Space Odyssey";
mine.year = 1968;

cout << "Enter title: ";
getline (cin,yours.title);
cout << "Enter year: ";
getline (cin,mystr);
stringstream(mystr) >> yours.year;

cout << "My favorite movie is:\n ";
printmovie (mine);
cout << "And yours is:\n ";
printmovie (yours);
return 0;
}

void printmovie (movies_t movie)
{
cout << movie.title;
cout << " (" << movie.year << ")\n";
}

Пожалуйста, дай мне знать, если возникнут какие-либо вопросы!

1

По вопросам рекламы [email protected]