头文件有问题; “班级的重新定义”

时间:2019-09-16 23:21:24

标签: c++ repl.it

我正在研究课堂上的问题。这是关于创建一个“ 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
};

我得到的主要信息是:     addressType.cpp:6:7:错误:重新定义了“ addressType” 类addressType。

3 个答案:

答案 0 :(得分:1)

您需要做两件事:

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

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

通过这种方式,您只定义一次类(这是必需的,在任何单个翻译单元中都是如此),然后告诉编译器方法体属于哪个类。

答案 1 :(得分:0)

  

为什么认为我要重新宣布课程?

因为你是

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

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

答案 2 :(得分:0)

@Paul Sanders为您回答了这个问题,但只是为了向您展示他在说什么:

.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"using namespace" in c++ headers