gpt4 book ai didi

c++ - 为结构字段赋值时程序崩溃

转载 作者:行者123 更新时间:2023-11-28 00:20:33 26 4
gpt4 key购买 nike

我正在学习C++,最近遇到一个问题,不知道为什么。

我想对外部用户隐藏私有(private)成员字段的详细信息,所以我只是声明一个 void* 指针作为唯一的私有(private)成员字段,然后声明类的 .cpp 源文件中的真实成员字段结构。新的这个内部隐藏类构造函数中的结构,并在类析构函数中删除它。

下面是我的测试代码:

项目A.h

#pragma once

class ItemA
{
private:
void* pFields;

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

项目A.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;
}

项目B.h

#pragma once

#include "ItemA.h"

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

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

项目B.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";

有人能告诉我这是怎么回事吗?谢谢。

附言我使用的开发环境是MSVC2013。

最佳答案

为什么你有 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 个声明。

请更改名称并编译。

希望这对您有所帮助。

关于c++ - 为结构字段赋值时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com