在对象中创建另一个对象时,对象的成员变量将被重写
Member variables of a object get overridden when creating another object in the object
我有一个类的内存问题。当我在类的成员函数中创建对象时,就会出现这个问题。它是关于下面的类。我删除了成员函数,因为它们不是必需的:
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;
}
首先,我在堆栈上创建usercity。出于测试目的,我把它放在堆上。usercity的地址被一些数据覆盖。我找不到问题所在。the 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;
}
usercity怎么可能被重写?这一切都发生在一个线程上,所以这不会是一个问题。我试了很多方法,但就是行不通。找到问题的最佳方法是什么?
编辑:锁功能:
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;
}
下面是usercontrol中的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"这样的指针成员,你需要考虑在复制该类的实例时会发生什么(你已经写了一个适当的析构函数,或者?)因此,要么防止复制(将复制构造函数和赋值操作符设置为私有而不实现),要么以适当克隆向量的方式实现它们,而不是在不同的实例之间共享。
- 不要使用c风格的强制转换。如果这些都是通过编译器所必需的,那么代码可能被破坏了。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 将私有对象变量与用户输入的变量进行比较
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何对对象数组进行排序,而不考虑对象变量类型
- 在功能中设置对象变量
- 如何创建对象变量,以便每次分配新的指针
- C++ FileIO 以读取和写入对象变量
- 私下声明的对象变量的突变器/访问器方法
- C++ 列表中的对象变量在迭代过程中不会更新
- 稍后使用私有对象变量时如何初始化数组(初始化对象后)
- 通过向量更改对象变量的值
- C 全局对象变量内存释放
- 基本数据类型变量 VS 对象变量
- C 复制分配运算符,用于参考对象变量
- c++从列表中移除元素,并将其分配给对象变量
- 我们是否需要在C++中同步局部对象变量
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- 无法访问在 std 回调中传递的对象变量