#c #class #implementation
#c #класс #реализация
Вопрос:
Я пишу программу, которая предназначена для получения пользовательского ввода для класса — Страны — и cout самая большая страна по площади, а также самая густонаселенная страна. Однако у меня есть файл реализации.
Что должно входить в мой конструктор по умолчанию? Как насчет других конструкторов? Это то, что у меня есть до сих пор:
#ifndef COUNTRY_H
#define COUNTRY_H
#include <string>
class Country
{
public:
Country(string name, double area, int population);
Country();
string get_name () const;
double get_area()const;
int get_population()const;
double population_density(Country popDensity) const;
void largest_area(double a);
void largest_population(int p);
void most_dense(double d);
private:
string name;
double area;
int population;
};
#endif
и:
#include <iostream>
#include <string>
using namespace std;
#include "COUNTRY_H"
Country :: Country(string name, double area, int population)
{
}
Country :: Country();
{
}
Ответ №1:
В этом случае (и в большинстве случаев) вы только инициализируете элементы и хотите использовать список инициализаторов.
Country: Country(string _name, double _area, int _population): name(_name),area(_area),population(_population)
{}
Чтобы улучшить читаемость для новых программистов, я изменил имена аргументов так, чтобы они не совпадали точно с именами переменных-членов. Компилятор не будет сбит с толку идентичными именами аргументов и членов в списке инициализаторов.
Ваш конструктор по умолчанию может иметь список инициализаторов только со значениями по умолчанию, например name("Transylvania"),area(5),population(42)
, но если трудно придумать значимые значения по умолчанию, допустимо оставить конструктор по умолчанию неопределенным, чтобы класс требовал значений для построения.
Ответ №2:
Здесь много чего не так.
- ваша реализация включает файл с именем
COUNTRY_H
, я бы предположил, что включение должно быть#include "Country.h"
- никогда
using namespace
не ставьте предложение перед любым оператором include, это может привести к действительно уродливым ошибкам - ваш конструктор принимает свой строковый параметр по значению, но он должен принимать его по
constamp;
(то есть по ссылке на const)
Для ctor по умолчанию: он должен установить для каждого члена класса значение разумного значения по умолчанию. Если вы пропустите это, будет сгенерирован конструктор по умолчанию, и каждый элемент будет сконструирован по умолчанию, помните, что примитивные типы (например, int, long) изначально имеют неопределенное состояние. Также помните, что определение любого конструктора предотвратит создание конструктора по умолчанию. Используйте списки инициализаторов для инициализации членов вашего класса, не делайте этого в теле конструктора.