【发布时间】:2017-07-24 15:59:39
【问题描述】:
我已在代码的注释行中为编译器突出显示的行添加了错误。
头文件:
#ifndef ADDRESS_H_EXISTS
#define ADDRESS_H_EXISTS
#include <iostream>
#include <string>
using namespace std;
class Address{
private:
string address1;
string address2;
string city;
string state;
string zipCode;
public:
Address(){} //note: 'Address::Address()' previously defined here|
Address(
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
){}
注意:#endif 存在于头文件的末尾
源文件:
#include <iostream>
#include <string>
#include "address.h"
using namespace std;
Address::Address(){} // error: redefinition of 'Address::Address()'
Address::Address( // error: redefinition of 'Address::Address(const string&,
// const string&, const string&, const string&, const string&)'|
const string &address1,
const string &address2,
const string &city,
const string &state,
const string &zipCode
):
address1(address1),
address2(address2),
city(city),
state(state),
zipCode(zipCode)
{
Address::address1 = address1_c;
Address::address2 = address2_c;
Address::city = city_c;
Address::state = state_c;
Address::zipCode = zip_c;
}
关于此错误的所有最流行的问题都得出结论,需要标头保护,尽管此代码中已经包含了保护。 我以为我误解了如何正确分离头文件和源文件之间的初始化列表,但是当我评论它时它仍然产生相同的错误。
【问题讨论】:
-
Address(){}定义了一个空的默认构造函数。声明(在单独的 .cpp 文件中实现)看起来像Address(); -
啊,这有帮助。谢谢。我想接受这个作为答案,但它没有显示复选标记。
-
在一个切题上,有一个用于重新表示街道地址的类的默认构造函数是可疑的。可以说默认指针为空,默认数字为零,默认字符串为空。好的设计选择与否,这些都是可以理解的。但是默认地址是什么?
-
另一件事是
using namespace std。不要,尤其是在头文件中。
标签: c++ class header-files