gpt4 book ai didi

c++ - 在对象中创建另一个对象时,对象的成员变量被覆盖

转载 作者:行者123 更新时间:2023-11-28 07:48:38 26 4
gpt4 key购买 nike

我的一门课有内存问题。当我在类的成员函数中创建对象时会出现此问题。这是关于下面的类(class)。我删除了成员函数,因为它们不是必需的:

class User
{
private:
bool locked;
bool active;

std::vector<City> * userCitys;
UserData userData;
Credentials credentials;

调用这个函数时出现的问题:

int User::addCity(CityData cityData) 
{
lockUserObject(); //Everything is fine here

City cityToAdd; //When this object is created, the memory of userCitys will get overridden
cityToAdd.activate();
userCitys->push_back(cityToAdd);
int cityID = userCitys->size() - 1;

userCitys->at(cityID).editCityData(cityData);

unlockUserObject();
return cityID;
}

首先,我在堆栈上创建了 userCitys。出于测试目的,我将它放在堆上。 userCitys 的地址被一些数据覆盖。我找不到问题。 City 只是一个基础类:

标题部分:

class City
{
private:
bool active;
Supplies supplies;
std::vector<Building> buildings;
std::vector<Company> companies;
std::vector<Share> shares;
std::vector<Troop> troops;
CityData cityData;

构造函数:

City::City()
{
active = false;
}

userCitys 怎么可能被覆盖?这一切都发生在一个线程上,所以这不是问题。我尝试了很多东西,但我无法让它工作。找到问题的最佳方法是什么?

编辑:锁定功能:

void User::lockUserObject()
{
for( int i = 0; locked ; i++)
{
crossSleep(Settings::userLockSleepInterval);

if( i >= Settings::userLockMaxTimes )
Error::addError("User lock is over userLockMaxTimes",2);
}

locked = true;
}

我在这里调用代码(测试函数):

City * addCity(User * user)
{
Location location;
location.x = 0;
location.y = 1;

CityData citydata;
citydata.location = location;
citydata.villagers = 0;
citydata.cityName = "test city";

int cityID = user->addCity(citydata); //addCity is called here
City * city = user->cityAction(cityID);;

if( city == NULL)
Error::addError("Could not create a city",2);

return city;
}

添加用户(测试代码):

User * addUser()
{
UserData test;
test.name = "testtest";
Credentials testc("testtest",3);

//Create object user
int userID = UserControle::addUser(test,testc);
User * user = UserControle::UserAction(userID);

if( user == NULL)
Error::addError("Could not create a user",2);

return user;
}

我的测试函数:

void testCode()
{
User * user = addUser();
City * city = addCity(user);
}

这个函数在main中调用:

int main()
{
testCode();
return 0;
}

这是 UserControle 中的 UserAction 和 addUser:

int UserControle::addUser(UserData userdata, Credentials credentials)
{
int insertID = -1;
for( int i = 0; i < (int)UserControle::users.size(); i++)
{
if( !UserControle::users.at(i).isActive() )
{
insertID = i;
break;
}
}

User userToInsert(userdata,credentials);

if( insertID != -1 )
{
UserControle::users.insert( UserControle::users.begin() + insertID,userToInsert);
return insertID;
}
else
{
UserControle::users.push_back(userToInsert);
return UserControle::users.size() - 1;
}
}

User* UserControle::UserAction(int userID) //check all indexes if greater then 0!
{
if( (int)UserControle::users.size() <= userID )
{
Error::addError("UserAction is out of range",3);
return NULL;
}

if( !UserControle::users.at(userID).isActive())
{
Error::addError("UserAction, the user is not active.",3);
return NULL;
}

return &UserControle::users[userID];
}

最佳答案

有几件事你可以尝试:

  • 删除代码,直到故障消失。换句话说,从您的代码中提取一个最小的示例。我想您随后会自己看到错误,否则请在此处发布那个小示例程序,其他人也会这样做。
  • 不要使用原始指针。这些问题总是谁拥有他们指向的东西。改用智能指针,例如unique_ptr (C++11) 或 auto_ptr (C++98) 专有所有权。
  • 如果你有像“userCities”这样的指针成员,你需要考虑复制那个类的实例时会发生什么(你已经写了一个合适的析构函数,或者?)。因此,要么阻止复制(将复制构造函数和赋值运算符设为私有(private)且不实现),要么以正确克隆 vector 且不在不同实例之间共享的方式实现它们。
  • 不要使用 C 风格的转换。如果这些是通过编译器获取任何内容所必需的,则代码可能已损坏。

关于c++ - 在对象中创建另一个对象时,对象的成员变量被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323742/

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