我正在尝试用原始字符表和STL做对象。
我搜索了30个关于相同主题的stackoverflow问题,但它没有给我答案(我认为我无法阅读它们)。
所以当我填写信息时它工作正常,但在我尝试在控制台中打印它们之后,它们会给出奇怪的字符:“╠;╠;╠;²”我不知道为什么,这不是我最强的区域,我试图将char设置为NULL。
谢谢你,我很抱歉这个愚蠢的问题。
我的Object.h文件:
#ifndef Object_H
#define Object_H
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
class Object
{
private:
char Name[100];
char Title[50];
char Phonenumber[30];
char RoomNumber[15];
public:
//default
Object();
//overload
Object(char, char, char, char);
char getName() const;
char getTitle() const;
char getPhno() const;
char getRoomnro() const;
~Object();
#endif
My Object.cpp
#include "Object.h"
Object::Object(){
Name[100] = {0};
Title[50] = { 0 };
Phonenumber[30] = { 0 };
RoomNumber[15] = { 0 };
}
Object::Object(char name, char title, char phonenumber, char roomnumber){
Name[100] = name;
Title[50] = title;
Phonenumber[30] = phonenumber;
RoomNumber[15] = roomnumber;
}
Object::~Object(){
}
//getterit
char Object::getName() const {
return Name[100];
}
char Object::getTitle() const {
return Title[50];
}
char Object::getPhno() const {
return Phonenumber[30];
}
char Object::getRoomnro() const {
return RoomNumber[15];
}
我的main.ccp
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <iomanip>
#include "Henkilo.h"
using namespace std;
void objectFiller(vector<Object>&);
void printObject(const vector<Object>&);
int main() {
vector<Object> ObjectList;
objectFiller(ObjectList);
printObject(ObjectList);
}
void objectFiller(vector<Object>& newObjectList){
char name[100];
char title[50];
char phonenumber[30];
char roomnumber[15];
int size;
cout << "How many people: "; cin >> size;
for (int i = 0; i < size; i++)
{
cout << "Name: ";
cin >> name;
cout << "Title: ";
cin >> title;
cout << "Phonenumber: ";
cin >> phonenumber;
cout << "Roomnumber: ";
cin >> roomnumber;
Object newObject(name[100], title[50], phonenumber[30], roomnumber[15]);
newObjectList.push_back(newObject);
cout << endl;
};
}
cout << endl;
}
void printObject(const vector<Object>& newObjectList)
{
unsigned int size = newObjectList.size();
for (unsigned int i = 0; i < size; i++){
cout << newObjectList[i].getName() << " ; " << newObjectList[i].getTitle() << " ; " << newObjectList[i].getPhno() << " ; " << newObjectList[i].getRoomnro() << endl;
cout << endl;
}
}
答案 0 :(得分:1)
首先,绝对没有理由在这里使用字符数组。你的Object
类不是一个简单的struct
,所以可以使用的推理,即“我的结构需要与C
兼容,所以我需要使用char数组”不适用。
因此,使用std::string
,您的大多数问题都会消失。
#include <string>
class Object
{
private:
std::string Name;
std::string Title;
std::string Phonenumber;
std::string RoomNumber;
public:
Object();
//overload
Object(const std::string&, const std::string&,
const std::string&, const std::string&);
std::string getName() const;
std::string getTitle() const;
std::string getPhno() const;
std::string getRoomnro() const;
};
请注意,Object
构造函数通过引用获取4个std :: string。
然后使用此界面重写您的功能。
#include "Object.h"
using namespace std;
Object::Object(){}
Object::Object(const string& name, const string& title,
const string& phonenumber, const string& roomnumber) :
Name(name), Title(title), Phonenumber(phonenumber),
RoomNumber(roomnumber)
{}
请注意,默认构造函数为空,因为默认情况下std :: string是空的。 4参数构造函数仅接受传入的字符串并使用信息初始化成员(注意使用initialization list
。
然后我们到达您的get...
功能。原来的是错的。例如:
char Object::getName() const {
return Name[100];
}
首先,返回类型为char
,这意味着返回单个字符,而不是字符串。其次,您将返回位于Name[100]
的字符,这是不正确的。前往位置100
是一种超出界限的访问。
如果您的目标是返回数组Name
,则无法在C ++中返回类似的原始数组。但是,让我们放弃所有这些并正确地重写它,因为我们正在使用std::string
。
std::string Object::getName() const { return Name; }
对其他get...
函数进行相同的更改。
最后,您的输入需要更改。由于cin
的{{1}}在第一个空格处停止,因此需要使用std::string
进行重写,因为getline
不会停留在第一个空格字符处。
getline
这应该是您需要的大部分更改。
答案 1 :(得分:0)
这个构造函数错误,你把4个字符作为参数并将它们分配到数组之外(名称[100]的有效索引是0..99)
Object::Object(char name, char title, char phonenumber, char roomnumber){
Name[100] = name;
Title[50] = title;
Phonenumber[30] = phonenumber;
RoomNumber[15] = roomnumber;
}
如果你想保留原生数组,那么你需要将字符串复制到它们中
Object::Object(char* name, char* title, char* phonenumber, char* roomnumber)
{
strcpy(Name, name);
strcpy(Title, title);
strcpy(Phonenumber, phonenumber);
strcpy(RoomNumber, roomnumber);
}
现在上面的解决方案仍有几个问题,例如,如果你将数组声明为字符串,它就会更灵活。
与
std::string Name;
std::string Title;
std::string PhoneNumber;
std::string RoomNumber;
构造函数可能看起来像
Object::Object(char* name, char* title, char* phonenumber, char* roomnumber)
{
Name = (name != NULL)?name:"";
Title = (title != NULL)?title:"";
Phonenumber = (phonenumber!=NULL)?phonenumber:"";
RoomNumber = (roomnumber!=NULL)?roomnumber:"";
}