Ошибка запроса классов С++: слева должен указывать на класс/структуру/объединение

Я пытаюсь реализовать класс с именем Person, который состоит из членов: name, gender и ads, где ads имеет тип класса, называемый Address, который состоит из участников street, tel и PObox. Когда я компилирую программу, я получаю сообщение об ошибке всякий раз, когда пытаюсь вызвать рекламу внутри любой из реализаций Person (хотя синтаксис должен быть правильным). Я прикрепил address.h, person.h, реализацию для Person и реализацию для Address files.

адрес.h

#include<iostream>
class Address
{
public:
    Address();
    char* getstreet();
    char* gettel();
    int getpobox();
    void setall(char *str , char *tel , int pobox);
    void print();
    /*~Address();*/

private:
    char* street;
    char* tel;
    int POBox; 
};

человек.ч

#include <iostream>
#include "address.h" // header file for the Address class
#include "gender.h" // header file for the Gender enum 
using namespace std;
class Person
{
  public:
    Person();
    Person(char *n, Gender *g, Address *ad);
    Person(const Person &f);
    void setName(char * n);
    void setAds( Address *ad); 
    char *getName();
    /*Address *getAds();*/
    /*~Person();*/
    void print();

private:
    char *name;
    Gender *gender; 
    Address *ads;
};

Реализация 2.cpp

#include<iostream>
#ifndef address_h
#define address_h
#include"address.h"
using namespace std;
//IMPLEMENTATION OF ADDRESS FUNCTIONS

Address::Address()
    {
        street = "default street";
        tel = "55555555";
        POBox = 1315425;
    }
    char* Address::getstreet()
    {
        return street;
    }
    char* Address::gettel()
    {
        return tel;
    }
    int Address::getpobox()
    {
        return POBox;
    }
    void Address::setall(char *str , char *tel2 , int pobox)
    {
    street = str;
    tel = tel2;
    POBox = pobox;
    }
    void Address::print()
    {
        cout<<"Street : "<<street<<endl;
        cout<<"Telephone : "<<tel<<endl;
        cout<<"PO box : "<<POBox<<endl;
    }

#endif

Реализация.cpp

#ifndef person_h
#define person_h
#include<string>
#include<iostream>
#include"address.h"
#include"person.h"
using namespace std;
    //IMPLEMENTATION OF PERSON FUNCTIONS
    Person::Person()
    {
        (*gender) = female;
        name = "testname";
        (*ads).setall("random adress","0503216532",95421);
    }
    Person::Person(char *n, Gender *g, Address *ad) //copy constructor
    {
        n = name;
        g = gender;
        ad->setall("cpyconstruct test","42324134",14925);
    }
    Person::Person(const Person &f)
    {
        name = f.name;
        gender = f.gender;
        ads = f.ads;
    }
    void Person:: setName(char * n)
    {
        n = "karim (TESTING SETNAME)";
    }
    void Person::setAds(Address *ad)
    {
        ads->setall("aus","04314013",14314);
    }
    char* Person::getName()
    {
        return name;
    }
    void Person:: print()
    {
        cout<<"Name : "<<name<<endl;
        if(gender == 0)
        {
        cout<<"gender : male"<<endl;
        }
        else
        cout<<"gender : female"<<endl;
        ads->setall("hello","056323453",1995);
    }

#endif

person Kareem Youssef    schedule 17.11.2014    source источник
comment
В какой строке ошибка говорит об этом?   -  person Lawrence Aiello    schedule 17.11.2014
comment
Все строчки, где я пытаюсь что-то сделать с рекламой   -  person Kareem Youssef    schedule 17.11.2014
comment
Вам действительно нужно использовать std::string! В противном случае вы должны использовать char [] или выделять с помощью new (но используйте std::string!)   -  person crashmstr    schedule 17.11.2014
comment
Где я должен выделить новые и почему? @crashmstr   -  person Kareem Youssef    schedule 17.11.2014
comment
@KareemYoussef Вы назначаете строковые литералы char *, что не очень хорошая идея. Вместо этого вы должны использовать std::string и позволить стандартной библиотеке делать тяжелую работу. В противном случае вы должны использовать или выделять с помощью new и массива символов и использовать strcpy et. др. для струн до.   -  person crashmstr    schedule 17.11.2014


Ответы (1)


ads — это неинициализированный указатель, поэтому с ним ничего нельзя сделать (скажем, с помощью оператора ->).

Решение: инициализировать с помощью new в ctor Person; или, что еще лучше, вообще не используйте указатель. Вам это не нужно.

class Person
{ 
  ...
  Address ads;
};

Person::Person()
{
    (*gender) = female;
    name = "testname";
    ads.setall("random adress","0503216532",95421);
}

...и аварийный мастер прав: когда вы заставите ads работать, у вас возникнут проблемы с памятью у участников Address. Используйте std::string, и о них тоже позаботятся.

person Topological Sort    schedule 17.11.2014