我是OOP编程的新手,我需要一些作业方面的帮助。 我需要使用cin >>输入char *,但是当我将char *初始化为NULL时,它会中断并给我抛出“ _Str was nullptr”的异常,我该怎么办才能解决此问题? 我正在使用具有受保护成员的类,我尝试过改用公共程序,但无济于事。 正如我所说的,我对此很陌生,如果我没有正确解释,请原谅。
“ Book a”下面的代码正常工作。
class Book
{
protected:
char* title;
char* firstName;
char* lastName;
char* company;
int pages;
float price;
}
我参数化的构造函数看起来像这样
Book(const char* title, const char* firstName, const char* lastName, const char* company, int pages, float price)
{
this->title = new char[strlen(title) + 1];
strcpy(this->title, title);
this->fistName = new char[strlen(firstName) + 1];
strcpy(this->firstName, firstName);
this->lastName = new char[strlen(lastName) + 1];
strcpy(this->lastName, lastName);
this->company = new char[strlen(company) + 1];
strcpy(this->company, company);
this->pages = pages;
this->price = price;
}
int main()
{
Book a("TESTtitle", "TESTfirstName", "TESTlastName", "TESTcompany", 365, 50);
a.print();
Book c;
char* title=NULL;
char* firstName=NULL;
char* lastName=NULL;
char* company=NULL;
int pages;
float price;
cin >> title;
cin >> firstName;
cin >> lastName;
cin >> company;
cin >> pages;
cin >> price;
}
答案 0 :(得分:1)
由于这个问题被标记为C ++,因此您应该对指针进行三思。高级C ++程序应避免使用Rawe指针:引用,智能指针和标准容器应足够。
如果要在后台查看,必须看到一个指针作为地址:除非指针指向有效的对象,否则您将无法对其进行任何操作。在这里,您已将指针初始化为NULL,因此您无法取消引用它们。使用它们之前,必须为它们分配有效的字符数组
#define SIZE 32
char cTitle[SIZE];
char *title = cTitle;
但是请记住:这是相当C的代码,除非必须连接C代码或正在构建自定义的低级对象,否则不要使用它。
答案 1 :(得分:1)
您使用 @Stateless()
@LocalBean
@TransactionAttribute(TransactionAttributeType.NEVER)
public class BatchService{
@EJB
private PersonService personService;
public void run(List<Person> personList) {
int totalEventSize = personList.size();
int quotient = totalEventSize / 100000;
int modulo = totalEventSize % 100000;
int totalIterations = quotient + (modulo != 0 ? 1 : 0);
int startCount = 0;
int endCount = 0;
for (int i = 1; i <= totalIterations; i++) {
if (i == totalIterations) {
endCount = totalEventSize;
} else {
endCount = startCount + 100000;
}
List<Person> subList = personList.subList(startCount, endCount);
personService.create(subList);
startCount = endCount;
}
}
}
@Stateless
@LocalBean
public class PersonService implements Serializable {
@EJB
private PersonDLService personDLService;
public void create(List<Person> list) {
try {
personDLService.createPerson(list);
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class PersonDLService implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName = Constants.PERSISTENCE_UNIT_NAME)
private transient EntityManager entityManager;
public void createPerson(List<Person> personObj) {
for (int i = 0; i < personObj.size(); i++) {
entityManager.persist(personObj.get(i));
if (i % 2000 == 0) {
entityManager.flush();
entityManager.clear();
}
}
System.out.println("***************** COMMITED ****************" + personObj.size());
}
}
的方式与使用std::string
的方式几乎相同(但必须int
是定义,它不是关键字)。通常也最好接受任何#include
来输出,而不是总是接受std::ostream
。请注意,std::cout
是a bad idea。
using namespace std