0

This is my header file

#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

and these are my cpp files

#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;
    }
}

And this is my last cpp file

#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');
}

When the code gets to the part Enter the Kingdom name, it would prompt the user for answer, but before it prompts, it just outputs jibberish like this

https://i.stack.imgur.com/fs9DW.png

Also, when it gets to enter the number of people living in, it would also output "-842150451" before I can even type a valid number.

Any guesses to solve the problem?

lucas
  • 1
  • 3

2 Answers2

2

Your programm prints garbage because the variables (char[] and int) are not initialized. The actual behavior is undefined. To fix this, you should probably add a constructor to your class and initialize the variables.

For further reading:

Also, when you use std::cin to let users enter a kingdom name into the fixed size char array, they can easily produce a buffer overflow. This is usually not desirable. Please use std::string instead.

The use of using namespace std; is discouraged. Especially so in header files.

For further reading:

Unless you have very good reasons you should normally not be using pointers to allocate objects or arrays dynamically. If you need to allocate an array at runtime, use std::vector instead.

For further reading:

You should probably add overloads for the << and >> operators for your class. You wouldn't need to declare those members public then.

For further reading:

moooeeeep
  • 31,622
  • 22
  • 98
  • 187
0

You can do it like this. I did it quickly, so it's not perfect.

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;
    }

}