具有多个文件的小型c ++程序将无法编译

时间:2017-08-09 08:33:37

标签: c++

所以我是C ++的新手,在使用多个类和头文件时遇到了一些问题。首先,这是我的代码:

#include "stdafx.h"
#include "Person.h"
#include <string>



int main()
{
    using namespace std;
    string city1 = "lund";

    Person p1(city1);


    getchar();
    return 0;
}

地址

#pragma once
class Address
{
public:
    string city;

    Address(string const& city);
    ~Address();
};

地址 Cpp

#include "stdafx.h"
#include "Address.h"
#include <iostream>
using namespace std;

string city;

Address::Address(string const& city) : city(city)
{
        cout << "Address created" << endl;
}


Address::~Address()
{
        cout << "Address destroyed" << endl;
}

标题

#pragma once

class Person
{
public:
    Address *address;

    Person(string const& city);

    ~Person();
};

cpp

#include "stdafx.h"
#include "Address.h"
#include "Person.h"
#include <iostream>
#include <string>
using namespace std;

Address *address;

Person::Person(string const& city)
{
    address = new Address(city);
    cout << "Person created" << endl;
}

Person::~Person()
{
    delete address;
    cout << "Person destroyed" << endl;
}

现在我很失落,因为我从这段代码中得到了16个错误!

Severity    Code    Description Project Path    File    Line    Suppression State
Error   C2143   syntax error: missing ';' before '*'    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.h   6   
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.h   6   
Error   C2238   unexpected token(s) preceding ';'   cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.h   6   
Error   C2061   syntax error: identifier 'string'   cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.h   8   
Error   C2664   'Person::Person(const Person &)': cannot convert argument 1 from 'std::string' to 'const Person &'  cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\cplusplusmodule7.cpp   15  
Error   C3646   'city': unknown override specifier  cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  5   
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  5   
Error   C2061   syntax error: identifier 'string'   cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  7   
Error   C2061   syntax error: identifier 'string'   cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.h   8   
Error   C2511   'Person::Person(const std::string &)': overloaded member function not found in 'Person' cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.cpp 11  
Error   C2664   'Address::Address(const Address &)': cannot convert argument 1 from 'const std::string' to 'const Address &'    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\person.cpp 12  
Error   C3646   'city': unknown override specifier  cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  5   
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  5   
Error   C2061   syntax error: identifier 'string'   cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.h  7   
Error   C2511   'Address::Address(const std::string &)': overloaded member function not found in 'Address'  cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.cpp    8   
Error   C2550   'Address::{ctor}': constructor initializer lists are only allowed on constructor definitions    cplusplusModule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7    c:\users\station\documents\visual studio 2017\projects\cplusplusmodule7\cplusplusmodule7\address.cpp    9   

错误包括我错过了';'在地址*address之前,我不明白。到处找不到字符串,并且Person的构造函数不能用字符串调用。

1 个答案:

答案 0 :(得分:4)

您需要在Person标头中包含Address.h,否则此时编译器将不知道该类型。

或者,使用

声明Address类
class Address;

第二种方法具有更快构建的优势(特别是在较大的项目中),但这意味着您无法按值使用声明的类型。它将适用于您的情况,但仅限于您不必要地使用指针。