【问题标题】:C++ Adding a new class object into a new spot in an arrayC++ 将新的类对象添加到数组中的新位置
【发布时间】:2013-06-09 12:29:26
【问题描述】:

我是 C++ 编程的新手,以前了解过 AS3 编程。 我的问题是我无法弄清楚如何将一个新对象从一个类插入到一个数组中。

基本上我想做的是:

ClassName classArray[];
classArray[n]=new ClassName("Tekst");

这是我的代码(使用 Visual Studios 2012 C++ 编写):

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

//a class holding user data
class User
{
public:
    string name;
    User(string nameInn)
    {
        //when the user is created it should get information about its name.
        name=nameInn;
    }
};

//array with all users
User userArr[];
int userArrLength=0; //the length of that array (dont know how to find the length of arays holding classes)

int main()
{
    //the user writes down the name of all users.
    cout << "Write user name. \n Write \"fin\" til finish\n";
    bool hasFinished=false;
    //asks you for a new user until you write fin
    while(hasFinished==false)
    {
        string inn;
        cin >> inn;
        if(inn=="fin") hasFinished=true;
        //here im trying to make a new user inn a new spot in the userArr.
        else userArr[(userArrLength+=1)+1]=new User(inn);
    }

    return 0;
}

我的格式是不是错了,如果是,我该如何格式化?还是我误解了 C++ 中类的一些基本要素?

【问题讨论】:

  • 你肯定在这个程序中遇到了错误。你能把它们都列出来吗?
  • 我认为你必须从脑海中抹去 java 并从一些 C++ 教学书籍开始。看起来相似的东西在这里的行为完全不同
  • 查看第一个示例时首先想到的是:new X() 返回指向 X 的指针,因此您需要指向 X 的指针数组而不是 X 数组。
  • @confusopoly 也许他们根本不需要new
  • @juanchopanza 可能,但是你会得到一个默认构造的对象数组,并为你放入数组中的每个对象调用类的赋值运算符。这是我通常喜欢避免的事情,除非我知道该类正确地实现了它。编辑:nvm,该类仅包含一个 std::string 成员,因此它不会引起任何问题。

标签: c++ arrays class visual-c++


【解决方案1】:

std::vector 是一种数据结构,它实现了一个动态大小的数组,可以根据需要增加大小。您可以使用std::vector&lt;User&gt; 代替您自己的数组:

#include <vector>

...

  std::vector<User> v;

  // perhaps in a loop
  string inn;
  cin >> inn;
  v.push_back(User(inn));

【讨论】:

  • 感谢您的帮助! :)
【解决方案2】:

在 C++ 中,数组的大小是静态的。此外,new 创建了一个指针,这意味着您还为数组使用了错误的数据类型。

建议的解决方法是使用向量,而不是:

// At the top
#include <vector>

// Instead of that array
std::vector<User> userVector;

// Inside of the loop
userVector.push_back(User(inn));

std::vector本质上是一个动态数组。

然而,仍然需要考虑一些事情:当为向量分配空间时,它的所有成员都使用默认构造函数初始化(即可以不带参数调用的构造函数)。

如果您的 User 类没有默认构造函数 如果您的 cl,则必须将 指针 插入到用户(std::vector&lt;User * &gt; userVectoruserVector.push_back(new User(inn))),然后手动删除之后带有delete 的指针。(见下面的评论)

【讨论】:

  • 最后两段写错了。 std::vector 不需要您的类具有默认构造函数。分配原始内存,然后使用复制(或移动)构造函数就地构造对象。唯一需要默认构造函数的情况是调用 resize 的单参数版本。
【解决方案3】:

数组一经创建就无法更改其长度。

【讨论】:

    【解决方案4】:

    如果您不知道数组的大小,那么您不应该使用静态数组。您应该使用 dynamic 数组。像这样的:

    #include <vector>
    
    std::vector<User> userArr;
    

    这里的userArr 将是一个具有动态大小的向量。然后您可以更改您的 while 循环来执行此操作:

    std::vector<User> arr;
    
    for (std::string in; std::cin >> in && in != "fin";)
    {
        arr.push_back( User(in) );
    }
    

    【讨论】:

    • std::string in; std::cin >> in && in != "fin";这意味着什么?在这些情况下你还需要使用 std:: 吗?
    • @TubeOfJokes 所有basic_istream 对象都有一个布尔运算符,当调用该运算符时,返回流是否有任何错误。 &amp;&amp; 运算符尝试将其转换为布尔值。该行基本上是说“只要用户输入in 的有效输入,只要in在输入后不等于“fin”,就这样做......” .
    猜你喜欢
    • 2021-12-29
    • 2016-01-14
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2020-09-01
    • 2019-01-29
    • 2017-07-12
    相关资源
    最近更新 更多