#c
#c
Вопрос:
Почему gcc не может успешно скомпилировать один из приведенных ниже кодов? Может ли конструктор быть определен вне класса?
#include <string>
using std::string;
class Person{
public:
Person(const string amp;a, const string amp;b);
private:
string name, address;
};
Person::Person(const string amp;a, const string amp;b){
name(a);
address(b);
}
Спасибо!
Ответ №1:
Потому что ни name
ни address
не могут быть вызваны. Вы, вероятно, имели в виду поместить их в список инициализаторов элементов.
Person::Person(const string amp;a, const string amp;b)
: name(a), address(b)
{
}
Ответ №2:
Ваш синтаксис неправильный:
Person::Person(const string amp;a, const string amp;b) : name(a), address(b) {}
Ответ №3:
Вы просто написали это неправильно. Это должно быть:
Person::Person(const string amp;a, const string amp;b) : name(a), address(b) { }
В принципе, и в значительной степени на практике, вы можете и должны определять функции-члены вне определения класса, чтобы отделить базу кода и сократить время компиляции.
Ответ №4:
Это называется разделением реализации и объявления. На самом деле хорошей идеей является сохранение ваших реализаций отдельно, в cc
или cpp
файле.
Таким образом, в вашем заголовке:
//Person.h
#ifndef PERSON_H // <---- include header guards in your headers
#define PERSON_H
#include <string>
//using std::string; <--- you should remove this line, you don't want to import namespaces
// in your header file, or else they are imported in all
// files including this header
class Person{
public:
Person(const std::string amp;a, const std::string amp;b);
private:
std::string name, address; // qualify your names in the header
};
#endif
и ваш файл реализации:
//Person.cpp
#include "Person.h"
using namespace std; // <---- if you wish, import the std namespace in your global namespace
// in the implementation file
Person::Person(const string amp;a, const string amp;b):
name(a), // <---- correct syntax of initializer lists
address(b)
{
}