c ++对象数组,初始化失败
c++ array of objects, failed initialization
需要使用 class 对象数组为学校做一个项目。我们不能使用矢量,所以任何暗示它们的答案都无济于事。我一直在尝试创建这样的数组,然后在每个对象中放置一个名称。我试过 运行 一个 for 循环来做到这一点,它一直跳过数组中的第一个对象。帮忙?
#include <iostream>
#include <cstring>
using namespace std;
class Car
{
private:
char* driver;
public:
void setDriver(char* name)
{
driver = name;
}
void getDriver()
{
cout<<driver;
}
};
int main()
{
int numDrivers;
cout<<"How many drivers would you like?";
cin>>numDrivers;
Car* roster = new Car[numDrivers];
for(int i=0;i<numDrivers;i++)
{
char* name;
name = new char[20];
cout<<"name:";
cin.getline(name, 20);
roster[i].setDriver(name);
}
for(int i=0;i<numDrivers;i++)
{
roster[i].getDriver();
cout<<".\n";
}
return 0;
}
我试过 for 循环的范围,它仍然总是做同样的事情
当它进入循环以设置驱动程序的名称时。看起来像这样
How many drivers would you like?: 4
name:name: name1
name: name2
name: name3
.
name1.
name2.
name3.
非常感谢任何帮助。
根据评论,同样的问题已在 cin and getline skipping input
中得到解答
这会影响您的代码的确切方式如下。
您执行这些行以从输入中读取数字 4(例如):
cout<<"How many drivers would you like?";
cin>>numDrivers;
>>
运算符从 cin
中读取了足够的字符以确定那里有一个数字 4(并且该数字以 4 结尾)。它 not 不会再读下去,所以您可能在该行输入的任何其他内容仍会存在。
如果您在“4”之后立即按下 "return" 键,那么该行中唯一剩下的就是结束该行的换行符,但它仍然存在。
与用户的下一次交互是在 i
为 0
时的输入循环期间。
此代码执行:
cout<<"name:";
cin.getline(name, 20);
所以程序将 "name" 打印到控制台并等待,直到有一些输入被换行符终止。但是已经有这样的输入等待读取(cin>>numDrivers
遗留下来的)。
所以程序读取了 return 之前没有任何内容的回车符。
它将此作为空字符串处理并继续进行第二次迭代
循环。
看来问题是你在行
中有一个'dangling'\n换行符
cin>>numDrivers;
上面的代码不使用换行符。所以当代码到达
cin.getline(name, 20);
它将换行符作为一行消耗并移动一个
修复方法是在您第一次调用 cin 后忽略所有字符,如下所示
void ignore_line ( std::istream& in )
{
in.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
}
int main()
{
int numDrivers;
cout<<"How many drivers would you like?";
cin>>numDrivers;
ignore_line(cin); // Consume newline
Car* roster = new Car[numDrivers];
for(int i=0;i<numDrivers;i++)
{
char* name;
name = new char[20];
cout<<"name:";
cin.getline(name, 20);
roster[i].setDriver(name);
}
for(int i=0;i<numDrivers;i++)
{
roster[i].getDriver();
cout<<".\n";
}
return 0;
}
需要使用 class 对象数组为学校做一个项目。我们不能使用矢量,所以任何暗示它们的答案都无济于事。我一直在尝试创建这样的数组,然后在每个对象中放置一个名称。我试过 运行 一个 for 循环来做到这一点,它一直跳过数组中的第一个对象。帮忙?
#include <iostream>
#include <cstring>
using namespace std;
class Car
{
private:
char* driver;
public:
void setDriver(char* name)
{
driver = name;
}
void getDriver()
{
cout<<driver;
}
};
int main()
{
int numDrivers;
cout<<"How many drivers would you like?";
cin>>numDrivers;
Car* roster = new Car[numDrivers];
for(int i=0;i<numDrivers;i++)
{
char* name;
name = new char[20];
cout<<"name:";
cin.getline(name, 20);
roster[i].setDriver(name);
}
for(int i=0;i<numDrivers;i++)
{
roster[i].getDriver();
cout<<".\n";
}
return 0;
}
我试过 for 循环的范围,它仍然总是做同样的事情 当它进入循环以设置驱动程序的名称时。看起来像这样
How many drivers would you like?: 4
name:name: name1
name: name2
name: name3
.
name1.
name2.
name3.
非常感谢任何帮助。
根据评论,同样的问题已在 cin and getline skipping input
中得到解答这会影响您的代码的确切方式如下。 您执行这些行以从输入中读取数字 4(例如):
cout<<"How many drivers would you like?";
cin>>numDrivers;
>>
运算符从 cin
中读取了足够的字符以确定那里有一个数字 4(并且该数字以 4 结尾)。它 not 不会再读下去,所以您可能在该行输入的任何其他内容仍会存在。
如果您在“4”之后立即按下 "return" 键,那么该行中唯一剩下的就是结束该行的换行符,但它仍然存在。
与用户的下一次交互是在 i
为 0
时的输入循环期间。
此代码执行:
cout<<"name:";
cin.getline(name, 20);
所以程序将 "name" 打印到控制台并等待,直到有一些输入被换行符终止。但是已经有这样的输入等待读取(cin>>numDrivers
遗留下来的)。
所以程序读取了 return 之前没有任何内容的回车符。
它将此作为空字符串处理并继续进行第二次迭代
循环。
看来问题是你在行
中有一个'dangling'\n换行符cin>>numDrivers;
上面的代码不使用换行符。所以当代码到达
cin.getline(name, 20);
它将换行符作为一行消耗并移动一个
修复方法是在您第一次调用 cin 后忽略所有字符,如下所示
void ignore_line ( std::istream& in )
{
in.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
}
int main()
{
int numDrivers;
cout<<"How many drivers would you like?";
cin>>numDrivers;
ignore_line(cin); // Consume newline
Car* roster = new Car[numDrivers];
for(int i=0;i<numDrivers;i++)
{
char* name;
name = new char[20];
cout<<"name:";
cin.getline(name, 20);
roster[i].setDriver(name);
}
for(int i=0;i<numDrivers;i++)
{
roster[i].getDriver();
cout<<".\n";
}
return 0;
}