Сбой программы при назначении значения полю структуры

0

Я изучаю C++, недавно я столкнулся с проблемой и не знаю почему.

Я хочу скрыть данные полей частных членов от внешних пользователей, поэтому я просто объявляю указатель void * как единственное поле частного члена, а затем объявляю структуру полей реальных членов в исходном файле исходного кода.cpp. новую эту внутреннюю скрытую структуру в конструкторе класса и удалить ее в деструкторе класса.

Ниже приведены мои тестовые коды:

ItemA.h

#pragma once

class ItemA
{
private:
    void* pFields;

public:
    ItemA();
    ~ItemA();
};

ItemA.cpp

#include "ItemA.h"
#include <string>

using namespace std;

typedef struct
{
    int    intField;
    string strField;
} HFIELDS, *PHFIELDS;

ItemA::ItemA()
{
    this->pFields = new HFIELDS;
    PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
    pHFIELDS->intField = 100;
    pHFIELDS->strField = "100";
}

ItemA::~ItemA()
{
    PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
    delete pHFIELDS;
}

ItemB.h

#pragma once

#include "ItemA.h"

class ItemB
{
private:
    void* pFields;
    ItemB();

public:
    ItemB(ItemA &itemA);
    ~ItemB();
};

ItemB.cpp

#include "ItemB.h"
#include <string>

using namespace std;

typedef struct
{
    ItemA* pItemA;
    int    intField;
    string strField;
} HFIELDS, *PHFIELDS;

ItemB::ItemB(ItemA &itemA)
{
    this->pFields = new HFIELDS;
    PHFIELDS pHFIELDS = (PHFIELDS)(this->pFields);
    pHFIELDS->pItemA = &itemA;
    pHFIELDS->intField = 200;
    pHFIELDS->strField = "200";
}


ItemB::~ItemB()
{
    PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
    delete pHFIELDS;
}

main.cpp

#include <tchar.h>
#include "ItemA.h"
#include "ItemB.h"

int _tmain(int argc, _TCHAR* argv[])
{
    ItemA* pItemA = new ItemA();
    ItemB* pItemB = new ItemB(*pItemA);
    delete pItemB;
    delete pItemA;

    return 0;
}

Когда выполнение программы перешло к конструктору ItemB, эта строка разбилась:

pHFIELDS-> strField = "200";

Может ли кто-нибудь сказать мне, что с этим не так? Спасибо.

PS Я использую среду разработки MSVC2013.

  • 0
    Зачем вам использовать пустой указатель для этого? Вы можете прочитать об идиоме pimpl: stackoverflow.com/questions/60570/…
  • 0
    Спасибо за обмен знаниями RN, я буду его изучать.
Показать ещё 3 комментария
Теги:
visual-c++

1 ответ

3
Лучший ответ

почему у вас есть 2 заявления HFIELDS и * PHFIELDS

1) В ItemA.cpp

typedef struct
{
    int    intField;
    string strField;
} HFIELDS, *PHFIELDS;

2) В ItemB.cpp

typedef struct
{
    ItemA* pItemA;
    int    intField;
    string strField;
} HFIELDS, *PHFIELDS;

Что происходит, ItemA.h включен в ItemB, поэтому компилятор видит 2 объявления.

Пожалуйста, измените имя и скомпилируйте.

Надеюсь это поможет.

  • 0
    Спасибо, Ганеш, твой ответ мне помогает. Но возникает другой вопрос, два объявления структуры находятся в отдельных файлах cpp. Если это проблема переопределения, почему компилятор не выдал мне ошибку или предупреждение?
  • 0
    отдельно этот код работал бы для вас. когда компилятор смотрит на одно и то же имя переменной, представляющее две разные вещи, он не сможет разрешить.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню