头文件出现问题; "redefinition of class"



我正在处理课堂上的一个问题。这是关于创建一个"addressType"类,并使用它来与已经写出的主函数进行交互。 该程序不起作用,我得到的主要错误是"addressType.cpp:6:7:错误:重新定义'addressType'类addressType {"。为什么它认为我在重新声明类?我想我只是对C++语法不够熟悉。我对C++真的没有经验,我是一个Java人。

这是我的 .h 文件代码示例...

#ifndef ADDRESSTYPE_H_INCLUDED
#define ADDRESSTYPE_H_INCLUDED
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
class addressType {
private:
string address;
string city;
string state;
int zipcode;
public:
addressType();
addressType(string inputAddress, string inputCity, string inputState, int inputZipcode);
void setAddress(string inputAddress);
void setCity (string inputCity);
//more functions i didn't paste
}; #endif

等等。下面是.cpp的示例:

#include "addressType.h"
#include <iostream>
using namespace std;
class addressType {
private:
string address;
string city;
string state;
int zipcode;
public
addressType() {
address = "aa";
city = "aa";
state = "XX";
zipcode = 10000;
}
addressType(string inputAddress, string inputCity, string inputState, int inputZipcode) {
address = inputAddress;
city = inputCity;
setState(inputState);
setZipcode(inputZipcode);
}
void setAddress(string inputAddress) {
address = inputAddress;
}
//more functions I didn't paste
};

我得到的主要信息是: 地址类型.cpp:6:7:错误:"地址类型"的重新定义 类地址类型。

你需要做两件事:

  • 完全摆脱.cpp文件中addressType的定义

  • 在组成类的方法前面加上addressType::,例如void addressType::setAddress(string inputAddress) {...

这样,您只定义一次类(这是任何单个翻译单元中的一项要求(,并告诉编译器方法主体属于哪个类。

为什么它认为我在重新声明类?

因为你是。

更具体地说,重新声明不是问题。重新定义是问题所在。第一个定义位于addressType.h文件中。将此文件包含在".cpp"中,然后重新定义addressType。这违反了一个定义规则。

解决方案是不要多次定义类。

@Paul桑德斯为你回答了这个问题,但只是为了告诉你他在说什么:

.h

#pragma once
#include <string>
class AddressType {
private:
std::string address;
std::string city;
std::string state;
int zipcode;
public:
AddressType();
AddressType(std::string inputAddress, std::string inputCity, std::string inputState, int inputZipcode);
};

。.cpp

#include "add.h"
using namespace std;
AddressType::AddressType()
{
address = "aa";
city = "aa";
state = "XX";
zipcode = 10000;
}
AddressType::AddressType(string inputAddress, string inputCity, string inputState, int inputZipcode)
: address(inputAddress)
, city(inputCity)
, state(inputState)
, zipcode(inputZipcode)
{
// no-op
}

也与您的问题无关,建议避免在标头中using namespace:c++ 标头中的"使用命名空间">