初始化传递字符串数组作为参数

时间:2014-09-10 04:20:55

标签: c++ arrays string openframeworks function-parameter

我可以启动一个字符串数组并将其作为初始化它的函数传递。我知道这听起来多余,但基本上我想启动一个字符串数组,然后将它传递给一个变量,以便我以后可以使用它?像这样:

这是.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;

 }

}

谢谢!

2 个答案:

答案 0 :(得分:1)

你是否对使用结构感兴趣?类和结构都可以包含公共成员和私有成员,可以使用继承,并且可以具有成员函数。我建议使用结构作为普通旧数据结构,没有任何类似于类的特性,并使用类作为具有私有数据和成员函数的聚合数据结构。

您的代码如下所示:

#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 :(得分:0)

听起来你的类应该使用构造函数初始化指针。

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

请注意,由于您要动态分配资源,因此需要实现The Rule of Three:也就是说,您需要创建一个复制构造函数,复制赋值运算符和析构函数。这是因为它们的默认实现不会在语义上符合我们的要求。例如,默认的复制构造函数和复制赋值运算符执行副本(即,它们复制指针但不复制它指向的内容)。此外,析构函数不会释放分配给我new[]的内存。您需要提供自己的析构函数定义,该析构函数调用delete[]

幸运的是,使用标准库容器std::vector可以避免所有这些,这是一个动态数组类,可以为您处理内存分配。如果需要,上述构造函数的默认实现将正确地复制/复制分配向量:

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

请注意,大小也不必作为参数传递。矢量在内部保持其大小。