我正在处理课堂上的一个问题。这是关于创建一个"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++ 标头中的"使用命名空间">