【问题标题】:Passing a vector<string> as a parameter in the parameterized constructor of an object在对象的参数化构造函数中将 vector<string> 作为参数传递
【发布时间】:2013-12-11 10:56:47
【问题描述】:

我有一个正在处理的任务,所以我很犹豫是否在此处发布我的所有代码(因为我的教授可能会以某种方式找到它 - 政策是构成作弊)。

我的问题出在这个问题上:我有一个可视 C++ 程序,它有一个文本框,用户输入一个字符串,单击一个按钮,然后将该字符串添加到一个向量中。然后我需要通过其参数化构造函数将该向量(充满字符串)传递给新创建的对象。还涉及到一些继承。

基本上,在对象的 .h 文件和表单 .h 文件中,我有以下内容(根据老师希望它在我不允许更改的对象 .h 文件中的方式):

typedef vector<string> StringList;

然后我在表单的 .h 文件中创建一个新的父对象和一个新的向量:

private: Trial * t;
private: StringList * strings;

然后在表单的构造函数中初始化它:

strings = new StringList;

然后我尝试创建派生类的新实例并将其分配给父对象,同时传递所需的参数:

t = new Vector_Trial( strings, multi, type );

我在第一个括号下面看到一条红线:

Error: no instance of constructor "Vector_Trial::Vector_Trial" matches the argument list
argument types are:(StringList *, int, Trial::TrialType)

以下是父类和派生类的构造函数:

Trial ( StringList & s, int num_runs, TrialType t )
      : strings(s), numRuns(num_runs), type(t) { }

Vector_Trial ( StringList & s, int num_runs, TrialType t ) : Trial ( s, num_runs, t ) {}

我假设我的问题与向量有关。有什么想法吗?

【问题讨论】:

  • 为什么不直接将私有成员声明为“StringList 字符串”,然后放弃对new 的调用?
  • 只使用StringList strings,不使用指针版本,然后在Vector_Trial构造函数中,您可以在输入StringList上调用swap方法来交换字符串。
  • 不幸的是,当我这样做时,我收到错误:错误:托管类的成员不能属于非托管类类型
  • 我似乎需要将 Vector_Trial 创建为“非托管类”,然后通过指针 (pimpl) 包装在“托管”类中。就我个人而言,我会避免使用 .NET 编译器,它会将这种废话添加到 C++ 中。见stackoverflow.com/questions/11588261/…

标签: c++ vector


【解决方案1】:

如果你使用这个功能,

Vector_Trial ( StringList & s, int num_runs, TrialType t )

您将向它传递一个StringList 对象,而不是指向StringList 的指针。 如果您更改您的strings 声明如下,

private: StringList strings;

【讨论】:

  • 当我这样做时,我收到错误:错误:托管类的成员不能属于非托管类类型
【解决方案2】:

我不明白您为什么需要将strings 设为StringList*

相反,只需将其声明为 StringList strings;,并删除对 new 的调用。

【讨论】:

  • 当我这样做时,我收到错误:错误:托管类的成员不能属于非托管类类型
  • @user3089335 :啊,你在用 C++/CLI 编程?那是一种不同的语言......我不知道如何最好地帮助你。您可以尝试一些丑陋的方法,例如将 *strings 作为参数传递给 Vector_Trial 作为 hack,但是......呃?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2013-11-29
  • 2014-02-14
相关资源
最近更新 更多