这是我的头文件
#ifndef KINGDOM_H_
#define KINGDOM_H_
#include <string>
using namespace std;
namespace sict{
class Kingdom {
public:
char m_name[32];
int m_population;
};
void display(Kingdom& pKingdom);
}
#endif
这些是我的cpp文件
#include <iostream>
#include <string>
#include "kingdom.h"
using namespace std;
namespace sict {
void display(Kingdom& pKingdom) {
cout << pKingdom.m_name << ", population " << pKingdom.m_population << endl;
}
}
这是我最后一个cpp文件
#include <iostream>
#include "Kingdom.h"
using namespace std;
using namespace sict;
void read(sict::Kingdom&);
int main() {
int count = 0; // the number of kingdoms in the array
Kingdom* pKingdom = nullptr;
cout << "==========\n"
<< "Input data\n"
<< "==========\n"
<< "Enter the number of Kingdoms: ";
cin >> count;
cin.ignore();
if (count < 1) return 1;
pKingdom = new Kingdom[count];
for (int i = 0; i < count; ++i) {
cout << "Kingdom #" << i + 1 << ": " << endl;
cin >> i;
cout << "Enter the name of the Kingdom: " << pKingdom[i].m_name;
cin >> pKingdom[i].m_name;
cout << "Enter the number people living in " << pKingdom[i].m_population << ": ";
cin >> pKingdom[i].m_population;
}
cout << "==========" << endl << endl;
// testing that "display(...)" works
cout << "------------------------------" << endl
<< "The 1st kingdom entered is" << endl
<< "------------------------------" << endl;
sict::display(pKingdom[0]);
cout << "------------------------------" << endl << endl;
delete[]pKingdom;
pKingdom = nullptr;
return 0;
}
// read accepts data for a Kingdom from standard input
void read(sict::Kingdom& kingdom) {
cout << "Enter the name of the Kingdom: ";
cin.get(kingdom.m_name, 32, '\n');
cin.ignore(2000, '\n');
cout << "Enter the number of people living in " << kingdom.m_name << ": ";
cin >> kingdom.m_population;
cin.ignore(2000, '\n');
}
当代码到达部分输入王国名称时,它会提示用户回答,但在提示之前,它只是输出这样的乱码
https://i.imgur.com/MSSHgvz.png
此外,当它输入居住的人数时,在输入有效数字之前,它也会输出“-842150451”。
任何可以解决问题的猜测?
答案 0 :(得分:2)
您的程序打印垃圾,因为变量(char[]
和int
)未初始化。实际行为未定义。要解决这个问题,你应该在你的类中添加一个构造函数并初始化变量。
进一步阅读:
此外,当您使用std::cin
让用户将王国名称输入固定大小的char数组时,它们很容易产生缓冲区溢出。这通常是不可取的。请改用std::string
。
不鼓励使用using namespace std;
。特别是在头文件中。
进一步阅读:
除非你有充分的理由,否则通常不应该使用指针动态分配对象或数组。如果需要在运行时分配数组,请改用std::vector
。
进一步阅读:
您应该为&lt;&lt;添加重载和&gt;&gt;适合您班级的操作员。那时你不需要公开那些成员。
进一步阅读:
答案 1 :(得分:0)
你可以这样做。我很快就做到了,所以它并不完美。
的main.cpp
#include "Kingdom.h"
int main() {
int count = 0; // the number of kingdoms in the array
sict::Kingdom* pKingdom = nullptr;
std::cout << "==========\n"
<< "Input data\n"
<< "==========\n"
<< "Enter the number of Kingdoms: ";
std::cin >> count;
std::cin.ignore();
if (count < 1) return 1;
//without read()
//pKingdom = new sict::Kingdom[count];
//for (int i = 0; i < count; ++i) {
// std::cout << "Kingdom #" << i + 1 << ": \n";
// //cin >> i;
// std::cout << "Enter the name of the Kingdom: ";
// pKingdom[i].setName();
// std::cout << "Enter the number people living in " << pKingdom[i].m_name << ": ";
// std::cin >> pKingdom[i].m_population;
//}
//std::cout << "==========\n\n";
pKingdom = new sict::Kingdom[count]();
for (int i = 1; i <= count; ++i)
{
pKingdom[i-1].read();
}
// testing that "display(...)" works
std::cout << "------------------------------\n"
<< "The 1st kingdom entered is:\n"
<< "------------------------------\n";
pKingdom[0].display();
std::cout << "------------------------------\n\n";
delete[]pKingdom;
pKingdom = nullptr;
return 0;
}
Kingdom.h
#ifndef KINGDOM_H_
#define KINGDOM_H_
#include <iostream>
#include <string>
namespace sict {
class Kingdom {
private:
std::string m_name;
int m_population;
public:
Kingdom();
void display();
void read();
const std::string& getName();
void setName(std::string name);
const int& getPopulation();
void setPopulation(int population);
};
}
#endif
Kingdom.cpp
#include "Kingdom.h"
namespace sict {
Kingdom::Kingdom()
:m_name(""),
m_population(0)
{}
void Kingdom::display() {
std::cout << "Name: " << m_name << ", population: " << m_population << "\n";
}
void Kingdom::read() {
std::cout << "\n\nEnter the name of the Kingdom: ";
std::getline(std::cin, m_name);
std::cout << "Enter the number of people living in " << m_name << ": ";
std::cin >> m_population;
std::cin.ignore();
}
const std::string& Kingdom::getName()
{
return m_name;
}
void Kingdom::setName(std::string name)
{
m_name = name;
}
const int& Kingdom::getPopulation()
{
return m_population;
}
void Kingdom::setPopulation(int population)
{
m_population = population;
}
}