0

So I'm new to C++ and I have ran into some issues when using multiple classes and header files. To start off, here is my code:

Main

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



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

    Person p1(city1);


    getchar();
    return 0;
}

Address Header

#pragma once
class Address
{
public:
    string city;

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

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;
}

Person Header

#pragma once

class Person
{
public:
    Address *address;

    Person(string const& city);

    ~Person();
};

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;
}

Now I'm so lost beacuse I got 16 errors from this code!

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   

The errors include that I'm missing a ';' before Address *address which I don't understand. String isn't found everywhere and the constructor of Person isn't callable with a string.

Gherbi Hicham
  • 2,416
  • 4
  • 26
  • 41

1 Answers1

4

You need to include the Address.h in the Person header, otherwise the type will be unknown to the compiler at that point.

Alternatively, declare the Address class with

class Address;

The second approach has the advantage of faster builds (especially in larger projects), but it means that you can't use the declared type by value. It will work in your case, but only because you unnecessarily use a pointer.

Bartek Banachewicz
  • 38,596
  • 7
  • 91
  • 135
  • Shouldn't it be enough to include in the Person cpp file? The tutorials I have done has said it's not a good idea to include headers insider other headers :S – cplusplusnoob1 Aug 09 '17 at 08:38
  • 1
    @cplusplusnoob1 It's easiest to understand this by understanding the way those files are actually put together by the preprocessor, but this answer isn't the right place to explain that. And if your tutorials said that, dump them and find better ones, or even better, [a good book](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Bartek Banachewicz Aug 09 '17 at 08:40
  • The second alternative is often preferred. It's not just faster, it can resolve cyclic dependencies. In this case, there's no cyclic dependency at all. A person `has an` address, and not the other way around. – MSalters Aug 09 '17 at 09:49
  • @MSalters In this case, it exclusively owns it, so value semantics should be preferred. – Bartek Banachewicz Aug 09 '17 at 09:57